WindowsのC++アプリでfstream
を使用していくつかのファイルにアクセスする必要があります。これらのファイルはすべて、exeファイルが置かれているフォルダーのサブフォルダーにあります。
GetModuleHandle および GetModuleFileName を使用して、exeの実行元を確認します。
HMODULE hModule = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(hModule, path, MAX_PATH);
次に、パスからexe名を削除します。
GetThisPath.h
/// dest is expected to be MAX_PATH in length.
/// returns dest
/// TCHAR dest[MAX_PATH];
/// GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
GetThisPath.cpp
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
if (!dest) return NULL;
if (MAX_PATH > destSize) return NULL;
DWORD length = GetModuleFileName( NULL, dest, destSize );
PathRemoveFileSpec(dest);
return dest;
}
mainProgram.cpp
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
更新: PathRemoveFileSpec
はWindows 8では非推奨です。ただし、代替の PathCchRemoveFileSpec
はWindows 8以降でのみ使用可能です。 (コメントをありがとう@askalee)
以下のこのコードは動作する可能性があると思いますが、以下のコードが吟味されるまで、上記のコードはそのままにしておきます。現在、これをテストするためのコンパイラーをセットアップしていません。このコードをテストする機会がある場合は、以下のコードが機能するかどうか、およびテストしたオペレーティングシステムについてコメントを投稿してください。ありがとう!
GetThisPath.h
/// dest is expected to be MAX_PATH in length.
/// returns dest
/// TCHAR dest[MAX_PATH];
/// GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
GetThisPath.cpp
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
if (!dest) return NULL;
DWORD length = GetModuleFileName( NULL, dest, destSize );
#if (NTDDI_VERSION >= NTDDI_WIN8)
PathCchRemoveFileSpec(dest, destSize);
#else
if (MAX_PATH > destSize) return NULL;
PathRemoveFileSpec(dest);
#endif
return dest;
}
mainProgram.cpp
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
デフォルトでは、exeが実行されるディレクトリが開始場所になります。そのため、サブフォルダー内のファイルを開くのは簡単なはずです
fstream infile;
infile.open(".\\subfolder\\filename.ext");
プログラム内から。
ただし、必要な機能をラップするフレームワークを使用するか(ブーストを見ます)、または GetModuleFileName
(ショーンeが示唆したように)