Как получить каталог, из которого запускается программа? - PullRequest
248 голосов
/ 27 сентября 2008

Существует ли платформо-независимый и файлово-независимый метод для получения полного пути к каталогу, из которого программа работает с использованием C / C ++? Не путать с текущим рабочим каталогом. (Пожалуйста, не предлагайте библиотеки, если они не стандартные, такие как clib или STL.)

(Если нет метода, независимого от платформы / файловой системы, приветствуются предложения, которые работают в Windows и Linux для конкретных файловых систем.)

Ответы [ 21 ]

5 голосов
/ 27 сентября 2008

Для Win32 GetCurrentDirectory должно сработать.

3 голосов
/ 10 июня 2013

Для системы Windows на консоли вы можете использовать системную (dir) команду. И консоль дает вам информацию о каталоге и т. Д. Прочтите о команде dir на cmd. Но для Unix-подобных систем я не знаю ... Если эта команда запущена, прочитайте команду bash. ls не отображает каталог ...

Пример:

int main()
{
    system("dir");
    system("pause"); //this wait for Enter-key-press;
    return 0;
}
3 голосов
/ 28 января 2010

Просто чтобы запоздало навалиться сюда ...

стандартного решения не существует, поскольку языки не зависят от базовых файловых систем, поэтому, как говорили другие, концепция файловой системы на основе каталогов выходит за рамки языков c / c ++.

Кроме того, вам нужен не текущий рабочий каталог, а каталог, в котором запущена программа, который должен учитывать, как программа попала туда, где она находится - то есть была ли она порождена как новый процесс с помощью форка и т. д. Чтобы получить каталог, в котором запущена программа, как показали решения, требуется, чтобы вы получали эту информацию из структур управления процессами рассматриваемой операционной системы, которая является единственным авторитетом в этом вопросе. Таким образом, по определению, это решение для конкретной ОС.

2 голосов
/ 19 февраля 2014
#include <windows.h>
using namespace std;

// The directory path returned by native GetCurrentDirectory() no end backslash
string getCurrentDirectoryOnWindows()
{
    const unsigned long maxDir = 260;
    char currentDir[maxDir];
    GetCurrentDirectory(maxDir, currentDir);
    return string(currentDir);
}
1 голос
/ 22 августа 2016

Команда linux bash progname сообщит путь к программе.

Даже если можно выполнить команду which из вашей программы и направить вывод в файл tmp и программу впоследствии читает этот файл tmp, он не сообщит вам, выполняется ли эта программа. Он только сообщает вам, где находится программа с таким именем.

Требуется получить идентификатор вашего процесса и разобрать путь к имени

В моей программе я хочу знать, была ли программа выполняется из каталога bin пользователя или из другого пути или из / usr / bin. / usr / bin будет содержать поддерживаемую версию. Мне кажется, что в Linux есть единственное решение, которое переносимо.

1 голос
/ 21 апреля 2015

Для относительных путей, вот что я сделал. Мне известен возраст этого вопроса, я просто хочу предложить более простой ответ, который работает в большинстве случаев:

Скажем, у вас есть такой путь:

"path/to/file/folder"

По какой-то причине встроенные в Linux исполняемые файлы, созданные в Eclipse, прекрасно работают с этим. Тем не менее, окна становятся очень запутанными, если использовать такой путь для работы!

Как указывалось выше, есть несколько способов получить текущий путь к исполняемому файлу, но самый простой способ, который я нахожу работающим в большинстве случаев, это добавить это к ПЕРЕДНЕМУ вашего пути:

"./path/to/file/folder"

Просто добавив "./", вы получите сортировку! :) Затем вы можете начать загрузку из любой директории, которую пожелаете, при условии, что она выполняется с самим исполняемым файлом.

РЕДАКТИРОВАТЬ: Это не будет работать, если вы попытаетесь запустить исполняемый файл из code :: blocks, если используется среда разработки, так как по какой-то причине code :: blocks не загружает вещи правильно ...: D

РЕДАКТИРОВАТЬ 2: Я обнаружил несколько новых вещей: если вы указываете статический путь, подобный этому, в своем коде (при условии, что вам нужно загрузить Example.data):

"resources/Example.data"

Если вы затем запустите свое приложение из фактического каталога (или в Windows вы сделаете ярлык и установите рабочий каталог в каталог вашего приложения), тогда оно будет работать так. Помните об этом при отладке проблем, связанных с отсутствующими путями к ресурсам / файлам. (Особенно в IDE, которые устанавливают неправильный рабочий каталог при запуске исполняемого файла сборки из IDE)

0 голосов
/ 27 сентября 2008

На платформах POSIX вы можете использовать getcwd () .

В Windows вы можете использовать _getcwd () , так как использование getcwd () устарело.

Для стандартных библиотек, если бы Boost был достаточно стандартным для вас, я бы предложил Boost :: filesystem, но, похоже, они удалили нормализацию пути из предложения. Возможно, вам придется подождать, пока TR2 не станет легкодоступным для полностью стандартного решения.

0 голосов
/ 28 сентября 2008

Boost FileSystem initial_path() ведет себя как POSIX getcwd(), и ни один не делает то, что вы хотите, сам по себе, но добавление argv[0] к любому из них должно сделать это.

Вы можете заметить, что результат не всегда хорош - вы можете получить такие вещи, как /foo/bar/../../baz/a.out или /foo/bar//baz/a.out, но я считаю, что это всегда приводит к правильному пути с именем исполняемого файла (обратите внимание, что последовательные косые черты в пути свернуты до одного).

Ранее я писал решение, используя envp (третий аргумент main(), который работал в Linux, но не казался работоспособным в Windows, поэтому я, по сути, рекомендую то же решение, что и кто-то другой ранее, но с дополнительное объяснение того, почему это действительно правильно, даже если результаты не очень красивые.

0 голосов
/ 04 октября 2017

Решение для библиотеки (хотя я знаю, что об этом не просили). Если вы используете Qt: QCoreApplication::applicationDirPath()

0 голосов
/ 09 мая 2019

Используйте realpath() в stdlib.h как это:

char *working_dir_path = realpath(".", NULL);
...