プログラム内でパスを扱う場合「カレントパス」と「実行ファイルパス」を取り違えることが原因で発生する不具合がよくあります。
「カレントパス」はアプリケーションを実行した場所のことで、必ずしも「実行ファイルパス」と同じになるわけではないのでこういった不具合が発生してしまいます。
例えば相対パスを指定した場合に、直感的には「実行ファイルパス」からのパスを指定していると思いがちですが、実際には「カレントパス」からのパスが指定されてしまいます。
この記事では、実行ファイルのパスを取得する方法について紹介します。
実行ファイルのパスを取得
実行ファイルのフルパスを取得するには「GetModuleFileName」関数を使用します。
その後、取得したパスを「_tsplitpath_s」関数で分割し、必要な要素(ドライブ名、ディレクトリ名)を「PathCombine」関数で結合します。
// 実行ファイルパス取得
CString GetModulePath()
{
// 返却値
CString res = (LPCTSTR)nullptr;
// パス、ドライブ名、ディレクトリ名、ファイル名、拡張子
TCHAR path[_MAX_PATH], drive[_MAX_PATH], dir[_MAX_PATH], file[_MAX_PATH], ext[_MAX_PATH];
// フルパスを取得
if (::GetModuleFileName(NULL, path, _MAX_PATH) != 0)
{
// ファイルパスを分割
::_tsplitpath_s(path, drive, _MAX_PATH, dir, _MAX_PATH, file, _MAX_PATH, ext, _MAX_PATH);
// ドライブ名とディレクトリ名を結合
res = ::PathCombine(path, drive, dir);
}
return res;
}
実行ファイルパスが「C:\Hoge\Fuga.exe」、カレントパスが「C:\Fuga」だった場合、上記の関数を実行すると「C:\Hoge」が取得できます。
終わりに
実行ファイルのパスを取得する方法について紹介しました。
ファイル操作を行う場合カレントパスからの相対パスだとユーザの操作によってパスが変わってしまうこともあるため、絶対パスか実行ファイルからの相対パスを指定するようにしましょう。
この記事について誤っている点・不明な点などありましたらコメントまでお願いします。
コメント