1072

コンソールアプリケーションでアプリケーションのパスを見つけるにはどうすればよいですか?

Windowsフォームでは、現在のパスを見つけるために使用できますApplication.StartupPathが、これはコンソールアプリケーションでは利用できないようです。

4

28 に答える 28

1294

System.Reflection.Assembly.GetExecutingAssembly()1Location

System.IO.Path.GetDirectoryNameディレクトリだけが必要な場合は、それを組み合わせてください。

1 Mindor氏のコメント
System.Reflection.Assembly.GetExecutingAssembly().Locationによると、実行中のアセンブリが現在配置されている場所を返します。実行されていないときにアセンブリが配置されている場所である場合とそうでない場合があります。シャドウコピーアセンブリの場合、一時ディレクトリにパスを取得します。System.Reflection.Assembly.GetExecutingAssembly().CodeBaseアセンブリの「永続的な」パスを返します。

于 2009-05-07T23:09:06.277 に答える
448

次のコードを使用して、現在のアプリケーション ディレクトリを取得できます。

AppDomain.CurrentDomain.BaseDirectory
于 2009-05-08T19:03:47.270 に答える
204

アプリケーションのディレクトリを見つけるには2つのオプションがあり、どちらを選択するかは目的によって異なります。

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);
于 2011-10-14T18:27:47.700 に答える
90

おそらく少し遅れますが、これは言及する価値があります:

Environment.GetCommandLineArgs()[0];

または、より正確には、ディレクトリパスだけを取得します。

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

編集:

GetCommandLineArgsかなりの数の人々が、プログラム名を返すことが保証されていないことを指摘しています。コマンドラインの最初の単語は、慣例によりのみプログラム名です。を参照してください。この記事には、「この癖を使用しているWindowsプログラムはごくわずかですが(私自身は気づいていません)」と記載されています。したがって、「なりすまし」は可能ですがGetCommandLineArgs、コンソールアプリケーションについて話しています。コンソールアプリは通常、迅速で汚れています。したがって、これは私のKISSの原則と一致します。

于 2011-05-21T13:27:27.373 に答える
51

asp.netWebアプリに興味のある人のために。これが3つの異なる方法の私の結果です

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

結果

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

アプリは「C:\ inetpub \ SBSPortal_staging」から物理的に実行されているため、最初のソリューションはWebアプリには絶対に適していません。

于 2011-10-06T19:42:16.337 に答える
47

上記の答えは私が必要としていたものの 90% でしたが、通常のパスではなく Uri を返しました。

MSDN フォーラムの投稿で説明されているように、URI パスを通常のファイルパスに変換する方法は? 、私は以下を使用しました:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;
于 2012-04-13T20:20:44.323 に答える
32

あなたはこれをしようとしているかもしれません:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
于 2009-05-07T23:10:02.687 に答える
32

.NET Core と互換性のある方法を探している場合は、

System.AppContext.BaseDirectory

これは、.NET Framework 4.6 および .NET Core 1.0 (および .NET Standard 1.3) で導入されました。参照: AppContext.BaseDirectory プロパティ

このページによると、

これは、.NET Core の AppDomain.CurrentDomain.BaseDirectory の推奨される代替です。

于 2018-02-02T02:14:02.597 に答える
24

代わりにこれを使用できます。

System.Environment.CurrentDirectory
于 2012-11-15T20:06:43.180 に答える
21

コンソール アプリケーションの場合、これを試すことができます。

System.IO.Directory.GetCurrentDirectory();

出力 (ローカル マシン上):

c:\users\xxxxxxx\documents\visual studio 2012\Projects\ImageHandler\GetDir\bin\Debug

または、試すこともできます (最後に追加のバックスラッシュがあります):

AppDomain.CurrentDomain.BaseDirectory

出力:

c:\users\xxxxxxx\documents\visual studio 2012\Projects\ImageHandler\GetDir\bin\Debug\

于 2014-06-18T21:34:34.553 に答える
8

利用した

System.AppDomain.CurrentDomain.BaseDirectory

アプリケーションフォルダーへの相対パスを見つけたいとき。これは、ASP.Net と winform アプリケーションの両方で機能します。また、System.Web アセンブリへの参照も必要ありません。

于 2014-04-07T16:57:01.990 に答える
7

つまり、ap/invoke メソッドを使用しないのはなぜですか?

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    public class AppInfo
    {
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
            private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
            private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
            public static string StartupPath
            {
                get
                {
                    StringBuilder stringBuilder = new StringBuilder(260);
                    GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
                    return Path.GetDirectoryName(stringBuilder.ToString());
                }
            }
    }

Application.StartupPath と同じように使用します。

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
于 2014-07-24T20:56:42.093 に答える
6

exeをダブルクリックして呼び出す必要がある場合は、これを使用します

var thisPath = System.IO.Directory.GetCurrentDirectory();
于 2013-02-15T18:19:39.760 に答える
6

VB.netで

My.Application.Info.DirectoryPath

私にとってはうまくいきます(アプリケーションの種類:クラスライブラリ)。C#についてはわかりません...ファイル名なしのパスを文字列として返します

于 2015-04-12T12:08:30.987 に答える
6

Assembly.GetEntryAssembly().LocationまたAssembly.GetExecutingAssembly().Location

System.IO.Path.GetDirectoryName()ディレクトリのみを取得するには、 と組み合わせて使用​​します。

ほとんどの場合、ディレクトリは同じですが、 と からのパスは異なる場合がありGetEntryAssembly()ます。GetExecutingAssembly()

エントリモジュールが管理されていない場合 (つまり、C++ または VB6 実行可能ファイル) GetEntryAssembly()、これが返される可能性があることに注意する必要があります。nullそのような場合GetModuleFileName、Win32 API から使用できます。

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
于 2012-03-29T12:41:00.607 に答える
5
AppDomain.CurrentDomain.BaseDirectory

インストール パッケージでサード パーティの参照ファイルを参照するように問題を解決します。

于 2014-07-14T06:43:49.480 に答える
-1

これは、 32 ビットおよび64 ビットアプリケーションで動作する信頼性の高いソリューションです。

次の参照を追加します。

System.Diagnostics を使用します。

System.Management を使用します。

このメソッドをプロジェクトに追加します。

public static string GetProcessPath(int processId)
{
    string MethodResult = "";
    try
    {
        string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

        using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
        {
            using (ManagementObjectCollection moc = mos.Get())
            {
                string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();

                MethodResult = ExecutablePath;

            }

        }

    }
    catch //(Exception ex)
    {
        //ex.HandleException();
    }
    return MethodResult;
}

次のように使用します。

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

プロセスの ID がわかっている場合、このメソッドは対応する ExecutePath を返すことに注意してください。

さらに、興味のある人のために:

Process.GetProcesses() 

...現在実行中のすべてのプロセスの配列を提供し、...

Process.GetCurrentProcess()

...現在のプロセスとその情報 (ID など) および制限された制御 (Kill など) を提供します。*

于 2016-03-09T10:35:58.967 に答える
-6

ソリューション エクスプローラーを使用して、プロジェクト内にリソースとしてフォルダー名を作成し、リソース内にファイルを貼り付けることができます。

private void Form1_Load(object sender, EventArgs e) {
    string appName = Environment.CurrentDirectory;
    int l = appName.Length;
    int h = appName.LastIndexOf("bin");
    string ll = appName.Remove(h);                
    string g = ll + "Resources\\sample.txt";
    System.Diagnostics.Process.Start(g);
}
于 2012-05-28T11:36:12.690 に答える