Namespaces
Variants

std::filesystem:: canonical, std::filesystem:: weakly_canonical

From cppreference.net
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)
1,2) Convertit le chemin p en un chemin absolu canonique, c'est-à-dire un chemin absolu qui ne contient aucun élément point, point-point ou lien symbolique dans sa représentation de format générique. Si p n'est pas un chemin absolu, la fonction se comporte comme s'il était d'abord rendu absolu par std:: filesystem :: absolute ( p ) . Le chemin p doit exister.
3,4) Retourne un chemin composé par operator / = à partir du résultat de l'appel à 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

1,2) Un chemin absolu qui résout vers le même fichier que std:: filesystem :: absolute ( p ) .
3,4) Un chemin normal de la forme canonical ( x ) / y , où x est un chemin composé de la plus longue séquence initiale d'éléments dans p qui existent, et y est un chemin composé des éléments finaux restants non existants de p .

Exceptions

Toute surcharge non marquée noexcept peut lever std::bad_alloc si l'allocation de mémoire échoue.

1,3) Lance std::filesystem::filesystem_error en cas d'erreurs de l'API système sous-jacente, construit avec p comme premier argument de chemin et le code d'erreur du système comme argument de code d'erreur.
2,4) Définit un paramètre std:: error_code & au code d'erreur de l'API du système d'exploitation si un appel d'API système échoue, et exécute ec. clear ( ) si aucune erreur ne survient.

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)
compose un chemin relatif
(fonction)