我需要在Windows上的C ++应用程序中使用fstream
访问一些文件。 这些文件都位于我的exe文件所在文件夹的子文件夹中。
使用GetmoduleeHandle和GetmoduleeFileName找出你的exe运行的地方。
HMODULE hmodulee = GetmoduleeHandleW(NULL); WCHAR path[MAX_PATH]; GetmoduleeFileNameW(hmodulee, 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 = GetmoduleeFileName( 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 = GetmoduleeFileName( 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");
从你的程序中。
然而,没有真正的方法来保证这将始终工作,除非你使用包装所需功能的框架(我会看升压),或直接使用Windows API,如GetmoduleeFileName
(如建议)