C ++ [Windows]可执行文件所在文件夹的路径

时间:2010-04-15 17:10:41

标签: c++ windows

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

  • 最简单,最重要的是:获取当前可执行文件夹路径的最安全方法是什么?

3 个答案:

答案 0 :(得分:46)

使用GetModuleHandleGetModuleFileName查找运行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),否则没有真正的方法可以保证它始终有效。正如肖恩建议的那样)