C ++ 可执行文件所在文件夹的path

我需要在Windows上的C ++应用程序中使用fstream访问一些文件。 这些文件都位于我的exe文件所在文件夹的子文件夹中。

  • 什么是最简单和更重要的:最安全的方式来获取当前可执行文件的path?

使用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); 
  • NTDDI_WIN8从这个答案
  • 感谢@Warpspace建议的更改!

默认情况下,exe运行的目录应该是起始位置。 所以在子文件夹中打开一个文件应该像

 fstream infile; infile.open(".\\subfolder\\filename.ext"); 

从你的程序中。

然而,没有真正的方法来保证这将始终工作,除非你使用包装所需功能的框架(我会看升压),或直接使用Windows API,如GetmoduleeFileName (如建议)