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

Get the running file name: argv[0] vs boost::filesystem::current_path()

本文关键字:current filesystem path boost 文件名 运行 argv 获取 vs      更新时间:2023-10-16

我试图在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] << "nn";
    return 0;
} 

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

argv[0] output is:

. ./VENTOS/src/loggingWindow/主窗口

current_path()输出为:

/home/摩尼/桌面/VENTOS_Redpine

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

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

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

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

有很多问题涉及如何获得可执行文件和路径(查找当前可执行文件's路径没有/proc/self/exe看起来很有希望,但是陈旧的。但所有这些都是特定于平台的,你可能需要做一些ifdef或链接器巫术来完成这项工作。