Подтвердить что ты не робот

Получить абсолютный путь с boost:: filesystem:: path

Мой текущий рабочий каталог находится в /home/myuser/program, я создал объект boost::filesystem::path, указывающий на него. Я добавил /../somedir, чтобы он стал /home/myuser/program/../somedir. Но мне нужно получить свой разрешенный абсолютный путь, который будет /home/myuser/somedir.

Я пробовал в течение длительного времени, и я не нашел никакого способа в их ссылке для этого. Существует метод под названием make_absolute, который, как представляется, должен делать то, что я ожидаю, но я должен дать ему "корневой" аргумент пути. Что это должно быть? действительно ли мне нужно сделать это, чтобы получить настоящий абсолютный путь? Есть ли другой способ?

4b9b3361

Ответ 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".

Проверьте документы: вам не нужно ничего давать; он имеет второй параметр по умолчанию. А именно, текущий каталог.

Относительные пути относятся к некоторому каталогу. Таким образом, при абсолютном абсолютном пути вам нужно знать, что должно быть абсолютным относительно. Это "корневой путь": каталог, к которому он относится.