std::filesystem::canonical, std::filesystem::weakly_canonical
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) |
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.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
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) |
(C++17) | Compone una ruta de acceso absoluta. (función) |
(C++17) | Compone una ruta de acceso relativa. (función) |