プログラムを書いていると、実行ファイルのある場所を起点にパスを考えることはよくあるかと思います。
私は今まで実行ファイルのある場所をカレントディレクトリで取得していたのですが、カレントディレクトは必ずしも実行ファイルのある場所とは限らないので、注意が必要です。
(私がバカなだけで、もしかしてみんな当たり前に知ってることかもしれませんが・・・)
環境
- Visual Studio 2017
- ASP.NET Core 2.0
GetCurrentDirectory
カレントディレクトリのパスを取得したい場合、通常は GetCurrentDirectory
を使用すると思います。
using System.IO;
// ...
var dir = Directory.GetCurrentDirectory();
Visual Studio で開発している場合、通常上記のパスは以下のようになります。
例
- デバッグビルド時:
{プロジェクトルート}\bin\Debug\netcoreapp2.0
- リリースビルド時:
{プロジェクトルート}\bin\Release\netcoreapp2.0
基本的にはこれで問題ないとは思うのですが、カレントディレクトリは SetCurrentDirectory
で変更することができるので、意図しないパスに設定されている可能性もあります。
また、ASP.NET Core において、GetCurrentDirectory
が Visual Studio のプロジェクトルートを示すことがあり、デバッグ時に困ることがありました。
何故そうなったのかは不明ですが、前述したとおり、カレントディレクトは変更できるので、意図しないところで変更されている可能性もあります。
実行ファイルのあるパスを取得
私の場合、今まではカレントディレクトリを実行ファイルのあるパスと同義で扱っていましたが、前述のように必ずしもそうでない場合があるので、最近は実行ファイルのあるパスを取得したい場合は以下のように書いています。
using System.IO;
using System.Reflection;
// ...
var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);