Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
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

ranges:: enable_borrowed_range < std :: filesystem :: directory_iterator > = true ;
(desde C++20)
template <>

constexpr bool

ranges:: enable_view < std :: filesystem :: directory_iterator > = true ;
(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

un iterador a los contenidos de un directorio y sus subdirectorios
(clase)
opciones para iterar contenidos de directorios
(enum)
una entrada de directorio
(clase)