Wie erhalte ich den absoluten Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux?

Lesezeit: 3 Minuten

Benutzer-Avatar
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?

  • Da dies mit markiert wurde cdies ist wahrscheinlich ein Duplikat von stackoverflow.com/questions/229012/…

    – bfontaine

    1. Oktober 2013 um 16:13 Uhr

Benutzer-Avatar
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

Benutzer-Avatar
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


Versuchen realpath:

$ man realpath

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

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 .

Benutzer-Avatar
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.

Benutzer-Avatar
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

1364550cookie-checkWie erhalte ich den absoluten Pfad für einen bestimmten relativen Pfad programmgesteuert in Linux?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy