Получить путь к исполняемому файлу (с помощью std :: filesystem)

Прежде чем я буду отмечен как повторяющийся, на все похожие вопросы, которые я смог найти, есть ответы до введения std :: filesystem, и я использую код для конкретной платформы или Boost :: filesystem. Я ищу переносимый ответ, в котором используется std :: filesystem.


Можно ли получить путь, по которому находится исполняемый файл c ++ (не рабочий каталог), с помощью std :: filesystem? Если да, то как?


person Barnack    schedule 04.05.2019    source источник
comment
Я ничего не могу найти здесь. Так что я боюсь, что это невозможно.   -  person πάντα ῥεῖ    schedule 04.05.2019
comment
Как насчет второго параметра (argv) функции main? Я не уверен, насколько это портативно.   -  person Indiana Kernick    schedule 04.05.2019
comment
@ Kerndog73 Это не будет включать полный путь, если программа не была вызвана с использованием полного пути.   -  person πάντα ῥεῖ    schedule 04.05.2019
comment
cppreference говорит, что argv[0] - это «имя, используемое для вызова программы». Предполагая, что это абсолютный путь, возможно, не переносимо, но я действительно понятия не имею. Все, что я могу сказать, это то, что в macOS это абсолютный путь.   -  person Indiana Kernick    schedule 04.05.2019
comment
@ πάνταῥεῖ Это всегда абсолютный путь в macOS, но, вероятно, нигде в другом месте   -  person Indiana Kernick    schedule 04.05.2019
comment
@ Kerndog73 Определенно не с системами Linux. Это просто то, что было введено в оболочку или использовалось в панели запуска пользовательского интерфейса.   -  person πάντα ῥεῖ    schedule 04.05.2019
comment
Как насчет .? Или это должен быть абсолютный путь?   -  person L. F.    schedule 04.05.2019
comment
Вы можете получить абсолютный путь, используя std::filesystem, текущий каталог и argv[0], но он по-прежнему не переносится, поскольку ничего не говорит о том, что входит в argv[0] в C++ Стандарте.   -  person Galik    schedule 04.05.2019
comment
Я думаю, что std::filesystem::absolute сделает то, что вы хотите (создайте std::filesystem::path объект с использованием argv[0]).   -  person Phil Brubaker    schedule 04.05.2019


Ответы (1)


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

Даже использование 1-го argv аргумента не гарантирует, что он будет содержать полный путь. исполняемого файла.
Системы, которые я знаю, просто передадут строку, которая использовалась для запуска программы.
Учитывая, что эту проблему можно решить с помощью переменной среды PATH, нет никакой гарантии, что вы увидите там полный путь .

Однако для этого есть несколько методов, специфичных для ОС:

person πάντα ῥεῖ    schedule 04.05.2019
comment
Вы можете использовать current_path для преобразования относительных путей в абсолютный путь. Но даже тогда это OS зависит. Хотя, я думаю, он должен работать на большинстве систем. - person Galik; 04.05.2019
comment
@Galik Текущий рабочий каталог не имеет абсолютно ничего общего с путем к исполняемому файлу. - person πάντα ῥεῖ; 04.05.2019
comment
Не само по себе. В некоторых случаях вам все равно придется использовать его вместе с PATH. - person Galik; 04.05.2019