如何在C++中获取当前正在运行的可执行文件的文件名

Pha*_*ran 13 c++ filenames

我想获得当前流程的完整路径.

_getcwd用来获取当前的工作目录.但它不包括文件名.

我怎样才能获得如下文件名:filename.exe

Seç*_*şçı 21

argv[0] 您的主要功能是您的文件名.

一个简单的代码片段:

#include<stdio.h>
int main(int argc,char** argv)
{
//access argv[0] here
}
Run Code Online (Sandbox Code Playgroud)

  • `argv[0]` 是用户用来调用你的程序的名称。如果用户使用符号链接,`argv[0]` 是符号链接,而不是二进制文件本身。 (4认同)

mar*_*inj 10

在Windows上,您可以使用:

TCHAR szExeFileName[MAX_PATH]; 
GetModuleFileName(NULL, szExeFileName, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)

szExeFileName将包含完整路径+可执行文件名称

[编辑]

用于更便携的解决方案使用argv[0]或一些其他平台特定代码.你可以在这里找到这样的方法:https://github.com/mirror/boost/blob/master/libs/log/src/process_name.cpp.


Ken*_*oom 9

在Linux上,二进制文件的文件名是符号链接的目标/proc/self/exe.您可以使用readlink系统调用来查找符号链接的目标.

请注意,这会告诉您存储二进制文件的磁盘上的实际位置,而不仅仅是用户用来启动程序的命令.


gjv*_*jvc 6

这是使用 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;
}
Run Code Online (Sandbox Code Playgroud)

编译通过

g++ -o hello_world hello_world.cpp -lboost_filesystem -lboost_system -ldl
Run Code Online (Sandbox Code Playgroud)

结果输出

hello world, this is [hello_world]
or [/home/gjvc/tmp/hello_world] if you're not into the whole brevity thing.
Run Code Online (Sandbox Code Playgroud)