std::filesystem::directory_iterator
Definido en el archivo de encabezado <filesystem>
|
||
class directory_iterator; |
(desde C++17) | |
directory_iterator
es un InputIterator que itera sobre los elementos directory_entry de un directorio pero no visita los subdirectorios. El orden de iteración no está especificado, excepto que cada entrada de directorio se visita solo una vez. Los nombres de ruta de acceso especiales punto y punto-punto se omiten.
Si el directory_iterator
informa un error o avanza más allá de la última entrada del directorio, 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 del directorio, no se especifica si el cambio se observará a través del iterador.
Contenido |
[editar] Tipos miembro
Tipo 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 |
[editar] Funciones miembro
Construye un iterador de directorio. (función miembro pública) | |
(destructor) |
Destructor por defecto. (función miembro pública) |
Asigna el contenido. (función miembro pública) | |
Accede a la entrada a la que se apunta. (función miembro pública) | |
Avanza a la siguiente entrada. (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 directory_iterator
lo hacen un borrowed_range
y una vista (view
).
[editar] Notas
Muchas API de bajo nivel del sistema operativo para el recorrido de directorios recuperan atributos de archivo junto con la siguiente entrada de directorio. Los constructores y las funciones miembro no const de std::filesystem::directory_iterator almacenan estos atributos, si los hay, en el objeto std::filesystem::directory_entry al que se apunta sin llamar a directory_entry::refresh, lo que permite examinar los atributos de las entradas de directorio a medida que se recorren, sin realizar llamadas adicionales al sistema.
[editar] Ejemplo
#include <fstream> #include <iostream> #include <filesystem> int main() { const std::filesystem::path entorno_aislado{"entorno_aislado"}; std::filesystem::create_directories(entorno_aislado/"dir1"/"dir2"); std::ofstream{entorno_aislado/"archivo1.txt"}; std::ofstream{entorno_aislado/"archivo2.txt"}; std::cout << "directory_iterator:\n"; for(auto const& dir_entry: std::filesystem::directory_iterator{entorno_aislado}) std::cout << dir_entry << '\n'; std::cout << "recursive_directory_iterator:\n"; for(auto const& dir_entry: std::filesystem::recursive_directory_iterator{entorno_aislado}) std::cout << dir_entry << '\n'; std::filesystem::remove_all(entorno_aislado); }
Posible salida:
directory_iterator: "entorno_aislado/archivo2.txt" "entorno_aislado/archivo1.txt" "entorno_aislado/dir1" recursive_directory_iterator: "entorno_aislado/archivo2.txt" "entorno_aislado/archivo1.txt" "entorno_aislado/dir1" "entorno_aislado/dir1/dir2"
[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 | directory_iterator no era ni borrowed_range ni view .
|
Es ambos. |
[editar] Véase también
(C++17) |
Un iterador al contenido de un directorio y sus subdirectorios. (clase) |
(C++17) |
Opciones para iterar sobre el contenido de un directorio. (enum) |
(C++17) |
Una entrada de directorio. (clase) |