获取正在运行的文件名:argv [0] vs boost :: filesystem :: current_path()

时间:2016-09-09 23:39:05

标签: c++ boost

我试图在C ++中获取当前运行的文件名。我写了一个使用argv [0]和boost current_path()方法的简单代码。该文件被编译为可执行文件mainWindow。

#include "boost/filesystem.hpp"

int main(int argc, char* argv[])
{
    boost::filesystem::path full_path( boost::filesystem::current_path() );
    std::cout << full_path.string() << "\n";

    std::cout << argv[0] << "\n\n";

    return 0;
} 

有趣的是,每种方法的输出都不同。

argv [0]输出为:

  

../ VENTOS / SRC / loggingWindow /主窗口

current_path()输出为:

  

/家庭/马尼/桌面/ VENTOS_Redpine

我没有直接从终端运行我的程序(mainWindow)。另一个应用程序是调用我的程序,我想这就是输出不同的原因。我是对的吗?

我的第二个问题是:不使用argv [0]选项并仅依赖于boost文件系统方法,如何获得与argv [0]相同的结果?

1 个答案:

答案 0 :(得分:3)

argv[0]仅包含用于执行程序的命令。这可能包含路径。它可能包含相对路径。它根本不包含任何路径。由于符号链接等,它甚至可能不包含可执行文件名称....如果托管系统选择不提供任何内容,它甚至可能是空的。它不可信,因此您不希望将其用作评估其他方法的基础。

boost::filesystem::current_path使您失败,因为它只返回当前工作目录。这可能是也可能不是可执行文件的位置,因为它取决于运行程序的目录以及程序是否已更改工作目录。说实话,我不确定是否有一种确定的方法可以从Boost获取进程名称和路径。几年前没有,但是时间有一种进行的方式,你知道吗?

有很多问题涉及如何获取可执行文件和路径(Finding current executable's path without /proc/self/exe看起来很有希望但是过时了。那时候再次进行游戏。)但是所有都是特定于平台的,你可能需要做一些{{ 1}}或链接器魔法使这项工作。