AppDomain.CurrentDomain.BaseDirectoryまたはSystem.Environment.CurrentDirectoryを使用する必要がありますか?


86

同じフォルダに2つのexeファイルがあります。exe1のボタンからexe2を実行できます。今日、リモート(ターミナルサービス)セッションで顧客を監視していて、exe2が「ファイルが見つかりません」エラーを実行できませんでしたが、チェックしたときにexe1は同じディレクトリにありました。では、AppDomain.CurrentDomain.BaseDirectoryまたはSystem.Environment.CurrentDirectoryを使用する必要がありますか?

ありがとう


@Jade Mターミナルでexe1をどのように実行していますか?
ソニアさん2016

驚いたことに、string.GetFullPath(path)ではEnvironment.CurrentDirectoryなく使用すると言って、2セントを追加したいと思いCurrentDomain.BaseDirectoryます。
JBSnorro 2017

回答:


186

アプリケーションと同じディレクトリにあるファイルを検索する場合AppDomain.CurrentDomain.BaseDirectoryは、が正しい選択です。

Environment.CurrentDirectoryは、アプリケーションの実行中に変化する可能性があり、変化する値です。たとえば、デフォルトのパラメータを使用すると、WinFormsのOpenFileDialogは、この値をファイルが選択されたディレクトリに変更します。


button1を使用してOpenFileDialogを表示し、次にbutton2を使用してEnvironment.CurrentDirectoryを表示しましたが、それでもデバッグフォルダーを表示しました。なぜですか?
レイヤン2016年

18

AppDomain.CurrentDomain.BaseDirectory現在のアプリケーションドメインがロードされたディレクトリを返します。
System.Environment.CurrentDirectory現在のシステムディレクトリを返します。
あなたの場合AppDomain.CurrentDomain.BaseDirectoryは最良の解決策です。


1
明確にするために、System.Environment.CurrentDirectoryは、現在の(プロセス固有の)作業ディレクトリを返します。
Oskar Berggren

14

を使用する必要がありますAppDomain.CurrentDomain.BaseDirectory

たとえば、Windowsサービスアプリケーションの場合:

System.Environment.CurrentDirectoryC:\ Windows \ system32を返します

一方

AppDomain.CurrentDomain.BaseDirectory [Application.exeの場所]を返します

注意すべきもう1つの重要な要素AppDomain.CurrentDomain.BaseDirectoryは、読み取り専用プロパティEnvironment.CurrentDirectoryですが、必要に応じて他のプロパティにすることもできます。

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   

6

私が理解しているように、を使用する必要がありますBaseDirectoryCurrentDirectoryプログラムの実行中に変更される可能性があります。


3

Visual Studio 2010テストプロジェクトで、[テスト設定の編集]の展開オプションを有効にすると、AppDomain.CurrentDomain.BaseDirectoryはTestResults \ Outフォルダー(bin \ debugではない)を指します。ただし、デフォルト設定はbin \ debugフォルダーを指します。

ここで私は説得力のある答えを見つけました。

AppDomain.CurrentDomain.BaseDirectoryにasp.netアプリの「bin」が含まれていないのはなぜですか?


2

私は通常次のようなものを使用します:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");

2

私も使っていたので、この数日前を過ごしました

Environment.CurrentDirectory

本番サーバーで問題が発生していましたが、ローカルサーバーでは正常に機能していたため、

だから、私は

System.AppDomain.CurrentDomain.BaseDirectory;

そして、それは両方の環境で私のために働きました。

だから、彼ら全員が言ったように、私たちは常に一緒に行くべきです

System.AppDomain.CurrentDomain.BaseDirectory;

現在のドメインディレクトリでパスを確認します。

詳細情報をご覧ください

サーバーでパスエラーの一部が見つかりませんでした

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