假设我有以下文件夹结构
/dir/dir2/dir3/program.exe
我想获得被调用的 program.exe
文件路径。例如。
// program.exe
#include <iostream>
#include <filesystem>
int main(int argc, char** argv)
{
std::cout << std::filesytem::current_path() << "\n";
}
但是如果从不同的位置调用,这个 program.exe
的工作方式会有所不同:
- 在
dir3
user@command_line:/dir/dir2/dir3$ ./program.exe
输出:"/dir/dir2/dir3"
- 在
dir2
user@command_line:/dir/dir2$ ./dir3/program.exe
输出:"/dir/dir2"
- 在
dir
user@command_line:/dir$ ./dir2/dir3/program.exe
输出:"/dir"
我希望我能获得 program.exe
的确切路径,无论它是从哪个位置调用的。有可能吗?
感谢您抽出宝贵时间。
回答1
您正在寻找一个包含工作可执行文件的文件夹。当前路径给你一个https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcurrentdirectory
获取可执行路径
对于 Windows,您可以使用 https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulefilenamea Win API 函数:
例如:
char exe_name[ MAX_PATH+1 ] = {'\0'};
::GetModuleFileNameA(nullptr,exe_name,MAX_PATH);
对于 POSIX,您可以使用 https://man7.org/linux/man-pages/man2/readlink.2.html 系统调用获取可执行路径
例如:
char exe_name[ PATH_MAX+1 ] = {'\0'};
char query[64] = {'\0'};
std::snprintf(query, 64, "/proc/%u/exe", ::getpid() );
::readlink(query, exe_name, PATH_MAX);