std::filesystem:: canonical, std::filesystem:: weakly_canonical
|
Défini dans l'en-tête
<filesystem>
|
||
|
path canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(1) | (depuis C++17) |
|
path canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(2) | (depuis C++17) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(3) | (depuis C++17) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(4) | (depuis C++17) |
canonical()
avec un argument de chemin composé des éléments initiaux de
p
qui existent (tels que déterminés par
status
(
p
)
ou
status
(
p, ec
)
), s'il y en a, suivi des éléments de
p
qui n'existent pas. Le chemin résultant est sous
forme normale
.
Table des matières |
Paramètres
| p | - |
un chemin qui peut être absolu ou relatif ; pour
canonical
il doit s'agir d'un chemin existant
|
| ec | - | code d'erreur pour stocker le statut d'erreur |
Valeur de retour
Exceptions
Toute surcharge non marquée
noexcept
peut lever
std::bad_alloc
si l'allocation de mémoire échoue.
Notes
La fonction
canonical()
est modelée d'après la fonction POSIX
realpath
.
La fonction
weakly_canonical()
a été introduite pour simplifier la sémantique opérationnelle de
relative()
.
Exemple
#include <filesystem> #include <iostream> int main() { /* configuration des répertoires sandbox : a └── b ├── c1 │ └── d <== chemin actuel └── 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 << "Le chemin actuel est " << std::filesystem::current_path() << '\n' << "Le chemin canonique pour " << p1 << " est " << std::filesystem::canonical(p1) << '\n' << "Le chemin faiblement canonique pour " << p2 << " est " << std::filesystem::weakly_canonical(p2) << '\n'; try { [[maybe_unused]] auto x_x = std::filesystem::canonical(p2); // NON ATTEINT } catch (const std::exception& ex) { std::cout << "Le chemin canonique pour " << p2 << " a levé une exception :\n" << ex.what() << '\n'; } // nettoyage std::filesystem::current_path(old); const auto count = std::filesystem::remove_all(tmp / "a"); std::cout << "Supprimé " << count << " fichiers ou répertoires.\n"; }
Sortie possible :
Le chemin actuel est "/tmp/a/b/c1/d" Le chemin canonique pour "../../c2/./e" est "/tmp/a/b/c2/e" Le chemin faiblement canonique pour "../no-such-file" est "/tmp/a/b/c1/no-such-file" Le chemin canonique pour "../no-such-file" a levé une exception : filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d] Supprimé 6 fichiers ou répertoires.
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2956 | C++17 |
canonical
possède un paramètre
base
superflu
|
supprimé |
Voir aussi
|
(C++17)
|
représente un chemin
(classe) |
|
(C++17)
|
compose un chemin absolu
(fonction) |
|
(C++17)
|
compose un chemin relatif
(fonction) |