it-swarm.com.de

Holen Sie sich den absoluten Pfad mit boost :: filesystem :: path

Mein aktuelles Arbeitsverzeichnis befindet sich unter /home/myuser/program. Ich habe ein boost::filesystem::path-Objekt erstellt, das darauf zeigt. Ich habe /../somedir angehängt, damit es /home/myuser/program/../somedir wird. Aber ich muss seinen absoluten Pfad auflösen, der /home/myuser/somedir wäre.

Ich habe schon lange versucht und finde keine Methode in deren Referenz , um dies zu tun. Es gibt eine Methode namens make_absolute, die anscheinend das tun soll, was ich erwarte, aber ich muss ein "root" -Pfadargument angeben. Welches sollte es sein? muss ich das wirklich tun, um den absoluten absoluten Weg zu finden? Gibt es einen anderen Weg?

27
Mario

Sie sagen, Sie möchten einen absoluten Pfad, aber Ihr Beispiel zeigt, dass Sie bereits einen absoluten Pfad haben. Das Entfernen der ..-Komponenten eines Pfads wird als canonicalization bezeichnet. Dazu sollten Sie canonical aufrufen. Es passiert auch, dass Sie die Aufgabe absolute ausführen, so dass Sie nicht zuerst absolute oder make_absolute aufrufen müssen. Die make_absolute-Funktion erfordert einen Basispfad. Sie können es current_path() übergeben, wenn Sie nichts besseres haben.

23
Rob Kennedy

Update, da dies bei absoluten Pfaden immer noch der Top-Hit von Google zu sein scheint: 

Ab Boost 1.57 wurden einige der zuvor vorgeschlagenen Funktionen inzwischen entfernt.

Die Lösung, die für mich funktioniert hat, war

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

(mit der freistehenden Methode canonical () , definiert in boost/filesystem/operations.hpp, die automatisch über boost/filesystem.hpp eingefügt wird)

Wichtig: Wenn Sie kanonisch über einen Pfad aufrufen, der nicht vorhanden ist (z. B. Sie möchten eine Datei erstellen), wird eine Ausnahme ausgelöst. In diesem Fall ist Ihre nächste beste Wette wahrscheinlich boost :: filesystem :: absolute (). Es funktioniert auch für nicht vorhandene Pfade, es werden jedoch keine Punkte in der Mitte des Pfads entfernt (wie in a/b/c /../../d.txt) . Hinweis: Stellen Sie sicher, dass relativeTo sich auf ein Verzeichnis bezieht, und rufen Sie parent_path () in Pfaden auf, die auf Dateien verweisen (z. B. die geöffnete Datei, die ein Verzeichnis oder einen Dateipfad relativ zu sich selbst enthielt).

11
Daniel

Die Dokumentation zeigt dass der make_absolute einen optionalen zweiten Parameter hat, der standardmäßig Ihrem aktuellen Pfad entspricht:

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

Versuchen Sie es ohne den zweiten Parameter und prüfen Sie, ob er die gewünschten Ergebnisse liefert.

1
Mr. Llama

Ich muss ein "root" -Pfadargument angeben.

Überprüfen Sie die Dokumente: Sie haben nicht haben, um etwas zu geben; es hat einen voreingestellten zweiten Parameter. Nämlich das aktuelle Verzeichnis.

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

0
Nicol Bolas