現在のフォルダーパスを取得する


222

ファイルを変換するプログラムを作りたい。ユーザーが実行可能ファイルを任意のディレクトリに配置できるようにして、そのプログラムを実行するとき(.exeをダブルクリック)、プログラムがexeファイルが存在する現在のフォルダー内のすべてのファイルを処理するようにします。プログラムはどのようにして現在実行中のパスを判別できますか?

私は試しましたSystem.Windows.Forms.Application.StartupPathが、それは間違った方法のようです。

何か案は?

回答:


334

あなたはすべきではない使用しDirectory.GetCurrentDirectory()、現在のディレクトリを使用すると、ショートカットを介して、プログラムを実行する場合は特に、実行フォルダと異なる場合がありますように、あなたのケースで。

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);あなたの目的のために使用することをお勧めします。現在実行中のアセンブリが存在するパス名を返します。

私の提案するアプローチでは、SonerGönülが回答で述べたように、実行中のアセンブリ、エントリアセンブリ、またはその他のロードされたアセンブリを区別できます。

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

また十分かもしれません。これは

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly()とGetExecutingAssembly()には興味深い違いがあります。詳細については、stackoverflow.com
18562036/30289

3
私が言ったように:これは、現在実行中のアセンブリが存在するパス名を返します。違いGetEntryAssemblyとは、GetExecutingAssembly驚きのあまりとして付属していませんが、関数名でも明らかです。同じことをした場合、なぜ2つの関数が必要なのでしょうか。:-)
Thorsten Dittmar 2013年

2
+1 Assembly.GetEntryAssembly()は、clickonceを介してアプリケーションを実行する場合に役立ちました
Artiom

9
これはSystem.ReflectionにあるのでSystem.Reflection.Assembly.GetExecutingAssembly().Location、完全です
Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

これにより、アプリケーションの実行ディレクトリが提供されます。これはWebアプリケーションでも機能します。その後、ファイルにアクセスできます。


9
これは、この目的で使用する最も正確なプロパティです。現在のドメインのBaseDirectoryは、AppDomainが動的に作成されて別の場所からアセンブリを探す場合でも、常に正しい場所を指します。
dhruvin 2015

完璧です。これは、どのアプリケーションでも独立して機能します。特に、Streamreaderを使用している場合は、アプリケーションタイプに応じて異なる絶対パスを読み取ることができます。
user3326078

40

次のコードで簡単なコンソールアプリケーションを作成しました。

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

結果の実行可能ファイルをにコピーしましたC:\temp2。次に、その実行可能ファイルへのショートカットをに配置して実行しC:\temp3ました(exe自体から1回、ショートカットから1回)。どちらの場合も次の出力が得られました。

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

私は必ず存在しなければならないんだもののいくつかある理由を説明するcockamamie理由5種類の方法、事実上まったく同じことを行う、私は確かにそれが何であるかを知りません。それにもかかわらず、ほとんどの状況では、好きな方を自由に選択できるように見えます。

更新: ショートカットのプロパティを変更し、「開始:」フィールドをに変更しましたC:\temp3。これにより、次の出力が得られました。

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

...これは、異なる方法間の少なくともいくつかの違いを示しています。


2
どうもありがとうございました。
baj9032 2017

重要なメモ。作業ディレクトリは、インストールされているディレクトリと常に同じになるとは限りません。
ヨルダン



19

これを使って、

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

これも使えます。

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

以下のための.NET CORE使用System.AppContext.BaseDirectory

(の代わりとしてAppDomain.CurrentDomain.BaseDirectory


6

1。

Directory.GetCurrentDirectory();

2。

Thread.GetDomain().BaseDirectory

3。

Environment.CurrentDirectory

Environment.CurrentDirectoryいくつかの方法で変更できます...(ショットカット設定など)
Yousha Aleayoub



0

これは、特にdotnetコアシングルファイルパブリッシュを使用するときに、私にとって最も効果的に機能します。 Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.