获取运行文件名:argv[0] vs boost::filesystem::current_path()
Get the running file name: argv[0] vs boost::filesystem::current_path()
我试图在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
或链接器巫术来完成这项工作。
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- std::filesystem::copy throws filesystem_error
- C++将目录中的所有文件与::filesystem进行比较
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- 如何将 std::filesystem::p ath 转换为 LPCSTR,以便在 LoadLibrary() 变体之一
- 无法使用<filesystem>函数
- 不能将C++的"std::filesystem"库与介子构建一起使用
- Visual Studio 2019 C++ and std::filesystem
- 'std::filesystem::d irectory_iterator' 编译器问题
- std::filesystem::create_directories Visual Studio 2017
- 如何获取 std::filesystem::p ath 中的最后一个目录?
- 为什么目录中的 std::filesystem::file_size 留给实现?
- 标头中有哪些固有的安全漏洞<filesystem>?
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- std::filesystem::directory_迭代器链接器问题(C++17)
- 如何使用 in C++ 访问相对父目录<filesystem>
- 传递 boost::filesystem::p ath 到 boost::p rocess::child 会导致 Win
- 'std::filesystem::p ath' 没有标准哈希吗?