std::filesystem:: recursive_directory_iterator
|
Definido en el encabezado
<filesystem>
|
||
|
class
recursive_directory_iterator
;
|
(desde C++17) | |
recursive_directory_iterator
es un
LegacyInputIterator
que itera sobre los elementos
directory_entry
de un directorio, y, recursivamente, sobre las entradas de todos los subdirectorios. El orden de iteración no está especificado, excepto que cada entrada de directorio se visita solo una vez.
Por defecto, los enlaces simbólicos no se siguen, pero esto puede habilitarse especificando la opción de directorio follow_directory_symlink en el momento de la construcción.
Los nombres de ruta especiales dot y dot-dot se omiten.
Si el
recursive_directory_iterator
reporta un error o avanza más allá de la última entrada del directorio de nivel superior, se vuelve igual al iterador construido por defecto, también conocido como iterador final. Dos iteradores finales siempre son iguales, desreferenciar o incrementar el iterador final es comportamiento indefinido.
Si un archivo o directorio se elimina o se agrega al árbol de directorios después de que se ha creado el iterador de directorio recursivo, no está especificado si el cambio se observaría a través del iterador.
Si la estructura del directorio contiene ciclos, el iterador final puede ser inalcanzable.
Contenidos |
Tipos de miembros
| Tipo de miembro | Definición |
value_type
|
std::filesystem::directory_entry |
difference_type
|
std::ptrdiff_t |
pointer
|
const std:: filesystem :: directory_entry * |
reference
|
const std:: filesystem :: directory_entry & |
iterator_category
|
std::input_iterator_tag |
Funciones miembro
|
construye un iterador recursivo de directorio
(función miembro pública) |
|
|
(destructor)
|
destructor por defecto
(función miembro pública) |
Observadores |
|
|
accede a la entrada apuntada
(función miembro pública) |
|
|
devuelve las opciones activas actuales que afectan a la iteración
(función miembro pública) |
|
|
devuelve la profundidad de recursión actual
(función miembro pública) |
|
|
comprueba si la recursión está deshabilitada para el directorio actual
(función miembro pública) |
|
Modificadores |
|
|
asigna contenidos
(función miembro pública) |
|
|
avanza a la siguiente entrada
(función miembro pública) |
|
|
mueve el iterador un nivel hacia arriba en la jerarquía de directorios
(función miembro pública) |
|
|
deshabilita la recursión hasta el siguiente incremento
(función miembro pública) |
|
Funciones no miembro
|
soporte para bucle for basado en rangos
(función) |
Además,
operator==
y
operator!=
están
(hasta C++20)
operator==
está
(desde C++20)
proporcionados según lo requerido por
LegacyInputIterator
.
No está especificado
si
operator!=
es proporcionado porque puede ser sintetizado a partir de
operator==
, y
(desde C++20)
si un operador de igualdad es miembro o no miembro.
Especializaciones auxiliares
|
template
<>
constexpr
bool
|
(desde C++20) | |
|
template
<>
constexpr
bool
|
(desde C++20) | |
Estas especializaciones para
recursive_directory_iterator
lo convierten en un
borrowed_range
y una
view
.
Notas
Un
recursive_directory_iterator
normalmente mantiene un
puntero
con conteo de referencias (para satisfacer la semántica de copia superficial de
LegacyInputIterator
) a un objeto de implementación, que contiene:
- un contenedor (como std::vector ) de directory_iterator s no recursivos que forma la pila de recursión,
- el contador de profundidad de recursión (accesible con depth() ),
- las opciones de directorio utilizadas en la construcción (accesibles con options() ),
- el indicador de recursión pendiente (accesible con recursion_pending() , puede combinarse con las opciones de directorio para ahorrar espacio).
Ejemplo
#include <filesystem> #include <fstream> #include <iostream> #include <string> namespace fs = std::filesystem; int main() { std::filesystem::current_path(std::filesystem::temp_directory_path()); std::filesystem::create_directories("sandbox/a/b"); std::ofstream("sandbox/file1.txt"); std::filesystem::create_symlink("a", "sandbox/syma"); // Iterar sobre los elementos std::filesystem::directory_entry explícitamente auto entry_length{3UZ}; for (const fs::directory_entry& dir_entry : fs::recursive_directory_iterator("sandbox")) { std::cout << dir_entry << '\n'; if (auto l{dir_entry.path().string().length()}; entry_length < l) entry_length = l; } std::cout << std::string(entry_length + 2, '-') << '\n'; // Iterar sobre los elementos std::filesystem::directory_entry usando `auto` for (auto const& dir_entry : fs::recursive_directory_iterator("sandbox")) std::cout << dir_entry << '\n'; std::filesystem::remove_all("sandbox"); }
Salida posible:
"sandbox/syma" "sandbox/file1.txt" "sandbox/a" "sandbox/a/b" ------------------- "sandbox/syma" "sandbox/file1.txt" "sandbox/a" "sandbox/a/b"
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 3480 | C++20 |
recursive_directory_iterator
no era ni un
borrowed_range
ni un
view
|
es ambos |
Véase también
|
(C++17)
|
un iterador a los contenidos del directorio
(clase) |
|
(C++17)
|
una entrada de directorio
(clase) |
|
(C++17)
|
opciones para iterar contenidos del directorio
(enum) |