291

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

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

何か案は?

4

13 に答える 13

420

特にショートカットを使用してプログラムを実行する場合は、現在のディレクトリが実行フォルダと異なる可能性があるため、この場合は使用しないでください。Directory.GetCurrentDirectory()

目的に合わせて使用​​することPath.GetDirectoryName(Assembly.GetExecutingAssembly().Location);をお勧めします。これは、現在実行中のアセンブリが存在するパス名を返します。

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

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

十分かもしれません。これは次のようになります

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
于 2013-03-27T07:47:05.550 に答える
189
System.AppDomain.CurrentDomain.BaseDirectory

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

于 2014-05-07T09:22:19.427 に答える
55

次のコードを使用して、単純なコンソールアプリケーションを作成しました。

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

事実上まったく同じことを行う5つの異なる方法がある理由を説明するために、いくつかのコカマミの理由があるはずですが、それが何であるかは確かにわかりません。それにもかかわらず、ほとんどの状況下では、好きなものを自由に選択できるように見えます。

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

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

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

于 2015-09-01T19:19:32.243 に答える
27

これを試して:

System.Environment.CurrentDirectory

于 2013-03-27T07:47:44.233 に答える
23
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

からPath.GetDirectoryName

指定されたパス文字列のディレクトリ情報を返します。

からApplication.ExecutablePath

アプリケーションを開始した実行可能ファイルのパス(実行可能ファイル名を含む)を取得します。

于 2013-03-27T07:48:23.740 に答える
22

これを使って、

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

これも使用できます。

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
于 2013-03-27T07:47:32.880 に答える
14

.NETCOREで使用する場合System.AppContext.BaseDirectory

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

于 2018-11-17T20:32:48.613 に答える
6

1.1。

Directory.GetCurrentDirectory();

2.2。

Thread.GetDomain().BaseDirectory

3.3。

Environment.CurrentDirectory
于 2013-03-27T07:50:02.710 に答える
1

これは、特にdotnetコアの単一ファイルの公開を使用する場合に最適です。 Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

于 2020-04-17T12:14:47.530 に答える
0

Application.StartupPath最良の結果を得るには、imoを使用します。

于 2018-04-04T18:43:47.427 に答える
0

exeパスが必要な場合は、System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

于 2019-01-16T21:00:21.487 に答える
0

このコードブロックは、文字列タイプでアプリディレクトリのパスを作成します

string path="";
path=System.AppContext.BaseDirectory;

幸運を

于 2020-08-07T10:22:58.377 に答える
-1

これは私のために働いたものです:

 var currentDir = Directory.GetCurrentDirectory().Substring(0, Directory.GetCurrentDirectory().LastIndexOf("bin"));
于 2022-03-01T20:11:50.147 に答える