背景
開発環境で作成したバッチプロジェクトを他環境で動かした際に、カレントディレクトリの取得方法に問題がありうまく動かなかったため、カレントディレクトリの取得メソッドの検証してみる。
検証コード
以下のような簡易的なバッチの作成
logger.Info(System.AppDomain.CurrentDomain.BaseDirectory);
logger.Info(Directory.GetCurrentDirectory());
logger.Info(Directory.GetParent(Assembly.GetExecutingAssembly().Location));
logger.Info(Environment.CurrentDirectory);
logger.Info(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(Environment.GetCommandLineArgs()[0])));
logger.Info(System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName));
検証方法
・タスクスケジューラで作成した簡易バッチの実行
検証結果
2022-07-13 12:31:59.2765 [INFO] C:\00_hata\PlayGound\Dirtest\bin\x86\Debug\
2022-07-13 12:31:59.2921 [INFO] C:\WINDOWS\system32
2022-07-13 12:31:59.3154 [INFO] C:\00_hata\PlayGound\Dirtest\bin\x86\Debug
2022-07-13 12:31:59.3154 [INFO] C:\WINDOWS\system32
2022-07-13 12:31:59.3274 [INFO] C:\00_hata\PlayGound\Dirtest\bin\x86\Debug
2022-07-13 12:31:59.3274 [INFO] C:\00_hata\PlayGound\Dirtest\bin\x86\Debug
以下は呼び出し元プログラムのルートディレクトリ
スケジューラの作業ディレクトリを取得する。
Directory.GetCurrentDirectory()
Environment.CurrentDirectory
以下は呼び出しプログラムのルートディレクトリを取得する。
System.AppDomain.CurrentDomain.BaseDirectory
Assembly.GetExecutingAssembly().Location)
System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(Environment.GetCommandLineArgs()[0]))
System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
まとめ
呼び出し元のルートディレクトリが必要か?
呼び出しバッチのルートディレクトリが必要か?
C# CurrentDirectory 取得と調べたら何かしら出てくるので違いを分かったうえで使うようにしよう