2012-06-14 6 views
13

Wie kann ich den absoluten Pfad einer Datei oder eines Verzeichnisses von einem bestimmten relativen Pfad in C/C++ auf GNU/Linux ermitteln?
Ich weiß über realpath(), aber es funktioniert nicht bei nicht vorhandenen Dateien.Wie bekomme ich den absoluten Pfad einer Datei oder eines Verzeichnisses, das * nicht * existiert?

Angenommen, der Benutzer gibt ../non-existant-directory/file.txt ein, und das Arbeitsverzeichnis der Programme lautet /home/user/.
Was ich brauche, ist eine Funktion, die /home/non-existant-directory/file.txt zurückgibt.

Ich brauche diese Funktion, um zu überprüfen, ob ein bestimmter Pfad in einem bestimmten Unterverzeichnis ist oder nicht.

+0

Ich glaube nicht, dass so etwas eingebaut ist. Sie werden den Code selbst schreiben müssen. –

Antwort

10

Versuchen Sie realpath. Wenn dies fehlschlägt, beginnen Sie, die Pfadkomponenten einzeln nacheinander zu entfernen, und wiederholen Sie den Vorgang realpath, bis der Vorgang erfolgreich ist. Fügen Sie dann die entfernten Komponenten wieder in das Ergebnis des erfolgreichen Aufrufs realpath ein.

Wenn Sie sicher sind, dass das enthaltende Verzeichnis vorhanden ist und Sie nur eine Datei erstellen möchten, müssen Sie nur eine Komponente entfernen.

Ein anderer Ansatz wäre, nur erstellen Sie zuerst die Datei, dann rufen Sie realpath.

+0

die erste Lösung funktioniert, danke! –

0

Sie können das aktuelle Verzeichnis erhalten und installieren Sie die folgende Logik:

Wenn der Pfad mit „/“ beginnt, ersetzen Sie das aktuelle Verzeichnis mit der Wurzel

Für jedes Verzeichnis auf dem relativen Pfad erwähnt führen die folgende:

  • Wenn Sie auf den letzten Teil des relativen Pfad sind, hängen Sie es auf den Pfad des aktuellen Verzeichnisses und stoppen: der Pfad des aktuellen Verzeichnisses ist der absolute Pfad.

  • Sonst: Überprüfen Sie, ob ein solches Verzeichnis unter dem aktuellen Verzeichnis existiert.

  • Wenn es existiert, aber ist kein Verzeichnis, Signalfehler (es sei denn, der letzte Eintrag in dem Pfad)

  • Wenn es existiert, und es ist ein Verzeichnis, zu sehen, ob es ein symbolischer Link ist (auf Betriebssystemen, die diese Funktion unterstützen). Wenn ja, ersetzen Sie das aktuelle Verzeichnis durch das angegebene Verzeichnis der symbolischen Verbindung.

  • Wenn es existiert, und es ist ein Verzeichnis, aber nicht ein symbolischer Link, fügen Sie mit diesem Verzeichnis den Pfad des aktuellen Verzeichnisses

  • (dh das aktuelle Verzeichnis mit dem geprüften Unterverzeichnis ersetzen) Wenn nicht Existieren Sie, fügen Sie die verbleibenden Teile des relativen Pfades an den Pfad des aktuellen Verzeichnisses an und stoppen Sie.

+2

Dies ist im Wesentlichen die Neuimplementierung von "realpath" selbst und viel mehr Arbeit, als Sie tun müssen. –

Verwandte Themen