2010-02-26 12 views
12

Wie wird der absolute Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux abgerufen?Wie wird der absolute Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux abgerufen?

In Windows haben wir die _fullpath() API. Mit anderen Worten, meine ich, was ist eine analoge API zu _fullpath von Windows in Linux?

+0

Da dies mit 'c' markiert wurde, ist dies wahrscheinlich ein Duplikat http://stackoverflow.com/questions/229012/getting-absolute- Pfad der Datei – bfontaine

Antwort

14

Wie Paulus erwähnt realpath() zu verwenden. Bitte beachten Sie jedoch, dass, da viele Dateisysteme in Linux hard links unterstützen, jedes beliebige Verzeichnis eine Anzahl unterschiedlicher absoluter Pfade haben kann.

+0

Jede Datei kann sicher sein. Hard-Links zu Verzeichnissen werden nicht unbedingt unterstützt. Symlinks verursachen auch einige Verwirrung, wenn es darum geht, den "echten" Pfad zu bestimmen. – Vatine

+0

@unwind, Danke für die Info. Wenn aufgrund eines festen Links ein bestimmtes Verzeichnis in mehrere verschiedene absolute Pfade aufgelöst wird, wie verhält sich das Realpath-API? – Jay

+4

Hardlinks zu Verzeichnissen werden von den meisten Dateisystemen als bösartig und verboten angesehen. –

6

Versuchen realpath:

$ man realpath 

Dies ist auch in BSD, OS X verfügbar et al.

3

Es ist die realpath von stdlib.h

+2

Ich dachte sofort an realpath, aber ich war * fassungslos * - * betäubt * ich sage - als ich deine Antwort sah, die zeigte, dass 'realpath' in' stdlib.h' ist. Sicher kann das * nicht wahr sein, wenn man bedenkt, dass 'realpath' nicht Teil der C-Bibliothek ist. Siehe, es ist wahr. Ich bin verblüfft. Was ist ein wohlgeformtes Programm, das seine eigene Funktion namens 'realpath' definiert? Diese POSIX-Leute haben Amok gelaufen! * Amok * sage ich! –

+0

Dan: Solange sie ihren Compiler im "strikt konformen" Modus aufrufen und keine Makros definieren, die undefiniertes Verhalten (wie '_XOPEN_SOURCE') aufrufen, sollten sie OK sein. – caf

13

Überprüfen Sie die realpath Funktion.

#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

Bitte verwenden Sie PATH_MAX anstelle von 100 – Speed8ump

+2

Dieser Code ist unsicher und fehlerhaft, wie oben erwähnt. Tue ** nicht ** einen so kleinen Puffer zu 'realpath', der höchstwahrscheinlich über die Puffergröße hinaus schreiben wird (da * eine Länge von PATH_MAX * erfordert). Selbst wenn das Programm nicht abstürzt, kann dieser Code abhängig vom Layout der Variablen zu Sicherheitslücken führen, wenn ein Angreifer den zu lösenden Originalpfad kontrollieren kann. Das Handbuch empfiehlt, NULL als zweiten Parameter zu übergeben und 'realpath' Speicher zuzuordnen, um keine Probleme mit PATH_MAX-Definitionen zu gewährleisten, beginnend mit POSIX 2008. –

+0

Ich denke, es ist eine gute Idee, immer daran zu denken, dass PATH_MAX einfach nicht ist: http://insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html –

0

Das ist auch eine andere nützliche Art und Weise, wie „Readlink -m $ filename“

Zunächst einmal, es funktioniert ohne Anforderungen an die Zieldatei vorhanden sind. Zweitens wird es mit Symlinks umgehen und wirklich echten Pfad bekommen.

1

Auf RealHat 5.3 läuft realpath nicht, aber readlink ist installiert. Sie können es für relative Pfade und Symlinks verwenden, und es werden Symlinks rekursiv für Sie auflösen. Es ist somit eine bessere Option, dass realpath meiner Meinung nach

 
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

Normalerweise ist es eine gute Idee, Ihrem Beitrag eine Erklärung hinzuzufügen, wie der Code funktioniert. Dies hilft neueren Entwicklern zu wissen, was der Code tut. –

+0

Und es ist nicht einmal C. –

Verwandte Themen