19

我想获得当前进程的完整路径。

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

我怎样才能得到像这样的文件名:filename.exe

4

8 回答 8

29

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
}
于 2012-09-03T23:18:01.997 回答
17

在 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 。

于 2012-09-04T00:17:54.833 回答
9

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

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

于 2012-09-03T23:40:49.073 回答
5

这是使用 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.
于 2018-09-25T09:55:36.307 回答
3

正如其他人所提到的,您的可执行文件的名称包含在 argv[0] 中。如果你需要,你可以:

cout << argv[0] << endl;

如果您需要可执行文件的源文件的名称,C++ 有一个预定义的宏,您可以使用:

cout << __FILE__ << endl;

转到此处并滚动到“预定义的宏名称”

于 2017-02-02T04:51:00.763 回答
2

您可以使用 errno.h 中的 program_invocation_name

https://linux.die.net/man/3/program_invocation_short_name

于 2017-06-28T11:27:17.450 回答
1

您通常可以从以下位置获取可执行文件名argv[0]

#include <stdio.h>
int main(int argc, char* argv[])
{
 printf("Running: %s\n", argv[0]);
 return 0;
}

实际上,有一些方法可以将应用程序转移到execl()另一个应用程序(或另一个类似的功能)并覆盖此参数。系统为这种应用程序更改它仍然是非常规的。

于 2012-09-03T23:19:18.237 回答
1

在 Linux(POSIX?)中,有一个名为的环境变量_包含当前进程。

$ echo $_
echo

在 C++ 中

#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])并且不需要文件处理。

于 2016-04-29T21:51:44.323 回答