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?
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.
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).
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.
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.