std::filesystem::recursive_directory_iterator
Definido en el archivo de encabezado <filesystem> | ||
class recursive_directory_iterator; | (desde C++17) | |
recursive_directory_iterator
es un InputIterator 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 se puede habilitar especificando la opción de directorio follow_directory_symlink en tiempo de construcción.
Los nombres de ruta de acceso especiales punto y punto-punto se omiten.
Si el recursive_directory_iterator
informa un error o avanza más allá de la última entrada de directorio del directorio de nivel superior, se vuelve igual al iterador construido por defecto, también conocido como el iterador final. Dos iteradores finales son siempre iguales, desreferenciar o incrementar el iterador final es un comportamiento no definido..
Si un archivo o un directorio se eliminan o se agregan al árbol de directorios después de que se haya creado el iterador de directorio recursivo, no se especifica si el cambio se observará a través del iterador.
Si la estructura del directorio contiene ciclos, el iterador final puede ser inalcanzable.
Contenido |
[editar]Tipos miembro
Tipo miembro | Definición |
value_type | std::filesystem::directory_entry |
difference_type | std::ptrdiff_t |
pointer | conststd::filesystem::directory_entry* |
reference | conststd::filesystem::directory_entry& |
iterator_category | std::input_iterator_tag |
[editar]Funciones miembro
Construye un iterador de directorio recursivo. (función miembro pública) | |
(destructor) | Destructor por defecto. (función miembro pública) |
Observadores | |
Accede a la entrada a la que se apunta. (función miembro pública) | |
Devuelve las opciones actualmente activas que afectan la iteración. (función miembro pública) | |
Devuelve la profundidad de la recursión actual. (función miembro pública) | |
Verifica si la recursión está deshabilitada para el directorio actual. (función miembro pública) | |
Modificadores | |
Asigna el contenido. (función miembro pública) | |
Avanza a la siguiente entrada. (función miembro pública) | |
Move el iterador un nivel más 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) |
[editar]Funciones no miembro
Apoyo para bucle for basado en rango. (función) |
Además, se proporcionan operator==
y operator!=
(hasta C++20)se proporciona operator==
(desde C++20), como se requiere por InputIterator.
No se especifica si operator!=
se proporciona porque se puede sintetizar del operador operator==
, y(desde C++20) si un operador de igualdad es una función miembro o no miembro.
[editar]Plantillas auxiliares
namespace std::ranges{ template<> | (desde C++20) | |
namespace std::ranges{ template<> | (desde C++20) | |
Estas especializaciones para recursive_directory_iterator
lo hacen un borrowed_range
y una vista (view
).
[editar]Notas
Un objeto recursive_directory_iterator
típicamente alberga un puntero con conteo de referencias (para satisfacer la semántica de copia superficial de InputIterator) para un objeto de implementación, que alberga:
- un contenedor (tal como std::vector) de directory_iterator no recursivos que forman la pila de recursión;
- el contador de profundidad de recursividad (accesible con depth());
- las opciones de directorio utilizadas en la construcción (accesibles con options());
- la bandera de recursividad pendiente (accesible con recursion_pending(), se puede combinar con las opciones de directorio para ahorrar espacio).
[editar]Ejemplo
#include <fstream>#include <iostream>#include <filesystem>namespace fs = std::filesystem; int main(){ fs::current_path(fs::temp_directory_path()); fs::create_directories("entorno_aislado/a/b");std::ofstream("entorno_aislado/archivo1.txt"); fs::create_symlink("a", "entorno_aislado/syma");for(auto& p: fs::recursive_directory_iterator("entorno_aislado"))std::cout<< p.path()<<'\n'; fs::remove_all("entorno_aislado");}
Posible salida:
"entorno_aislado/a" "entorno_aislado/a/b" "entorno_aislado/archivo1.txt" "entorno_aislado/syma"
[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 3480 | C++20 | recursive_directory_iterator no era ni borrowed_range ni view . | Es ambos. |
[editar]Véase también
(C++17) | Un iterador al contenido del directorio. (clase) |
(C++17) | Una entrada de directorio. (clase) |
(C++17) | Opciones para iterar sobre el contenido de un directorio. (enum) |