std::filesystem:: directory_iterator
|
Definido en el encabezado
<filesystem>
|
||
|
class
directory_iterator
;
|
(desde C++17) | |
directory_iterator
es un
LegacyInputIterator
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. Las rutas especiales
dot
y
dot-dot
se omiten.
Si el
directory_iterator
reporta 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 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 haya creado el iterador de directorio, no está especificado si el cambio se observará a través del iterador.
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 de directorio
(función miembro pública) |
|
|
(destructor)
|
destructor por defecto
(función miembro pública) |
|
asigna contenidos
(función miembro pública) |
|
|
accede a la entrada apuntada
(función miembro pública) |
|
|
avanza a la siguiente entrada
(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
directory_iterator
lo convierten en un
borrowed_range
y una
view
.
Notas
Muchas APIs de bajo nivel del sistema operativo para recorrido de directorios recuperan atributos de archivo junto con la siguiente entrada del directorio. Los constructores y las funciones miembro no constantes de std::filesystem::directory_iterator almacenan estos atributos, si los hay, en el std::filesystem::directory_entry apuntado sin llamar a directory_entry::refresh , lo que permite examinar los atributos de las entradas del directorio mientras se itera sobre ellas, sin realizar llamadas adicionales al sistema.
Ejemplo
#include <algorithm> #include <filesystem> #include <fstream> #include <iostream> int main() { const std::filesystem::path sandbox{"sandbox"}; std::filesystem::create_directories(sandbox/"dir1"/"dir2"); std::ofstream{sandbox/"file1.txt"}; std::ofstream{sandbox/"file2.txt"}; std::cout << "directory_iterator:\n"; // directory_iterator puede iterarse usando un bucle range-for for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) std::cout << dir_entry.path() << '\n'; std::cout << "\ndirectory_iterator como rango:\n"; // directory_iterator también se comporta como un rango de otras formas std::ranges::for_each( std::filesystem::directory_iterator{sandbox}, [](const auto& dir_entry) { std::cout << dir_entry << '\n'; }); std::cout << "\nrecursive_directory_iterator:\n"; for (auto const& dir_entry : std::filesystem::recursive_directory_iterator{sandbox}) std::cout << dir_entry << '\n'; // eliminar el directorio sandbox y todo su contenido, incluyendo subdirectorios std::filesystem::remove_all(sandbox); }
Salida posible:
directory_iterator: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" directory_iterator as a range: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" recursive_directory_iterator: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" "sandbox/dir1/dir2"
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3480 | C++20 |
directory_iterator
no era ni un
borrowed_range
ni una
view
|
es ambos |
Véase también
|
(C++17)
|
un iterador a los contenidos de un directorio y sus subdirectorios
(clase) |
|
(C++17)
|
opciones para iterar contenidos de directorios
(enum) |
|
(C++17)
|
una entrada de directorio
(clase) |