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