C++;可执行文件所在文件夹的[Windows]路径 在Windows上的C++应用程序中,我需要访问一些文件,使用代码> fStuts。这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件文件夹路径的最简单、最重要的方法是什么
用于查找exe的运行位置C++;可执行文件所在文件夹的[Windows]路径 在Windows上的C++应用程序中,我需要访问一些文件,使用代码> fStuts。这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件文件夹路径的最简单、最重要的方法是什么,c++,windows,C++,Windows,用于查找exe的运行位置 WCHAR path[MAX_PATH]; GetModuleFileNameW(NULL, path, MAX_PATH); 然后从路径中删除exe名称。默认情况下,运行exe的目录应该是起始位置。因此,在子文件夹中打开文件应该尽可能简单 fstream infile; infile.open(".\\subfolder\\filename.ext"); 从你的程序中 但是,除非您使用一个封装了所需功能的框架(我会看看boost),或者直接使用Windows A
WCHAR path[MAX_PATH];
GetModuleFileNameW(NULL, path, MAX_PATH);
然后从路径中删除exe名称。默认情况下,运行exe的目录应该是起始位置。因此,在子文件夹中打开文件应该尽可能简单
fstream infile;
infile.open(".\\subfolder\\filename.ext");
从你的程序中
但是,除非您使用一个封装了所需功能的框架(我会看看boost),或者直接使用Windows API(如sean e所建议的)
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);
/// 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;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
#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;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
更新:在Windows 8中不推荐使用。但是,此替换项仅在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);
/// 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;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
#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;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
- 从
- 感谢@Warpspace建议的更改李>
getModuleFileName(NULL,path,MAX_path)
还不够吗?什么?你听说过磨合吗?您不必告诉我exe运行的路径是默认路径……以防您误解:每个进程都有自己的值,表示当前目录。默认情况下,此值应设置为可执行文件所在的目录。您可以使用GetCurrentDirectory()
的API调用检查此目录,或者使用SetCurrentDirectory()
设置它。虽然我意识到这不是你问题的精确解决方案(正如我在原文中所说的),但信息并没有错。如果你觉得值得投反对票,我不确定你是否理解这里投票系统的预期用途。他可能指的是“开始”选项,你可以在Windows开始菜单程序链接中指定开始工作目录。答案不完整,但是我认为它不值得这些否决票。例如,除了有明确指定工作目录的快捷方式外,当从cmd
启动程序时,当前工作目录将从父进程继承。您真的不能假设CWD与可执行映像的位置有任何关系。PathRemoveFileSpec的+1不知道这一点。PathRemoveFileSpec似乎已被弃用:,请改用PathChRemoveFileSpec。@askalee值得注意的是,它仅受Win8(及以上版本)的支持当我意识到这在Windows8上不起作用时,桌面应用程序即将实现它。例如,Windows 8.1是NTDDI\u WINBLUE
,而不是NTDDI\u WIN8
。如果(NTDDI\U版本>=NTDDI\U WIN8)PathchreMoveFileSpec
不起作用,我将从#pragma comment(lib,“Pathcch.lib”)
调用我,但我得到一个错误参数类型“TCHAR*”与参数类型“PWSTR”不兼容
比使用argv[0]更复杂的东西这是int main(int argc,char*argv[])的一个参数并对其进行解析?