C++ 获得当前执行文件的路径

先直接上代码,比较直观:

        char szModuleFilePath[MAX_PATH];
        char SaveResult[MAX_PATH];
        int n = GetModuleFileNameA(0, szModuleFilePath, MAX_PATH); //获得当前执行文件的路径
        szModuleFilePath[ strrchr(szModuleFilePath, '\\') - szModuleFilePath + 1 ] = 0;//将最后一个"\\"后的字符置为0
        strcpy(SaveResult,szModuleFilePath);
        strcat(SaveResult,"\\OutMessage\\outMessagebyJam.txt");//在当前路径后添加子路径


获取当前执行文件的路径用GetModuleFileNameA()这个函数就可以了,它获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。路径形式如  "F:\users\administrator\documents\visual studio 2013\可用工程\TrafficTest_org\TrafficClassCreate\Release\TrafficClassCreate.exe",若想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx函数。

GetModuleFileNameA()函数接口:

DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule,
    _Out_     LPTSTR lpFilename,//返回的路径名
    _In_      DWORD nSize
);

strrchr()这个函数,查找指定字符串中从正面开始的最后一次出现的位置,如果成功,返回指定字符最后一次出现位置的地址,如果失败,则返回 NULL。
### C++获取当前执行文件路径的方法 在 C++ 编程中,获取当前执行文件路径可以通过多种方法实现。以下是几种常见的技术: #### 使用 `/proc/self/exe` 的方法 在 Linux 平台上,可以利用操作系统提供的特殊符号链接 `/proc/self/exe` 来获取当前执行文件的具体位置。这种方法被认为是最可靠和最简单的解决方案之一[^1]。 ```cpp #include <unistd.h> #include <limits.h> std::string getExecutablePath() { char path[PATH_MAX]; ssize_t count = readlink("/proc/self/exe", path, sizeof(path) - 1); if (count != -1) { path[count] = '\0'; return std::string(path); } return ""; } ``` 此代码片段展示了如何通过 `readlink()` 函数解析 `/proc/self/exe` 链接并返回完整的可执行文件路径。 --- #### 利用 `argv[0]` 另一种常见的方式是从程序启动参数中的 `argv[0]` 提取可执行文件名或路径。需要注意的是,这种方式可能仅提供相对路径或者不带任何路径信息的情况,因此其可靠性较低。 ```cpp #include <iostream> #include <cstdlib> void printExecutableName(char * argv[]) { std::cout << "Executable name/path: " << argv[0] << std::endl; } int main(int argc, char * argv[]) { printExecutableName(argv); return EXIT_SUCCESS; } ``` 上述例子演示了如何直接打印传入到主函数的命令行参数的第一个值作为可执行文件名称/路径。 --- #### 调用 `getcwd()` 获取工作目录 虽然严格来说这不是一种获得 **可执行文件** 路径的办法,但是有时候我们需要知道进程的工作目录以便进一步处理其他资源定位逻辑。这里给出基于 POSIX 标准库的一个示例来展示怎样取得当前工作的绝对路径[^2]: ```cpp #include <stdio.h> #include <stdlib.h> #include <errno.h> char* getCurrentWorkingDirectory() { char* buffer = nullptr; size_t size = 0; errno = 0; buffer = getcwd(nullptr, 0); // Let the system allocate memory automatically. if (!buffer && errno != 0){ perror("Error retrieving current working directory"); exit(EXIT_FAILURE); } printf("Current Working Directory:%s\n", buffer); free(buffer); // Free allocated resources after use. return buffer; } ``` 注意该版本会自动分配足够的空间存储结果字符串,并且记得释放动态申请的空间以防泄漏。 --- #### Windows 特定 API `_pgmptr` 如果目标平台是 Microsoft Windows,则可以直接访问全局变量 `_pgmptr` ,它包含了指向可执行映像全限定路径的指针[^3] 。下面是一个跨平台兼容的例子: ```cpp #ifdef _WIN32 #include <tchar.h> #else #define _T(x) x #endif std::string getExeFilePathCrossPlatform(){ #ifdef _WIN32 return std::_tcsdup(_pgmptr); #else char result[ PATH_MAX ]; ssize_t count = ::readlink( "/proc/self/exe", result, PATH_MAX ); return std::string(result, (count > 0) ? count : 0 ); #endif } ``` 这个宏定义允许我们编写一次代码就能适应不同操作系统的特性差异。 --- ### 总结 每种方法都有各自的适用场景与局限性,在开发过程中应当依据项目需求选取恰当的技术手段完成任务。例如,当追求最高精度时推荐采用读取 `/proc/self/exe`;而对于某些特定环境下或许借助于 `argv[0]` 就已经足够满足基本功能诉求了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值