Как программно получить абсолютный путь для заданного относительного пути в Linux?

Как программно получить абсолютный путь для заданного относительного пути в Linux?

В случае Windows у нас есть _fullpath() API. Другими словами, я имею в виду, что является аналогом API _fullpath Windows в Linux?


person Jay    schedule 26.02.2010    source источник
comment
Поскольку это было помечено c, это, вероятно, дубликат stackoverflow.com/questions/229012/   -  person bfontaine    schedule 01.10.2013


Ответы (7)


Как упомянул Пол, используйте realpath(). Обратите внимание, что, поскольку многие файловые системы в Linux поддерживают жесткие ссылки, любой заданный каталог может иметь количество различных абсолютных путей.

person unwind    schedule 26.02.2010
comment
Любой данный файл может, конечно. Жесткие ссылки на каталоги не обязательно поддерживаются. Символические ссылки также вызывают некоторую путаницу, когда дело доходит до определения реального пути. - person Vatine; 26.02.2010
comment
@unwind, спасибо за информацию. Если из-за жестких ссылок данный каталог разрешается несколькими разными абсолютными путями, как будет вести себя API RealPath? - person Jay; 26.02.2010
comment
Жесткие ссылки на каталоги считаются злом и запрещены большинством файловых систем. - person edgar.holleis; 26.02.2010
comment
Я немного запутался. Возможно ли, что данный каталог разрешается многими различными абсолютными путями? Если да, то каким будет поведение realpath? - person Jay; 26.02.2010
comment
@Jay, это не влияет на преобразование относительного пути в абсолютный. - person Otto Allmendinger; 26.02.2010
comment
realpath разрешает имя так, как вы ожидаете — путем (рекурсивного) выравнивания компонентов /../ и /./ и разрешения символических ссылок. Проблема с несколькими путями просто означает, что имя, которое вы получаете в конце, не обязательно уникально для данного файла (поскольку файл не обязательно имеет единственное истинное имя). - person caf; 27.02.2010
comment
Конечно, NTFS (то есть Windows) также имеет жесткие ссылки со всеми теми же сложностями: msdn.microsoft.com/en-us/library/windows/desktop/. - person bart; 04.01.2012
comment
Кажется, нет способа разрешить путь к заданному абсолютному базовому пути, отличному от текущего рабочего каталога. О, ребята, UNIX иногда воняет, поэтому я должен развернуть свою собственную функцию. - person Lothar; 18.07.2012

Ознакомьтесь с функцией realpath.

#include <stdlib.h> 
#include <stdio.h> 
#include <linux/limits.h>
int main() 
{ 
        char resolved_path[PATH_MAX]; 
        realpath("../../", resolved_path); 
        printf("\n%s\n",resolved_path); 
        return 0; 
} 
person Martin Wickman    schedule 26.02.2010
comment
Пожалуйста, используйте PATH_MAX вместо 100 - person Speed8ump; 23.02.2015
comment
Этот код небезопасен и содержит ошибки, как указано выше. Не давайте realpath такой маленький буфер, который, скорее всего, будет записывать больше размера буфера (поскольку для этого требуется длина PATH_MAX). Даже если программа не дает сбоев, этот код может привести к уязвимостям безопасности в зависимости от расположения переменных, если злоумышленник может контролировать исходный путь, который необходимо разрешить. Руководство рекомендует передавать NULL в качестве второго параметра и позволить realpath выделять память, чтобы гарантировать отсутствие проблем с определениями PATH_MAX, начиная с POSIX 2008. - person Steve Dodier-Lazaro; 09.08.2015
comment
Я думаю, что всегда полезно помнить, что PATH_MAX просто не является: insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html - person Ciro Costa; 13.08.2015

Попробуйте realpath:

$ man realpath

Это также доступно в BSD, OS X и др.

person Paul R    schedule 26.02.2010

Существует realpath от stdlib.h

person Otto Allmendinger    schedule 26.02.2010
comment
Я тоже сразу подумал о realpath, но был ошеломлен -- ошеломлен, я говорю, -- когда увидел ваш ответ, показывающий, что realpath находится в stdlib.h. Конечно, не может быть правдой, учитывая, что realpath не является частью библиотеки C. Вот и правда, это правда. Я ошеломлен. Что должна делать хорошо сформированная программа, которая определяет свою собственную функцию с именем realpath? Эти ребята из POSIX взбесились! Неистовство Я говорю! - person Dan Moulding; 27.02.2010
comment
Дэн: Пока они вызывают свой компилятор в режиме строгого соответствия и не определяют никаких макросов, вызывающих неопределенное поведение (например, _XOPEN_SOURCE), все должно быть в порядке. - person caf; 27.02.2010

Работая на RedHat 5.3, realpath не существует, но установлен readlink. Вы можете использовать его для относительных путей и символических ссылок, плюс он будет рекурсивно разрешать символические ссылки для вас. Таким образом, на мой взгляд, это лучший вариант, чем realpath

readlink -f .
person Lionel    schedule 10.10.2012

Это также еще один полезный способ, например "readlink -m $filename"

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

person Zebooka    schedule 11.03.2010

person    schedule
comment
Обычно хорошей идеей является добавление пояснений к вашему сообщению о том, как работает код. Это помогает новым разработчикам узнать, что делает код. - person Caleb Kleveter; 04.01.2017
comment
И это даже не С. - person Nisse Engström; 04.01.2017