Получить абсолютный путь с boost:: filesystem:: path
Мой текущий рабочий каталог находится в /home/myuser/program
, я создал объект boost::filesystem::path
, указывающий на него. Я добавил /../somedir
, чтобы он стал /home/myuser/program/../somedir
. Но мне нужно получить свой разрешенный абсолютный путь, который будет /home/myuser/somedir
.
Я пробовал в течение длительного времени, и я не нашел никакого способа в их ссылке для этого. Существует метод под названием make_absolute
, который, как представляется, должен делать то, что я ожидаю, но я должен дать ему "корневой" аргумент пути. Что это должно быть? действительно ли мне нужно сделать это, чтобы получить настоящий абсолютный путь? Есть ли другой способ?
Ответы
Ответ 1
Вы говорите, что хотите абсолютный путь, но ваш пример показывает, что у вас уже есть абсолютный путь. Процесс удаления компонентов ..
пути известен как канонизация. Для этого вам следует позвонить canonical
. Также выполняется задача absolute
, поэтому вам не нужно сначала вызывать absolute
или make_absolute
. Для функции make_absolute
требуется базовый путь; вы можете передать его current_path()
, если у вас нет ничего лучшего.
Ответ 2
Обновить, так как это по-прежнему кажется лучшим хитом Google в отношении абсолютных путей:
Начиная с Boost 1.57, некоторые из ранее предложенных функций были удалены.
Решение, которое работало для меня, было
boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);
(используя автономный метод canonical(), определенный в boost/filesystem/operations.hpp, который автоматически включается через boost/filesystem.hpp)
Важно: вызов canonical на пути, который не существует (например, вы хотите создать файл), выдает исключение. В этом случае ваш следующий лучший вариант, вероятно, будет boost:: filesystem:: absolute(). Он также будет работать для несуществующих
пути, но не будет избавляться от точек в середине пути (как в файле /b/c/../../d.txt).
Примечание. Убедитесь, что relativeTo ссылается на каталог, вызывая parent_path() на пути, ссылающиеся на файлы (например, открытый файл, содержащий каталог или путь к файлу относительно самого себя).
Ответ 3
Документация показывает, что make_absolute
имеет необязательный второй параметр, который по умолчанию соответствует вашему текущему пути:
path absolute(const path& p, const path& base=current_path());
Попробуйте без второго параметра и посмотрите, вернет ли он результаты, которые вы ищете.
Ответ 4
Я должен дать ему аргумент пути "root".
Проверьте документы: вам не нужно ничего давать; он имеет второй параметр по умолчанию. А именно, текущий каталог.
Относительные пути относятся к некоторому каталогу. Таким образом, при абсолютном абсолютном пути вам нужно знать, что должно быть абсолютным относительно. Это "корневой путь": каталог, к которому он относится.