2012-09-28 14 views
24

Mein aktuelles Arbeitsverzeichnis befindet sich unter /home/myuser/program, ich erstellte ein boost::filesystem::path Objekt, das darauf zeigt. Ich fügte /../somedir an, so dass es /home/myuser/program/../somedir wird. Aber ich muss seinen aufgelösten absoluten Pfad bekommen, der /home/myuser/somedir wäre.Absoluter Pfad mit boost :: filesystem :: Pfad

Ich habe lange versucht und ich finde keine Methode in their reference, dies zu tun. Es gibt eine Methode namens make_absolute, die scheinbar das tut, was ich erwarte, aber ich muss ihr ein "Wurzel" -Pfadargument geben. Was sollte es sein? muss ich das wirklich tun, um den wirklichen absoluten Weg zu bekommen? Gibt es einen anderen Weg?

Antwort

21

Sie sagen, Sie wollen einen absoluten Pfad, aber Ihr Beispiel zeigt, dass Sie bereits einen absoluten Pfad haben. Der Prozess zum Entfernen der .. Komponenten eines Pfades ist bekannt als Canonicalization. Dafür sollten Sie canonical anrufen. Es passiert auch, um die Aufgabe von absolute, so dass Sie nicht zuerst absolute oder make_absolute aufrufen müssen. Die make_absolute Funktion benötigt einen Basispfad; Sie können es current_path() übergeben, wenn Sie nichts besseres haben.

+0

Exatly. Ich wollte das Wort "canonical" nicht verwenden, da ich nicht sicher war, ob es auch aufgelöste symbolische Links und dergleichen bedeutete. Ich habe deinen Vorschlag ausprobiert und es hat sofort funktioniert. Vielen Dank. – Mario

+3

Beachten Sie, dass canonical die Ausnahme auslöst, wenn die Datei nicht existiert. Sie könnten also nur den bestehenden Pfad erstellen. –

1

Die documentation shows, dass die make_absolute hat einen optional Sekunden Parameter, der standardmäßig auf Ihrem aktuellen Pfad:

path absolute(const path& p, const path& base=current_path());

Probieren Sie es ohne den zweiten Parameter und sehen, ob sie die Ergebnisse zurückgibt Sie suchen .

+0

Das ist eine der Unstimmigkeiten, die mich ein wenig verärgert haben, in der Dokumentation. Es gibt eine 'make_absolute'-Methode, die einen Parameter hat, wenn ich der Verknüpfung folge, führt sie mich zur Dokumentation einer' absolute() '-Funktion, die zwei Parameter akzeptiert. Wenn Sie es dennoch wie 'absolute (pathObject) .string()' tun, wird derselbe nicht aufgelöste Pfad zurückgegeben. Das hast du vorgeschlagen, richtig? – Mario

0

Ich muss es ein "Wurzel" Pfadargument geben.

Check the docs: Sie nicht haben es nichts zu geben; Es hat einen zweiten Standardparameter. Nämlich das aktuelle Verzeichnis.

Relative Pfade sind relativ zu einem Verzeichnis. Wenn Sie also einen Pfad absolut machen, müssen Sie wissen, was absolut sein sollte relativ zu. Das ist der "Root-Pfad": das Verzeichnis, auf das es sich bezieht.

9

aktualisieren, da dies erscheint noch Googles Top-Hit in Bezug auf absolute Pfade zu sein:

Ab-Boost 1.57 haben einige der zuvor vorgeschlagenen Funktionen seit entfernt worden.

Die Lösung, die für mich gearbeitet wurde

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo); 

(in boost/Dateisystem/operations.hpp die freistehende Methode canonical(), definiert verwenden, die automatisch über boost/filesystem.hpp enthalten)

Wichtig: Wenn canonical auf einem Pfad aufgerufen wird, der nicht existiert (z. B. wenn Sie eine Datei erstellen möchten), wird eine Ausnahme ausgelöst. In diesem Fall ist die nächstbeste Wette wahrscheinlich boost :: filesystem :: absolute(). Es funktioniert auch für nicht existierende Pfade, wird aber keine Punkte in der Mitte des Pfades entfernen (wie in a/b/c /../../ d.txt). Hinweis: Stellen Sie sicher, dass relativeTo auf ein Verzeichnis verweist und parent_path() auf Pfaden aufruft, die auf Dateien verweisen (z.die geöffnete Datei, die ein Verzeichnis oder einen Dateipfad relativ zu sich selbst enthielt).

+0

Was ist eine Beispielpfadzeichenfolge von "previousPath" und "relativeTo"? Ich kann nicht richtig herausfinden, wie die Eingabe in Bezug auf den Pfadstil aussehen muss. –

+0

Vorheriger Pfad könnte etwas wie Pfad ("../../ readme.txt") haben, mit relativerTo = Pfad ("c:/example/test/blah") sollte dies dann zu "c:/example/readme" aufgelöst werden. txt". Nicht sicher, was der relativeTo tut (oder ob eine sinnvolle Eingabe sogar erforderlich ist), wenn der vorherige Pfad bereits absolut ist. – Daniel

Verwandte Themen