std::filesystem::equivalent
| Definiert in Header <filesystem> |
||
| bool equivalent( const std::filesystem::path& p1, const std::filesystem::path& p2 ); |
(1) | (seit C++17) |
| bool equivalent( const std::filesystem::path& p1, const std::filesystem::path& p2, |
(2) | (seit C++17) |
Prüft, ob die Pfade p1 und p2 auf dieselbe Dateisystementität verweisen.
Wenn p1 oder p2 nicht existieren, wird ein Fehler gemeldet.
Die nicht-werfende Überladung gibt bei Fehlern false zurück.
Inhalt |
[edit] Parameter
| p1, p2 | - | Pfade, die auf Gleichheit geprüft werden sollen. |
| ec | - | Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung |
[edit] Rückgabewert
true, wenn p1 und p2 auf dieselbe Datei oder dasselbe Verzeichnis verweisen und ihr Dateistatus derselbe ist. Andernfalls false.
[edit] Ausnahmen
Jede Überladung, die nicht als noexcept markiert ist, kann std::bad_alloc auslösen, wenn die Speicherzuweisung fehlschlägt.
[edit] Hinweise
Zwei Pfade gelten als auf dieselbe Dateisystementität verweisend, wenn die beiden Kandidatenentitäten, auf die die Pfade aufgelöst werden, sich auf demselben Gerät an demselben Ort befinden. Unter POSIX bedeutet dies, dass die Mitglieder st_dev und st_ino ihrer POSIX stat-Struktur, die wie durch POSIX stat() erhalten werden, gleich sind.
Insbesondere sind alle Hardlinks für dieselbe Datei oder dasselbe Verzeichnis äquivalent, und ein Symlink und sein Ziel auf demselben Dateisystem sind äquivalent.
[edit] Beispiel
#include <cstdint> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { // hard link equivalency fs::path p1 = "."; fs::path p2 = fs::current_path(); if (fs::equivalent(p1, p2)) std::cout << p1 << " is equivalent to " << p2 << '\n'; // symlink equivalency for (const fs::path lib : {"/lib/libc.so.6", "/lib/x86_64-linux-gnu/libc.so.6"}) { try { p2 = lib.parent_path() / fs::read_symlink(lib); } catch (std::filesystem::filesystem_error const& ex) { std::cout << ex.what() << '\n'; continue; } if (fs::equivalent(lib, p2)) std::cout << lib << " is equivalent to " << p2 << '\n'; } }
Mögliche Ausgabe
"." is equivalent to "/var/tmp/test" filesystem error: read_symlink: No such file or directory [/lib/libc.so.6] "/lib/x86_64-linux-gnu/libc.so.6" is equivalent to "/lib/x86_64-linux-gnu/libc-2.23.so"
[edit] 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 2937 | C++17 | Fehlerbedingung falsch spezifiziert | korrigiert |
[edit] Siehe auch
| vergleicht die lexikalischen Darstellungen zweier Pfade lexikographisch (öffentliche Memberfunktion von std::filesystem::path) | |
| (C++17)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++20) |
vergleicht zwei Pfade lexikographisch (function) |
| (C++17)(C++17) |
ermittelt Dateiattribute ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird (Funktion) |