2009-04-10 3 views
4

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

Я на Linux с помощью г ++, Thanx заранее

+1

argc - количество аргументов; argv - вектор аргумента (массив указателей на строки). argv [0] не усекается пространствами; argv [0] выбирается программой, которая запускает программу и не обязательно имеет какое-либо отношение к пути программы. Не добавляйте getcwd(), если argv [0] запускает '/'. –

+0

У вас есть доступ к библиотеке boost? –

+0

Подождите секунду. Вам нужен «исполняемый путь» или «каталог, из которого выполняется исполняемый файл»? –

ответ

8

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

См. here for details.

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

+0

«... это не UNIX-форма ...» Какая форма? Я думал, что это не ANY_OS_FORM. –

+0

Как плинтус рекомендует: добавить конфигурационный файл/каталог для пользователя/системы и найти полные пути. Например, глобальные файлы конфигурации должны находиться в/etc, в то время как пользовательские файлы конфигурации обычно находятся в ~ /. rc для файла или под ~ /. Справочник. –

+0

Mykola - это форма Macintosh/Windows 1980-х годов. Мое приложение живет в одной папке, и его файлы поддержки живут относительно него. Чтобы найти файлы поддержки, сначала обнаруживается, где находится приложение. – plinth

0

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

2

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

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

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

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

#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

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 
Смежные вопросы