【问题标题】:Get the running file name: argv[0] vs boost::filesystem::current_path()获取运行文件名:argv[0] vs boost::filesystem::current_path()
【发布时间】:2016-09-09 23:39:04
【问题描述】:

我正在尝试在 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/mainWindow

current_path() 输出为:

/home/mani/Desktop/VENTOS_Redpine

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

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

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

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

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

    有很多问题涉及如何获取可执行文件和路径(Finding current executable's path without /proc/self/exe 看起来很有希望,但已经过时了。那个时候又要开始了。)但是所有这些都是特定于平台的,你可能需要做一些 ifdef 或链接器魔法来完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2023-04-05
      • 2016-06-02
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多