Espacios de nombres
Variantes
Acciones

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

De cppreference.com
 
 
 
Definido en el archivo de 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 de acceso p a la ruta canónica absoluta, es decir, una ruta de acceso absoluta que no tiene elementos punto o punto-punto, o enlaces simbólicos en su formato representación de genérico. Si p no es una ruta absoluta, la función se comporta como si primero se hubiera hecho absolouta por std::filesystem::absolute(p). La ruta de acceso p debe existir.
3-4) Devuelve una ruta de acceso compuesta del operador operator/= del resultado de llamar a canonical() con una ruta como argumento compuesta de los elementos iniciales de p que existan (como se determina por status(p) o status(p, ec)), si los hay, seguida por los elementos de p que no existan. La ruta resultante está en la forma normal.

Contenido

[editar] Parámetros

p - Una ruta de acceso que puede ser absoluta o relativa; para canonical de ser una ruta que exista.
ec - El código de error en el que almacenar el estado de error.

[editar] Valor de retorno

1-2) Una ruta absoluta que se resuelve en el 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 en p que existen, e y es una ruta compuesta de los elementos restantes de p que no existen.

[editar] Excepciones

La sobrecarga que no toma un parámetro std::error_code& lanza filesystem::filesystem_error en los errores de la API del sistema operativo subyacente, construido con p como el primer argumento de la ruta de acceso y el código de error del sistema operativo como el argumento del código de error. La sobrecarga que toma un parámetro std::error_code& lo establece en el código de error de la API del sistema operativo si una llamada a la API del sistema operativo falla, y ejecuta ec.clear() si no ocurren errores. Cualquier sobrecarga que no está marcada con noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.

[editar] Notas

La función canonical() sigue el modelo de la función realpath de POSIX.

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

[editar] Ejemplo

#include <iostream>
#include <filesystem>
 
int main()
{
    /* preparar los directorios aislados:
     a
     └── b
         ├── c1
         │   └── d <== ruta de acceso 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-hay-tal-archivo");
    std::cout << "La ruta de acceso actual es "
              << std::filesystem::current_path() << '\n'
              << "La ruta de acceso canónica para " << p1 << " es "
              << std::filesystem::canonical(p1) << '\n'
              << "La ruta de acceso débilmente canónica para " << p2 << " es "
              << std::filesystem::weakly_canonical(p2) << '\n';
    try
    {
        std::filesystem::canonical(p2);
        // NO SE ALCANZÓ
    }
    catch(const std::exception& ex)
    {
        std::cout << "La ruta de acceso 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 << "Se borraron " << count << " archivos o directorios.\n";
}

Posible salida:

La ruta de acceso actual es "/tmp/a/b/c1/d"
La ruta de acceso canónica para "../../c2/./e" es "/tmp/a/b/c2/e"
La ruta de acceso débilmente canónica para "../no-hay-tal-archivo" es "/tmp/a/b/c1/no-hay-tal-archivo"
La ruta de acceso canónica para "../no-hay-tal-archivo" lanzó una excepción:
filesystem error: in canonical: No hay tal archivo o directorio [../no-hay-tal-archivo] [/tmp/a/b/c1/d]
Se borraron 6 archivos o directorios.

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2956 C++17 canonical tiene un parámetro base espurio. Se eliminó.

[editar] Véase también

(C++17)
Representa una ruta de acceso.
(clase) [editar]
(C++17)
Compone una ruta de acceso absoluta.
(función) [editar]
Compone una ruta de acceso relativa.
(función) [editar]