我需要在Windows上的C++应用程序中使用fstream
访问一些文件。这些文件都位于包含我的可执行文件的文件夹的子文件夹中。
- 获取当前可执行文件所在文件夹的路径,最简单且更加重要的是安全的方式是什么?
使用 GetModuleFileName 函数可以找到你的exe文件运行的位置。
WCHAR path[MAX_PATH];
GetModuleFileNameW(NULL, path, MAX_PATH);
然后从路径中去除exe文件名。
GetModuleFileNameW(NULL, path, MAX_PATH)
不就足够了吗? - Mukesh Sai KumarGetThisPath.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);
PathRemoveFileSpec
的赞同,不知道这个函数之前。 - lambdas#if (NTDDI_VERSION >= NTDDI_WIN8)
的内容。 - Warpspace默认情况下,exe所在的目录应该是起始位置。因此,在子文件夹中打开文件应该像这样简单:
fstream infile;
infile.open(".\\subfolder\\filename.ext");
从您的程序内部。
然而,除非您使用包装所需功能的框架(我建议使用boost),或直接使用Windows API,例如GetModuleFileName
(如sean e所建议的那样),否则无法保证始终有效。
GetCurrentDirectory()
API调用来检查此目录,或使用SetCurrentDirectory()
设置它。 尽管我意识到这不是您问题的确切解决方案(如原始文本所述),但这些信息是正确的 http://msdn.microsoft.com/en-us/library/aa363806.aspx。如果您认为这值得投反对票,我不确定您是否理解此处投票系统的预期用途。 - KevenKcmd
启动程序时,当前工作目录将会继承自父进程。你不能假设当前工作目录与可执行文件的位置有任何关系。 - bcrist