Namespaces
Variants

std::filesystem:: path

From cppreference.net
Definido en el encabezado <filesystem>
class path ;
(desde C++17)

Los objetos de tipo path representan rutas en un sistema de archivos. Solo se manejan aspectos sintácticos de las rutas: el nombre de ruta puede representar una ruta inexistente o incluso una que no está permitida existir en el sistema de archivos o SO actual.

El nombre de la ruta tiene la siguiente sintaxis:

  1. root-name (opcional) : identifica la raíz en un sistema de archivos con múltiples raíces (como "C:" o "//myserver" ). En caso de ambigüedad, la secuencia más larga de caracteres que forma un root-name válido se trata como el root-name . La biblioteca estándar puede definir root-names adicionales además de los reconocidos por la API del sistema operativo.
  2. root-directory (opcional) : un separador de directorio que, si está presente, marca esta ruta como absoluta . Si falta (y el primer elemento distinto del nombre de raíz es un nombre de archivo), entonces la ruta es relativa y requiere otra ruta como ubicación inicial para resolverse en un nombre de archivo.
  3. Cero o más de los siguientes:
  • file-name : secuencia de caracteres que no son separadores de directorio ni separadores de directorio preferidos (pueden existir limitaciones adicionales impuestas por el SO o sistema de archivos). Este nombre puede identificar un archivo, un enlace físico, un enlace simbólico o un directorio. Se reconocen dos file-name s especiales:
  • dot : el nombre de archivo que consiste en un solo carácter punto . es un nombre de directorio que se refiere al directorio actual.
  • dot-dot : el nombre de archivo que consiste en dos caracteres punto .. es un nombre de directorio que se refiere al directorio padre.
  • directory-separator s: el carácter barra diagonal / o el carácter alternativo proporcionado como path::preferred_separator . Si este carácter se repite, se trata como un único separador de directorio: / usr ///////lib es lo mismo que / usr / lib .

Una ruta puede ser normalizada siguiendo este algoritmo:

  1. Si la ruta está vacía, detenerse (la forma normal de una ruta vacía es una ruta vacía).
  2. Reemplazar cada directory-separator (que puede consistir en múltiples barras) con un solo path::preferred_separator .
  3. Reemplazar cada carácter de barra en el root-name con path::preferred_separator .
  4. Eliminar cada dot y cualquier directory-separator inmediatamente siguiente.
  5. Eliminar cada nombre de archivo que no sea dot-dot seguido inmediatamente por un directory-separator y un dot-dot , junto con cualquier directory-separator inmediatamente siguiente.
  6. Si existe root-directory , eliminar todos los dot-dot y cualquier directory-separator inmediatamente posterior.
  7. Si el último nombre de archivo es dot-dot , eliminar cualquier directory-separator final.
  8. Si la ruta está vacía, agregar un dot (la forma normal de . / es . ).

La ruta puede ser recorrida elemento por elemento mediante los iteradores devueltos por las funciones begin() y end() , que visualizan la ruta en formato genérico e iteran sobre el nombre raíz, directorio raíz y los subsiguientes elementos de nombre de archivo (los separadores de directorio se omiten excepto el que identifica el directorio raíz). Si el último elemento de la ruta es un separador de directorio, el último iterador desreferenciará a un elemento vacío.

Llamar a cualquier función miembro no constante de un path invalida todos los iteradores que hacen referencia a elementos de ese objeto.

Si el sistema operativo utiliza una sintaxis nativa que es diferente de la sintaxis genérica portátil descrita anteriormente, las funciones de biblioteca que están definidas para aceptar "formato detectado" aceptan nombres de ruta en ambos formatos: un argumento de formato detectado se considera en formato genérico si y solo si coincide con el formato genérico pero no es aceptable para el sistema operativo como ruta nativa. En aquellos sistemas operativos donde el formato nativo difiere entre nombres de ruta de directorios y nombres de ruta de archivos, un nombre de ruta genérico se trata como ruta de directorio si termina en un separador de directorio y como archivo regular en caso contrario.

En cualquier caso, la clase path se comporta como si almacenara un nombre de ruta en formato nativo y automáticamente convierte a formato genérico según sea necesario (cada función miembro especifica en qué formato interpreta la ruta).

En sistemas POSIX, el formato genérico es el formato nativo y no es necesario distinguir o convertir entre ellos.

Los paths son implícitamente convertibles hacia y desde std::basic_string s, lo que permite utilizarlos con otras APIs de archivos.

Los operadores de flujo utilizan std::quoted para que los espacios no causen truncamiento cuando posteriormente son leídos por el operador de entrada de flujo .

Funciones miembro de descomposición (por ejemplo, extension ) devuelven filesystem::path objetos en lugar de objetos string como hacen otras APIs.

Contenidos

Tipos de miembros

Tipo Definición
value_type tipo de carácter utilizado por la codificación nativa del sistema de archivos: char en POSIX, wchar_t en Windows
string_type std:: basic_string < value_type >
const_iterator un LegacyInputIterator constante con un value_type de path que cumple todos los requisitos de LegacyBidirectionalIterator excepto que para dos iteradores dereferenciables iguales a y b de tipo const_iterator , no hay requisito de que * a y * b se refieran al mismo objeto.

No está especificado si const_iterator es realmente un LegacyBidirectionalIterator

iterator const_iterator
determina cómo interpretar las representaciones de cadena de nombres de ruta.

También se definen los siguientes enumeradores:

Nombre Explicación
native_format formato nativo de nombres de ruta
generic_format formato genérico de nombres de ruta
auto_format formato definido por la implementación, detectado automáticamente cuando es posible

(enumeración de miembro público)

Constantes de miembro

constexpr value_type preferred_separator
[static]
separador de directorio alternativo que puede usarse además del portable / . En Windows, este es el carácter de barra invertida \ . En POSIX, este es la misma barra diagonal / que el separador portable
(constante de miembro público estático)

Funciones miembro

construye un path
(función miembro pública)
destruye un objeto path
(función miembro pública)
asigna otra ruta
(función miembro pública)
asigna contenidos
(función miembro pública)
Concatenación
agrega elementos a la ruta con un separador de directorio
(función miembro pública)
concatena dos rutas sin introducir un separador de directorio
(función miembro pública)
Modificadores
borra el contenido
(función miembro pública)
convierte los separadores de directorio al separador de directorio preferido
(función miembro pública)
elimina el componente de ruta del nombre de archivo
(función miembro pública)
reemplaza el último componente de la ruta con otra ruta
(función miembro pública)
reemplaza la extensión
(función miembro pública)
intercambia dos rutas
(función miembro pública)
Observadores de formato
devuelve la versión nativa de la ruta
(función miembro pública)
devuelve la ruta en formato de nombre de ruta nativo convertido a una cadena
(función miembro pública)
devuelve la ruta en formato genérico de nombre de ruta convertida a cadena
(función miembro pública)
Comparar
compara las representaciones léxicas de dos rutas lexicográficamente
(función miembro pública)
Generación
convierte la ruta a forma normal
convierte la ruta a forma relativa
convierte la ruta a forma próxima
(función miembro pública)
Descomposición
devuelve el nombre raíz de la ruta, si está presente
(función miembro pública)
devuelve el directorio raíz de la ruta, si está presente
(función miembro pública)
devuelve la ruta raíz de la ruta, si está presente
(función miembro pública)
devuelve la ruta relativa a la ruta raíz
(función miembro pública)
devuelve la ruta del directorio padre
(función miembro pública)
devuelve el componente de ruta del nombre de archivo
(función miembro pública)
devuelve el componente de ruta stem (nombre de archivo sin la extensión final)
(función miembro pública)
devuelve el componente de extensión de archivo de la ruta
(función miembro pública)
Consultas
verifica si la ruta está vacía
(función miembro pública)
verifica si el elemento de ruta correspondiente no está vacío
(función miembro pública)
verifica si root_path() identifica de manera única una ubicación en el sistema de archivos
(función miembro pública)
Iteradores
acceso de iterador a la ruta como una secuencia de elementos
(función miembro pública)

Funciones no miembro

Definido en el espacio de nombres std::filesystem
especializa el algoritmo std::swap
(función)
(C++17)
calcula un valor hash para un objeto path
(función)
(C++17) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++20)
compara lexicográficamente dos paths
(función)
(C++17)
concatena dos paths con un separador de directorio
(función)
realiza entrada y salida por flujo en un path entrecomillado
(función)
(C++17) (deprecated in C++20)
crea un path desde una fuente codificada en UTF-8
(función)

Clases auxiliares

Definido en el espacio de nombres std
Soporte de hash para std::filesystem::path
(especialización de plantilla de clase)
Soporte de formato para filesystem::path
(especialización de plantilla de clase)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3657 C++17 hash para path estaba deshabilitado habilitado