Espacios de nombres
Variantes
Acciones

std::filesystem::directory_iterator

De cppreference.com
 
 
 
 
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) [editar]
(destructor)
Destructor por defecto.
(función miembro pública) [editar]
Asigna el contenido.
(función miembro pública) [editar]
Accede a la entrada a la que se apunta.
(función miembro pública) [editar]
Avanza a la siguiente entrada.
(función miembro pública) [editar]

[editar] Funciones no miembro

Apoyo para bucle for basado en rango.
(función) [editar]

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<>
inline constexpr bool
    enable_borrowed_range<std::filesystem::directory_iterator> = true;

}
(desde C++20)
namespace std::ranges {

template<>
inline constexpr bool enable_view<std::filesystem::directory_iterator> = true;

}
(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

Un iterador al contenido de un directorio y sus subdirectorios.
(clase) [editar]
Opciones para iterar sobre el contenido de un directorio.
(enum) [editar]
Una entrada de directorio.
(clase) [editar]