std::filesystem:: canonical, std::filesystem:: weakly_canonical
From es.cppreference.net
<
cpp
|
filesystem
|
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
Ejecutar este código
#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) |
|
(C++17)
|
compone una ruta relativa
(función) |