如何获取可执行文件的路径?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我想要做的就是以一种独立于平台的方式获得当前正在运行的可执行文件的路径,作为绝对路径或相对于可执行文件调用的位置。我想Boost::file System::Initial_Path是我的问题的答案,但这似乎只处理问题的“平台独立”部分--它仍然返回调用应用程序的路径。

作为背景,这是一款使用Ogre的游戏,我试图使用“Sleepy”来分析它,它从自己的目录中运行目标可执行文件,所以当然在加载时,游戏没有找到配置文件等等,并迅速崩溃。我希望能够将它传递给配置文件的绝对路径,我知道配置文件将始终与可执行文件一起使用。VisualStudio中的调试也是如此--我希望能够运行$(TargetPath),而不必设置工作目录。

提问于
用户回答回答于
用户回答回答于

这种方式使用Boost+argv。你提到过,这可能不是跨平台的,因为它可能包括也可能不包括可执行文件的名称。下面的代码应该能解决这个问题。

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    fs::path full_path( fs::initial_path<fs::path>() );

    full_path = fs::system_complete( fs::path( argv[0] ) );

    std::cout << full_path << std::endl;

    //Without file name
    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basename(full_path) << std::endl;

    return 0;
}

下面的代码获取当前的工作目录,该目录可能满足你的需要。

#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    //current working directory
    fs::path full_path( fs::current_path<fs::path>() );

    std::cout << full_path << std::endl;

    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basepath(full_path) << std::endl;

    return 0;
}

注意刚刚意识到basename()被废弃了,所以不得不切换到.stem()

扫码关注云+社区