Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <filesystem>
path canonical ( const std:: filesystem :: path & p ) ;
(1) (desde C++17)
path canonical ( const std:: filesystem :: path & p,
std:: error_code & ec ) ;
(2) (desde C++17)
path weakly_canonical ( const std:: filesystem :: path & p ) ;
(3) (desde C++17)
path weakly_canonical ( const std:: filesystem :: path & p,
std:: error_code & ec ) ;
(4) (desde C++17)
1,2) Convierte la ruta p a una ruta absoluta canónica, es decir, una ruta absoluta que no tiene elementos punto, punto-punto o enlaces simbólicos en su representación de formato genérico. Si p no es una ruta absoluta, la función se comporta como si primero se hiciera absoluta mediante std:: filesystem :: absolute ( p ) . La ruta p debe existir.
3,4) Retorna una ruta compuesta por operator / = del resultado de llamar a canonical() con un argumento de ruta compuesto por los elementos iniciales de p que existen (determinados por status ( p ) o status ( p, ec ) ), si los hay, seguidos por los elementos de p que no existen. La ruta resultante está en forma normal .

Contenidos

Parámetros

p - una ruta que puede ser absoluta o relativa; para canonical debe ser una ruta existente
ec - código de error para almacenar el estado de error

Valor de retorno

1,2) Una ruta absoluta que resuelve al mismo archivo que std:: filesystem :: absolute ( p ) .
3,4) Una ruta normal de la forma canonical ( x ) / y , donde x es una ruta compuesta de la secuencia inicial más larga de elementos en p que existen, y y es una ruta compuesta de los elementos finales restantes no existentes de p .

Excepciones

Cualquier sobrecarga no marcada como noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.

1,3) Lanza std::filesystem::filesystem_error en errores de la API del sistema operativo subyacente, construido con p como primer argumento de ruta y el código de error del sistema operativo como argumento de código de error.
2,4) Establece un parámetro std:: error_code & al código de error de la API del sistema operativo si una llamada a la API del SO falla, y ejecuta ec. clear ( ) si no ocurren errores.

Notas

La función canonical() está modelada según la especificación POSIX realpath .

La función weakly_canonical() fue introducida para simplificar la semántica operacional de relative() .

Ejemplo

#include <filesystem>
#include <iostream>
int main()
{
    /* configurar directorios de sandbox:
     a
     └── b
         ├── c1
         │   └── d <== ruta actual
         └── 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 << "La ruta actual es "
              << std::filesystem::current_path() << '\n'
              << "La ruta canónica para " << p1 << " es "
              << std::filesystem::canonical(p1) << '\n'
              << "La ruta débilmente canónica para " << p2 << " es "
              << std::filesystem::weakly_canonical(p2) << '\n';
    try
    {
        [[maybe_unused]] auto x_x = std::filesystem::canonical(p2);
        // NO ALCANZADO
    }
    catch (const std::exception& ex)
    {
        std::cout << "La ruta canónica para " << p2 << " lanzó una excepción:\n"
                  << ex.what() << '\n';
    }
    // limpieza
    std::filesystem::current_path(old);
    const auto count = std::filesystem::remove_all(tmp / "a");
    std::cout << "Eliminados " << count << " archivos o directorios.\n";
}

Salida posible:

La ruta actual es "/tmp/a/b/c1/d"
La ruta canónica para "../../c2/./e" es "/tmp/a/b/c2/e"
La ruta débilmente canónica para "../no-such-file" es "/tmp/a/b/c1/no-such-file"
La ruta canónica para "../no-such-file" lanzó una excepción:
filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d]
Eliminados 6 archivos o directorios.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2956 C++17 canonical tiene un parámetro base espurio eliminado

Véase también

(C++17)
representa una ruta
(clase)
(C++17)
compone una ruta absoluta
(función)
compone una ruta relativa
(función)