Открыть файл относительно исполняемого модуля - PullRequest
3 голосов
/ 01 февраля 2011

Я знаю, что не самая лучшая идея открыть файл, ограничивающий его размещение в том же каталоге, что и исполняемый модуль. Но есть инструмент, который мне приказали запрограммировать, точно с этими спецификациями.

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

Я не хочу использовать функцию WinAPI GetCurrentDirectory для сохранения переносимости. Инструмент не может работать, если файл не может быть открыт.

Обычно я использую boost :: filesystem в качестве библиотеки ввода / вывода. Таким образом, я не очень знаком с std-библиотекой.

Моей первой идеей было просто передать путь к файлу в std :: ifstream :: open (). Но, похоже, это не работает для относительных путей.

Что я могу сделать, чтобы покрыть мое требование?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

К сожалению, нет легко переносимого способа сделать это. В частности, GetCurrentDirectory может не возвращать тот же каталог, что и ваш исполняемый модуль - в Windows простое открытие окна выбора общего диалогового окна приведет к изменению вашего текущего каталога! На других платформах вы вряд ли начнете с одного и того же каталога вообще (опять же, у вас также может не быть доступа для записи, но это относится и к современным окнам ...)

Как правило, в Windows вы можете использовать GetModuleFileName, чтобы найти местоположение вашего модуля, а затем удалить часть имени файла. В Linux вызовите readlink on /proc/self/exe для основного исполняемого файла или munge вокруг в /proc/self/maps для отображения, соответствующего вашему сегменту кода для динамической библиотеки. О других ОС я понятия не имею.

0 голосов
/ 01 февраля 2011

Просто передайте относительное имя файла.Он будет взят относительно текущего каталога.

...