【问题标题】:Boost.Filesystem how to find out in which directory your executable is?Boost.Filesystem 如何找出您的可执行文件在哪个目录中?
【发布时间】:2011-08-07 08:12:57
【问题描述】:

所以我运行我的应用程序。我需要它知道它的可执行文件在哪里。如何使用 Boost.Filesystem 找到它的路径?

【问题讨论】:

标签: c++ boost boost-filesystem


【解决方案1】:

你不能,Boost.Filesystem 不提供这样的功能。

但从 Boost 1.61 开始,您可以使用 Boost.Dll 和函数 boost::dll::program_location

#include <boost/dll.hpp>
boost::dll::program_location().parent_path();

【讨论】:

  • 这按预期工作。 boost::filesystem::current_path() 将返回可执行文件的路径。无论您从哪个目录运行它。
  • @munsingh current_path 返回“当前目录”,而不是可执行路径。如果您从主文件夹从 shell 运行程序,该文件夹将是您的当前目录,但您的可执行文件可以在 /usr/bin/something 中。这是在 Unix 系统上执行命令行实用程序的最常用方法。
  • 这也可以:boost::dll::program_location().parent_path().parent_path();
【解决方案2】:

从 C++ 14 开始,您不需要 Boost,您可以使用标准库的文件系统,您可以轻松做到这一点: (我可以确认这也适用于 Windows 和 Linux)

#include <iostream>
#include <filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    fs::path p = argv[0]; // or "C:executable_name.exe";
    std::cout << "Current path is " << fs::current_path() << '\n'
              << "Absolute path for " << p << " is " << fs::absolute(p) << '\n'
          << "System complete path for " << p << " is " << fs::system_complete(p) << '\n';
}

从文档中复制的示例:https://en.cppreference.com/w/cpp/experimental/fs/absolute

【讨论】:

  • 问题在于:1)这需要访问argv数组2)argv[0]可能丢失(argc可以为0)3)产生无效如果通过环境变量找到程序的结果 4)示例不完整 - 未定义 argc/argv 和 5)std::experimental 正如答案所声称的那样,它并不是真正的标准库。
【解决方案3】:

正如here 更全面地讨论的那样,最可靠的方法不是通过 boost::filesystem。相反,您的实现应该考虑应用程序运行所在的操作系统。

但是,为了快速实现而不考虑可移植性,您可以检查 argv[0] 是否返回可执行文件的完整路径。如果是肯定的,你可以这样做:

namespace fs=boost::filesystem;

fs::path selfpath=argv[0];

selfpath=selfpath.remove_filename();

【讨论】:

    【解决方案4】:

    你不能用 boost::filesystem 可靠地做到这一点。

    但是,如果您使用的是 Windows,则可以调用 GetModuleFileName 来获取可执行文件的完整路径,然后使用 boost::filesystem 来获取目录。 (见parent_path

    【讨论】:

      【解决方案5】:
      boost::filesystem::system_complete(argv[0]);
      

      例如

      [davka@bagvapp Debug]$ ./boostfstest 
      /home/davka/workspaces/v1.1-POC/boostfstest/Debug/boostfstest
      

      请注意,这将为您提供完整路径包括可执行文件名。

      【讨论】:

      • @Blender:查看path 类的parent_path() 方法。我的 boost 版本太旧了,所以我没有尝试过
      • @Nim :这有点迟钝——path 已经有一个 parent_path() 成员函数。
      • 这可能会以多种方式失败,因为它依赖于搜索路径。
      • 如果您将chdired 到另一个目录,并且您的应用程序通过相对路径运行,例如./myapp,它将无法工作。
      【解决方案6】:

      如果你的意思是从你正在运行的可执行文件内部,你可以使用boost::filesystem::current_path()

      【讨论】:

      • 如果程序目录与当前工作目录不同,这将不起作用。例如,考虑以这种方式从 shell 启动的程序:./foo/program
      • 网站上如何接受糟糕答案的绝佳示例
      猜你喜欢
      • 2014-10-28
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多