std::filesystem::canonical, std::filesystem::weakly_canonical
Von cppreference.com
< cpp | filesystem
| Definiert in Header <filesystem> |
||
| path canonical( const std::filesystem::path& p ); |
(1) | (seit C++17) |
| path canonical( const std::filesystem::path& p, std::error_code& ec ); |
(2) | (seit C++17) |
| path weakly_canonical( const std::filesystem::path& p ); |
(3) | (seit C++17) |
| path weakly_canonical( const std::filesystem::path& p, std::error_code& ec ); |
(4) | (seit C++17) |
1,2) Konvertiert den Pfad p in einen kanonischen absoluten Pfad, d.h. einen absoluten Pfad, der keine Punkt-, Punkt-Punkt-Elemente oder symbolischen Links in seiner generischen Formatrepräsentation hat. Wenn p kein absoluter Pfad ist, verhält sich die Funktion so, als ob er zuerst durch std::filesystem::absolute(p) absolut gemacht wird. Der Pfad p muss existieren.
3,4) Gibt einen Pfad zurück, der durch operator/= aus dem Ergebnis des Aufrufs von
canonical() mit einem Pfadargument zusammengesetzt wird, das aus den führenden Elementen von p besteht, die existieren (wie von status(p) oder status(p, ec) bestimmt), falls vorhanden, gefolgt von den Elementen von p, die nicht existieren. Der resultierende Pfad befindet sich in der Normalform.Inhalt |
[edit] Parameter
| p | - | ein Pfad, der absolut oder relativ sein kann; für canonical muss es ein existierender Pfad sein |
| ec | - | Fehlercode, in dem der Fehlerstatus gespeichert wird |
[edit] Rückgabewert
1,2) Ein absoluter Pfad, der auf dieselbe Datei wie std::filesystem::absolute(p) aufgelöst wird.
3,4) Ein normaler Pfad der Form canonical(x)/y, wobei x ein Pfad ist, der aus der längsten führenden Sequenz von Elementen in p besteht, die existieren, und y ein Pfad ist, der aus den verbleibenden nachfolgenden nicht existierenden Elementen von p besteht.
[edit] Ausnahmen
Jede Überladung, die nicht als noexcept markiert ist, kann std::bad_alloc auslösen, wenn die Speicherzuweisung fehlschlägt.
1,3) Wirft std::filesystem::filesystem_error bei zugrundeliegenden OS-API-Fehlern, konstruiert mit p als erstem Pfadargument und dem OS-Fehlercode als Fehlercodeargument.
2,4) Setzt einen std::error_code&-Parameter auf den OS-API-Fehlercode, wenn ein OS-API-Aufruf fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten.
[edit] Hinweise
Die Funktion canonical() ist nach dem POSIX- realpath modelliert.
Die Funktion weakly_canonical() wurde eingeführt, um die operativen Semantiken von relative() zu vereinfachen.
[edit] Beispiel
Führen Sie diesen Code aus
#include <filesystem> #include <iostream> int main() { /* set up sandbox directories: a └── b ├── c1 │ └── d <== current path └── c2 └── e */ auto old = std::filesystem::current_path(); auto tmp = std::filesystem::temp_directory_path(); std::filesystem::current_path(tmp); auto d1 = tmp / "a/b/c1/d"; auto d2 = tmp / "a/b/c2/e"; std::filesystem::create_directories(d1); std::filesystem::create_directories(d2); std::filesystem::current_path(d1); auto p1 = std::filesystem::path("../../c2/./e"); auto p2 = std::filesystem::path("../no-such-file"); std::cout << "Current path is " << std::filesystem::current_path() << '\n' << "Canonical path for " << p1 << " is " << std::filesystem::canonical(p1) << '\n' << "Weakly canonical path for " << p2 << " is " << std::filesystem::weakly_canonical(p2) << '\n'; try { [[maybe_unused]] auto x_x = std::filesystem::canonical(p2); // NOT REACHED } catch (const std::exception& ex) { std::cout << "Canonical path for " << p2 << " threw exception:\n" << ex.what() << '\n'; } // cleanup std::filesystem::current_path(old); const auto count = std::filesystem::remove_all(tmp / "a"); std::cout << "Deleted " << count << " files or directories.\n"; }
Mögliche Ausgabe
Current path is "/tmp/a/b/c1/d" Canonical path for "../../c2/./e" is "/tmp/a/b/c2/e" Weakly canonical path for "../no-such-file" is "/tmp/a/b/c1/no-such-file" Canonical path for "../no-such-file" threw exception: filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d] Deleted 6 files or directories.
[edit] Fehlermeldungen
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 2956 | C++17 | canonical hat einen überflüssigen base-Parameter |
entfernt |
[edit] Siehe auch
| (C++17) |
repräsentiert einen Pfad (Klasse) |
| (C++17) |
komponiert einen absoluten Pfad (Funktion) |
| (C++17) |
komponiert einen relativen Pfad (Funktion) |