我想获取当前进程的完整路径。
我使用 _getcwd
来获取当前工作目录。但是它不包括文件名称。
如何获取文件名,比如: filename.exe
?
argv[0]
在你的主函数中代表你的文件名。
一个简单的代码片段:
#include<stdio.h>
int main(int argc, char** argv)
{
//access argv[0] here
}
如果你无法访问/更改main()中的代码,可以像这样做:
std::string executable_name()
{
#if defined(PLATFORM_POSIX) || defined(__linux__) //check defines for your setup
std::string sp;
std::ifstream("/proc/self/comm") >> sp;
return sp;
#elif defined(_WIN32)
char buf[MAX_PATH];
GetModuleFileNameA(nullptr, buf, MAX_PATH);
return buf;
#else
static_assert(false, "unrecognized platform");
#endif
}
argv[0]
是用户调用您的程序时使用的名称。如果用户使用了符号链接,则 argv[0]
是符号链接,而不是二进制本身。 - Ken Bloom在Windows上,您可以使用:
TCHAR szExeFileName[MAX_PATH];
GetModuleFileName(NULL, szExeFileName, MAX_PATH);
szExeFileName将包含完整的路径和可执行文件名。
[编辑]
为了更具可移植性,可以使用argv[0]
或其他一些平台特定的代码。您可以在此处找到这种方法:https://github.com/mirror/boost/blob/master/libs/log/src/process_name.cpp。
/proc/self/exe
符号链接的目标位置。你可以使用readlink
系统调用来查找符号链接的目标位置。以下是使用boost(https://www.boost.org/)的跨平台方法:
#include <iostream>
#include <boost/dll.hpp>
int main( int argc, char **argv ) {
std::cout << "hello world, this is [" << boost::dll::program_location().filename().string() << "]" << std::endl;
std::cout << "or [" << boost::dll::program_location().string() << "] if you're not into the whole brevity thing." << std::endl;
return 0;
}
通过编译生成
g++ -o hello_world hello_world.cpp -lboost_filesystem -lboost_system -ldl
输出结果
hello world, this is [hello_world]
or [/home/gjvc/tmp/hello_world] if you're not into the whole brevity thing.
正如其他人提到的那样,你的可执行文件的名称包含在argv[0]中。如果需要,你可以:
cout << argv[0] << endl;
__FILE__
。cout << __FILE__ << endl;
点击这里,并滚动到“预定义宏名称”
_
的环境变量,其中包含当前进程。$ echo $_
echo
#include <stdlib.h> /* getenv */
#include<iostream>
int main(){
std::cout << getenv("_") << '\n';
return 0;
}
$ c++ a.cpp -o a.out
$ ./a.out
打印 ./a.out
(或者是执行的任何一行,包括路径)。
这种方法比其他方法有一定的优势,它可以全局读取(不需要传递 argv[0]
)并且不需要文件处理。
tmp/a.out
。 - alfC通常可以从argv[0]
获取可执行文件名:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Running: %s\n", argv[0]);
return 0;
}
实际上,有一些方法可以让一个应用程序execl()
另一个应用程序(或类似的函数)并覆盖此参数。但对于这种类型的应用程序来说,系统改变它仍然是不寻常的。
execl
时将argv [0]
设置为程序名称是传统惯例。这也是一种可被入侵的惯例。在安全环境中,使argv [0]为空有些成为标准。 - David Hammen