2010-02-26 2 views
12

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

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

+0

Поскольку это был помечен 'c', это, вероятно, дубликат http://stackoverflow.com/questions/229012/getting-absolute- path-of-a-file – bfontaine

ответ

14

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

+0

Любой файл может, конечно. Жесткие ссылки на каталоги не обязательно поддерживаются. Символы также вызывают некоторую путаницу, когда он приходит к определению «реального» пути. – Vatine

+0

@unwind, Спасибо за информацию. Если из-за жестких ссылок, если данный каталог разрешает несколько разных абсолютных путей, каково будет поведение API реального пути? – Jay

+4

Жесткие ссылки на каталоги считаются злыми и запрещены большинством файловых систем. –

6

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

$ man realpath 

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

3

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

+2

Я сразу же подумал о реальном пути, но я был ошеломлен * - * ошеломлен * Я говорю - когда я увидел ваш ответ, показывающий, что 'realpath' находится в' stdlib.h'. Несомненно, что * не может быть правдой, считая, что 'realpath' не является частью библиотеки C. Послушай, это правда. Я ошарашен. Что такое хорошо сформированная программа, которая определяет свою собственную функцию с именем «realpath»? Эти парни POSIX сработали! * Амок * Я говорю! –

+0

Дэн: Пока они вызывают свой компилятор в режиме «строгого соответствия» и не определяют макросов, которые вызывают неопределенное поведение (например, '_XOPEN_SOURCE'), они должны быть в порядке. – caf

13

Проверьте функцию 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; 
} 
+0

Используйте PATH_MAX вместо 100 – Speed8ump

+2

Этот код небезопасен и неисправен, как указано выше. Не ** ** дайте такой маленький буфер 'realpath', который скорее всего будет писать за пределами размера буфера (так как он * требует * длины PATH_MAX). Даже если программа не сбой, этот код может привести к уязвимостям безопасности в зависимости от макета переменной, если противник может контролировать исходный путь, который должен быть разрешен. В руководстве рекомендуется передать NULL в качестве второго параметра и позволить 'realpath' выделять память для обеспечения отсутствия проблем с определениями PATH_MAX, начиная с POSIX 2008. –

+0

Я думаю, что хорошо подумать, чтобы всегда помнить, что PATH_MAX просто не является: http://insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html –

0

также еще один полезный способ, как «readlink -m $ файла»

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

1

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

 
readlink -f . 
-1
// For C++ with Gnome Gtkmm3 libraries 
#include <glibmm.h> 
#include <giomm.h> 

    string PathRel2Abs(string relpath) { 
    Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(relpath); 
    return file->get_path(); 
} 
+1

Обычно рекомендуется добавить некоторые пояснения к вашему сообщению о том, как работает код. Это помогает более новым разработчикам понять, что делает код. –

+0

И это даже не C. –