std::filesystem:: canonical, std::filesystem:: weakly_canonical
|
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) |
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
Excepciones
Cualquier sobrecarga no marcada como
noexcept
puede lanzar
std::bad_alloc
si la asignación de memoria falla.
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
#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) |