std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate
Von cppreference.com
< cpp | filesystem | path
| path lexically_normal() const; |
(1) | (seit C++17) |
| path lexically_relative( const path& base ) const; |
(2) | (seit C++17) |
| path lexically_proximate( const path& base ) const; |
(3) | (seit C++17) |
1) Gibt *this in normalisierter Form in seinem generischen Format zurück.
2) Gibt *this relativ zu base zurück.
- Zuerst, wenn root_name() != base.root_name() true ist oder is_absolute() != base.is_absolute() true ist oder (!has_root_directory() && base.has_root_directory()) true ist oder ein Dateiname in relative_path() oder base.relative_path() als Stammverzeichnisname interpretiert werden kann, wird ein standardmäßig konstruierter Pfad zurückgegeben.
- Andernfalls wird zuerst das erste nicht übereinstimmende Element von *this und base bestimmt, als ob durch auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()), dann
- wenn a == end() und b == base.end(), wird path(".") zurückgegeben,
- andernfalls wird N als die Anzahl der nicht-leeren Dateinamen-Elemente definiert, die weder dot noch dot-dot im Bereich [b, base.end()) sind, abzüglich der Anzahl der dot-dot-Dateinamen-Elemente, Wenn N < 0 ist, wird ein standardmäßig konstruierter Pfad zurückgegeben,
- andernfalls, wenn N = 0 und a == end() || a->empty(), wird path(".") zurückgegeben,
- andernfalls wird ein Objekt zurückgegeben, das besteht aus
- einem standardmäßig konstruierten path() gefolgt von
- N Anwendungen von operator/=(path("..")), gefolgt von
- einer Anwendung von operator/= für jedes Element im halb-offenen Bereich
[a,end()).
3) Wenn der Wert von lexically_relative(base) kein leerer Pfad ist, gib ihn zurück. Andernfalls gib *this zurück.
Inhalt |
[bearbeiten] Parameter
(keine)
[bearbeiten] Rückgabewert
1) Die normalisierte Form des Pfades.
2) Die relative Form des Pfades.
3) Die proximate Form des Pfades.
[edit] Exceptions
Kann implementierungsdefinierte Ausnahmen auslösen.
[bearbeiten] Anmerkungen
Diese Konvertierungen sind rein lexikalisch. Sie prüfen nicht, ob die Pfade existieren, folgen keinen Symlinks und greifen überhaupt nicht auf das Dateisystem zu. Für Symlink-folgende Gegenstücke von lexically_relative und lexically_proximate siehe relative und proximate.
Unter Windows hat der zurückgegebene path Backslashes (die bevorzugten Trennzeichen).
Auf POSIX ist kein Dateiname in einem relativen Pfad als Stammverzeichnisname zulässig.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <cassert> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { assert(fs::path("a/./b/..").lexically_normal() == "a/"); assert(fs::path("a/.///b/../").lexically_normal() == "a/"); assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d"); assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c"); assert(fs::path("a/b/c").lexically_relative("a") == "b/c"); assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../.."); assert(fs::path("a/b/c").lexically_relative("a/b/c") == "."); assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b"); assert(fs::path("a/b").lexically_relative("/a/b") == ""); assert(fs::path("a/b").lexically_proximate("/a/b") == "a/b"); }
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3070 | C++17 | ein Dateiname, der auch ein Stammverzeichnisname sein kann, kann zu überraschenden Ergebnissen führen | als Fehlerfall behandelt |
| LWG 3096 | C++17 | nachgestellte "/" und "/." werden falsch behandelt | korrigiert |
[bearbeiten] Siehe auch
| (C++17) |
komponiert einen relativen Pfad (Funktion) |