std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate
De cppreference.com
< cpp | filesystem | path
path lexically_normal() const; | (1) | (desde C++17) |
path lexically_relative(const path& base) const; | (2) | (desde C++17) |
path lexically_proximate(const path& base) const; | (3) | (desde C++17) |
2) Devuelve
*this
hecho relativo a base
.- Primero, si root_name() != base.root_name() es true o is_absolute() != base.is_absolute() es true o (!has_root_directory() && base.has_root_directory()) es true o cualquier nombre de archivo en relative_path() o base.relative_path() puede interpretarse como un nombre-raíz, devuelve una ruta de acceso construida por defecto.
- De lo contrario, primero determina el primer elemento no coincidente de
*this
ybase
como si fuera por auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()), entonces
- si a == end() y b == base.end(), devuelve path(".");
- de lo contrario, define N como el número de elementos de nombre de archivo no vacíos que no son ni punto ni punto-punto en [b, base.end()), menos el número de elementos de nombre de archivo punto-punto, si N < 0, devuelve una ruta de acceso construida por defecto.
- de lo contrario, si N = 0 y a == end() || a->empty(), devuelve path(".");
- de lo contrario devuelve un objeto compuesto de
- una ruta de acceso path() construida por defecto, seguida de
- N aplicaciones de operator/=(path("..")), seguida de
- una aplicación de operator/= para cada elemento en el rango semiabierto
[a, end())
.
3) Si el valor de lexically_relative(base) no es una ruta de acceso vacía, devolverla. De lo contrario devolver
*this
.Contenido |
[editar] Parámetros
(Ninguno)
[editar] Valor de retorno
1) La forma normal de la ruta de acceso.
2) La forma relativa de la ruta de acceso.
3) La forma aproximada de la ruta de acceso.
[editar] Excepciones
Puede lanzar excepciones definidas por la implementación.
[editar] Notas
Estas conversiones son puramente léxicas. No verifican que las rutas existan, no siguen los enlaces simbólicos y no acceden al sistema de archivos en absoluto. Para contrapartes de seguimiento simbólico de lexically_relative
y lexically_proximate
, véase relative y proximate.
En Windows, la ruta de acceso devuelta tiene barras invertidas (la barra invertida es el separador de directorio preferido).
En POSIX, ningún nombre de archivo en una ruta de acceso relativa es aceptable como un nombre-raíz.
[editar] Ejemplo
Ejecuta este código
#include <iostream> #include <filesystem> #include <cassert> namespace fs = std::filesystem; int main() { assert(fs::path("a/./b/..").lexically_normal() == "a/"); assert(fs::path("a/.///b/../").lexically_normal() == "a/"); assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d"); assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c"); assert(fs::path("a/b/c").lexically_relative("a") == "b/c"); assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../.."); assert(fs::path("a/b/c").lexically_relative("a/b/c") == "."); assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b"); assert(fs::path("a/b").lexically_relative("/a/b") == ""); assert(fs::path("a/b").lexically_proximate("/a/b") == "a/b"); }
[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 3070 | C++17 | Un nombre de archivo que también puede ser un nombre-raíz puede causar resultados sorpresivos. | Se trata como un caso de error. |
LWG 3096 | C++17 | La secuencias "/" y "/." al final se manejan incorrectamente. | Se corrigió el manejo. |
[editar] Véase también
(C++17) | Compone una ruta de acceso relativa. (función) |