アプリケーションフォルダパスを取得する最良の方法


515

アプリケーションフォルダーのパスを取得する方法はいくつかあります。

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

状況に応じて最適な方法は何ですか?


9
アプリケーションのパスを取得する方法がたくさんあるのはなぜですか。それぞれに理由があると思います。
Leo Vo

1
#6にエラーがあります。次をお読みください:System.Reflection.Assembly.GetExecutingAssembly()。GetName()。CodeBase)、System.IO.Path.GetDirectoryName(Application.ExecutablePath)
BillW

2
#6のうわさ、私はWebプロジェクトにいる間、本質的にWeb固有ではないIoCロードライブラリにServer.MapPathロジックを必要としませんでした
bkwdesign

これでIHostEnvironment.ContentRootPath、注入されたIHostEnvironment依存関係(他の有用なものを含む)を介してアクセスされる信頼性の高いが得られました。
Timo

回答:


519

AppDomain.CurrentDomain.BaseDirectory おそらく、アプリケーションのインストールディレクトリに相対的な場所にあるファイルにアクセスするのに最も便利です。

ASP.NETアプリケーションでは、これはbinサブフォルダーではなく、アプリケーションのルートディレクトリになります。クライアントアプリケーションでは、メインの実行可能ファイルを含むディレクトリになります。

VSTO 2005アプリケーションでは、これはアプリケーションのVSTOマネージアセンブリを含むディレクトリであり、Excel実行可能ファイルへのパスではありません。

その他は、環境に応じて異なるディレクトリを返す場合があります-たとえば、@ Vimvq1987の回答を参照してください。

CodeBaseファイルが見つかった場所で、http://で始まるURLを指定できます。その場合Locationは、おそらくアセンブリのダウンロードキャッシュになります。CodeBaseがGACのアセンブリに設定されることは保証されていません。


2
Windows XP 32ビットでテストすると、ショートカットが開始した場所に戻ります。
Joshua Son

1
1 @JoeとするためにVSTOドキュメントレベルのアドイン参照THISを

3
これは、最後にバックスラッシュを含むパスを返すことに注意してください。これにより、結果をプロセス文字列として渡す文字列をフォーマットするときに問題が発生しました。
アベンモア2015年

19
@avenmore-パスを構築するために文字列をフォーマットする場合は、Path.Combine代わりに使用することを検討してください。これにより、末尾のバックスラッシュが処理されます。
Joe

1
これは、VS 2017ではルートディレクトリではなく、bin / debugフォルダーを返します。
SmoveBB 2019

86
  1. Application.StartupPathおよび7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Windowsフォームアプリケーションでのみ機能する

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"あなたが実行しているページがある場所です:

  3. AppDomain.CurrentDomain.BaseDirectoryWebアプリケーションの場合、便利な場合があり、"C:\\hg\\Services\\Services\\Services.Website\\"ベースディレクトリで非常に便利なものを返します。

  4. System.IO.Directory.GetCurrentDirectory() および5。 Environment.CurrentDirectory

プロセスが起動された場所の場所を取得します-したがって、次のようなVisual Studioからデバッグモードで実行されているWebアプリの場合 "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

.dllコードが実行されている場所を取得します。"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

たとえば、コンソールアプリの場合、ポイント2〜6は.exe ファイルがあるディレクトリになります。

これにより時間を節約できることを願っています。


2
とにかく「現在のフォルダー」を必要とすることは、Web以外のアプリにのみ関係します...
Nyerguds

2
これが答えです。
P.Brian.Mackey

59

これらのメソッドのすべてが同じ値を返すわけではないことに注意してください。場合によっては、同じ値を返すことがありますが、目的が異なるので注意してください。

Application.StartupPath

StartupPathパラメータを返します(アプリケーションの実行時に設定できます)

System.IO.Directory.GetCurrentDirectory()

現在のディレクトリを返します。現在のディレクトリは、アプリケーションが配置されているフォルダである場合とそうでない場合があります。同じことがについても言えEnvironment.CurrentDirectoryます。これをDLLファイルで使用している場合、プロセスが実行されている場所のパスが返されます(これはASP.NETで特に当てはまります)。


7
GetCurrentDirectory()別のパスから物事を実行することの愛のために、使用しないでください!:(
kayleeFrye_onDeck 2018年

@kayleeFrye_onDeckあなたは前の質問の理由を入れていません。
n'19年

10

Webアプリケーションの場合、現在のWebアプリケーションのルートディレクトリを取得するには、通常、現在の着信要求のWebページを呼び出します。

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

上記のコードの説明


6

実際にログインしているユーザーからのセッションで、Win32 APIを介してWindowsサービスからプロセスを開始しました(タスクマネージャーセッション1では0ではありません)。これで、どの変数が最適であるかを知ることができました。

上記の質問の7つのケースすべてについて、結果は次のとおりです。

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

ケースに最適な変数を検索するときに、同じことを行う一部のユーザーにとって役立つ場合があります。


4
非常に適切な答え。「作業ディレクトリ」!=「プログラムディレクトリ」を忘れてしまう人がたくさんいます。
Nyerguds

3

私の経験では、最良の方法はこれらの組み合わせです。

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase あなたにbinフォルダを与えます
  2. Directory.GetCurrentDirectory() .Net Coreでは正常に機能しますが、.Netでは機能しません。プロジェクトのルートディレクトリが表示されます。
  3. System.AppContext.BaseDirectoryおよびAppDomain.CurrentDomain.BaseDirectory .Netコアでは問題なく動作しますが、プロジェクトのルートディレクトリが表示されます。

target.Netおよび.Netコアをターゲットとするクラスライブラリで、ライブラリをホストしているフレームワークを確認し、どちらか一方を選択します。


2

私はこれをうまく使いました

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

linqpad内でも機能します。


1
これにはGetCurrentProcessの開始ブラケットがありません。ところで、それはdotnet.exeが配置されている場所であるVisual Studioでのデバッグ中に、私の.netコアプロジェクトのC:\ Program Files \ dotnetに評価されます
t0b4cc0

1

ルートディレクトリ:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
これは、現在の作業ディレクトリを取得しているように見えますが、場合によっては役立つことがありますが、EXEパスであるとは限りません。
krowe2

0

ルートディレクトリを取得することがわかっている場合:

string rootPath = Path.GetPathRoot(Application.StartupPath)

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