我需要在Windows上的C ++应用程序中使用fstream
访问一些文件。这些文件都位于我的exe文件所在文件夹的子文件夹中。
答案 0 :(得分:46)
使用GetModuleHandle和GetModuleFileName查找运行exe的位置。
HMODULE hModule = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(hModule, path, MAX_PATH);
然后从路径中删除exe名称。
答案 1 :(得分:23)
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);
更新:Windows 8中不推荐使用PathRemoveFileSpec
。但是,替换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);
答案 2 :(得分:1)
默认情况下,运行exe的目录应该是起始位置。因此,在子文件夹中打开文件应该像
一样简单fstream infile;
infile.open(".\\subfolder\\filename.ext");
来自您的计划。
然而,除非您使用包含所需功能的框架(我会查看boost),或直接使用Windows API(例如GetModuleFileName
),否则没有真正的方法可以保证它始终有效。正如肖恩建议的那样)