Namespaces
Variants

std::filesystem:: recursive_directory_iterator

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

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

constexpr bool

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

un iterador a los contenidos del directorio
(clase)
una entrada de directorio
(clase)
opciones para iterar contenidos del directorio
(enum)