Получить абсолютный путь из std::filesystem::path С++

У меня есть этот кусок кода

auto path = std::filesystem::path("/root/home/../opt/.");

Я пробовал std::filesystem::absolute(), но потом понял, что это не тот результат, которого я хочу

Мой вопрос в том, как я могу преобразовать этот относительный путь в абсолютный путь, чтобы результат был "/root/opt/".

Я использую c++17 на Debian g++-9.


person Dev-il    schedule 04.07.2020    source источник
comment
Вам нужен канонический путь (ссылка).   -  person f9c69e9781fa194211448473495534    schedule 04.07.2020


Ответы (2)


Используйте std::filesystem::canonical, чтобы превратить путь в абсолютный путь с удалением всех .. (ссылка) :

auto path = std::filesystem::canonical("/root/home/../opt/.");

Дает тебе:

"/root/opt"
person f9c69e9781fa194211448473495534    schedule 04.07.2020

Вы также можете использовать эту функцию.

 std::cout << std::filesystem::path("/root/home/../opt/.").lexically_normal()    << std::endl;
person Farhad Sarvari    schedule 04.07.2020
comment
Стоит отметить: в отличие от другого ответа (canonical), метод lexically_normal не будет пытаться разрешать символические ссылки и фактически вообще не будет выполнять никаких операций с файловой системой. Это просто метод манипулирования строками, отсюда и название. В зависимости от ситуации, это может быть или не быть тем, что вы хотите. - person Arthur Tacca; 04.07.2020