Каталог работающей программы на Linux? - PullRequest
4 голосов
/ 10 апреля 2009

Эй, я пишу программу (что-то вроде типа просмотра электронных книг), и она загружает текстовые файлы из папки, внутри которой находится исполняемый файл. Это вызывает у меня некоторые проблемы, поскольку, если я, например, запускаю программу из другого каталога с помощью команды "./folder/folder/program", моя программа не найдет текст, потому что рабочий каталог неверен. У меня не может быть абсолютного каталога, потому что я хотел бы, чтобы программа была переносимой. Есть ли способ получить точный каталог, из которого выполняется исполняемый файл, даже если он был запущен из другого каталога. Я слышал, что может комбинировать argc [0] и getcwd (), но argc усекается, когда в каталоге есть пробел, (я думаю?), Поэтому я хотел бы избежать этого, если возможно.

Я использую g ++ в Linux, заранее спасибо

Ответы [ 4 ]

8 голосов
/ 10 апреля 2009

EDIT - не используйте getcwd (), это просто там, где пользователь не там, где находится исполняемый файл.

Подробнее см. .

В linux / proc / / exe или / proc / self / exe должна быть символическая ссылка на ваш исполняемый файл. Как и другие, я думаю, что более важный вопрос «зачем вам это?» Это не совсем форма UNIX, чтобы использовать путь к исполняемому файлу для поиска вспомогательных файлов. Вместо этого вы используете переменную окружения или местоположение по умолчанию или следуйте одному из других соглашений для поиска местоположения вспомогательных файлов (т. Е. ~ /. rc).

2 голосов
/ 10 апреля 2009

Когда вы добавляете книгу в свою библиотеку, вы можете запомнить ее абсолютный путь.
Неплохо, когда ваша программа полагается на то, что она будет запускаться из рабочего каталога, а не из какого-либо другого каталога. Вот почему существуют всевозможные «ссылки» с параметром «рабочий каталог».

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

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

Я до сих пор не вижу причины узнать ваше текущее имя.

#include <boost/filesystem/convenience.hpp>

#include <iostream>
#include <ostream>

int main(int argc, char** argv)
{
    boost::filesystem::path argvPath( argv[0] );
    boost::filesystem::path executablePath( argvPath.parent_path() );
    boost::filesystem::path runPath( boost::filesystem::initial_path() );

    std::cout << executablePath << std::endl;
    std::cout << runPath << std::endl;
    return 0;
}
0 голосов
/ 10 апреля 2009

argv[0] не усекается при наличии пробелов. Однако он будет иметь имя программы, а не путь, когда программа запускается из каталога, указанного в переменной среды PATH.

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

На мой взгляд, лучший способ получить то, что вы хотите, - это использовать скрипт оболочки для запуска самой программы. Это очень похоже на запуск Firefox в системах Linux. Оболочка помещает имя скрипта в $0, и эта переменная всегда будет иметь путь. Затем вы можете использовать переменную среды или аргумент командной строки, чтобы указать вашей программе расположение файлов данных, например:

dir=`dirname "$0"`
cd "$dir/../data/"
"$dir/real-program"

И я бы устроил вашу программу так, чтобы ее файлы были примерно такими:

install-dir/bin/program
install-dir/bin/real-program
install-dir/etc/config
install-dir/data/book-file.mobi
0 голосов
/ 10 апреля 2009

Вы можете получить путь к запущенной программе, прочитав командную строку. В Linux вы можете получить командную строку, прочитав папку / proc как / proc / PID / CommandLine

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...