Espacios de nombres
Variantes
Acciones

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

De cppreference.com
 
 
 
Definido en el archivo de encabezado <filesystem>
path canonical(conststd::filesystem::path& p );
(1) (desde C++17)
path canonical(conststd::filesystem::path& p,
                std::error_code& ec );
(2) (desde C++17)
path weakly_canonical(conststd::filesystem::path& p);
(3) (desde C++17)
path weakly_canonical(conststd::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(conststd::exception& ex){std::cout<<"La ruta de acceso canónica para "<< p2 <<" lanzó una excepción:\n"<< ex.what()<<'\n';}   // limpiezastd::filesystem::current_path(old);constauto 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]
close