Wie erhalte ich den absoluten Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux?
Im Falle von Windows haben wir die _fullpath()
API. Mit anderen Worten, ich meine, was analog zur API ist _fullpath
von Windows unter Linux?
Jay
Wie erhalte ich den absoluten Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux?
Im Falle von Windows haben wir die _fullpath()
API. Mit anderen Worten, ich meine, was analog zur API ist _fullpath
von Windows unter Linux?
entspannen
Wie Paul erwähnt, verwenden realpath()
. Bitte beachten Sie jedoch, dass da viele Dateisysteme in Linux unterstützt werden harte Linkskann jedes angegebene Verzeichnis eine Reihe verschiedener absoluter Pfade haben.
Jede Datei kann das mit Sicherheit. Feste Links zu Verzeichnissen werden nicht unbedingt unterstützt. Symlinks sorgen auch für einige Verwirrung, wenn es darum geht, den “echten” Pfad zu bestimmen.
– Vatine
26. Februar 2010 um 13:28 Uhr
@unwind, Danke für die Info. Wenn aufgrund von Hardlinks ein bestimmtes Verzeichnis in mehrere verschiedene absolute Pfade aufgelöst wird, wie wird sich die Realpath-API verhalten?
– Jay
26. Februar 2010 um 13:35 Uhr
Hardlinks zu Verzeichnissen werden von den meisten Dateisystemen als böse angesehen und verboten.
– edgar.holleis
26. Februar 2010 um 13:36 Uhr
Ich bin ein bisschen verwirrt. Ist es möglich, dass ein bestimmtes Verzeichnis in viele verschiedene absolute Pfade aufgelöst wird? Wenn ja, was wird dann das Verhalten von realpath sein?
– Jay
26. Februar 2010 um 13:55 Uhr
@Jay es wirkt sich nicht auf die Auflösung eines relativen Pfads in einen absoluten Pfad aus.
– Otto Allmendinger
26. Februar 2010 um 19:56 Uhr
Martin Wickmann
Probier das aus 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;
}
Bitte verwenden Sie PATH_MAX statt 100
– Speed8ump
23. Februar 2015 um 16:09 Uhr
Dieser Code ist, wie oben erwähnt, unsicher und fehlerhaft. Tun nicht so einen kleinen Puffer geben realpath
was höchstwahrscheinlich über die Puffergröße hinaus schreiben wird (da es erfordert eine Länge von PATH_MAX). Selbst wenn das Programm nicht abstürzt, könnte dieser Code je nach Variablenlayout zu Sicherheitslücken führen, wenn ein Angreifer den zu lösenden ursprünglichen Pfad kontrollieren kann. Das Handbuch empfiehlt, NULL als zweiten Parameter zu übergeben und zu lassen realpath
Weisen Sie Speicher zu, um sicherzustellen, dass keine Probleme mit PATH_MAX-Definitionen auftreten, beginnend mit POSIX 2008.
– Steve Dodier-Lazaro
9. August 2015 um 14:30 Uhr
Ich denke, es ist ein guter Gedanke, sich immer daran zu erinnern, dass PATH_MAX einfach nicht ist: insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html
– Ciro Costa
13. August 2015 um 17:45 Uhr
Dort ist der realpath
aus stdlib.h
Unter RedHat 5.3 ist realpath nicht vorhanden, aber readlink ist installiert. Sie können es für relative Pfade und Symlinks verwenden und es löst Symlinks rekursiv für Sie auf. Es ist daher meiner Meinung nach eine bessere Option als Realpath
readlink -f .
Zebooka
Das ist auch ein anderer nützlicher Weg, wie “readlink -m $filename”
Zunächst einmal funktioniert es, ohne dass eine Zieldatei vorhanden sein muss. Zweitens wird es mit Symlinks umgehen und einen wirklich echten Pfad erhalten.
Bimo
// 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();
}
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.
– Kaleb Kleveter
4. Januar 2017 um 14:50 Uhr
Und es ist nicht einmal C.
– Nisse Engström
4. Januar 2017 um 15:26 Uhr
Da dies mit markiert wurde
c
dies ist wahrscheinlich ein Duplikat von stackoverflow.com/questions/229012/…– bfontaine
1. Oktober 2013 um 16:13 Uhr