Namensräume
Varianten
Aktionen

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 [aend()).
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

#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

komponiert einen relativen Pfad
(Funktion) [bearbeiten]