Boost.Filesystem, как узнать, в каком каталоге находится ваш исполняемый файл? - PullRequest
14 голосов
/ 17 апреля 2011

Итак, я запускаю свое приложение.Мне нужно, чтобы он знал, где находится его исполняемый файл.Как найти путь к нему с помощью Boost.Filesystem?

Ответы [ 6 ]

34 голосов
/ 17 апреля 2011
boost::filesystem::system_complete(argv[0]);

, например

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

Обратите внимание, что это дает вам полный путь , включая имя исполняемого файла.

17 голосов
/ 12 марта 2018

Вы не можете, Boost.Filesystem не предоставляет такую ​​функциональность.

Но начиная с Boost 1.61 вы можете использовать Boost.Dll и функцию boost::dll::program_location:

#include <boost/dll.hpp>
boost::dll::program_location().parent_path();
10 голосов
/ 17 апреля 2011

Вы не можете сделать это надежно с boost :: filesystem.

Однако, если вы находитесь в Windows, вы можете вызвать GetModuleFileName, чтобы получить полный путь к исполняемому файлу, а затем использовать boost::filesystem, чтобы получить каталог. (см. parent_path )

2 голосов
/ 16 июля 2014

Как более подробно обсуждается здесь , самый надежный способ сделать это - не через boost :: filesystem.Вместо этого ваша реализация должна учитывать операционную систему, в которой выполняется приложение.

Однако для быстрой реализации без проблем с переносимостью вы можете проверить, возвращает ли ваш argv [0] полный путь к исполняемому файлу.,Если положительный, вы можете сделать что-то вроде:

namespace fs=boost::filesystem;

fs::path selfpath=argv[0];

selfpath=selfpath.remove_filename();
1 голос
/ 06 января 2019

С 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

0 голосов
/ 17 апреля 2011

Если вы имеете в виду внутри исполняемого файла, который вы запускаете, вы можете использовать boost :: filesystem :: current_path ()

...