<experimental/filesystem> recursive_directory_iterator clase

Important

En este artículo se describe la recursive_directory_iterator clase de la implementación de prestandard <experimental/filesystem> de la especificación técnica del sistema de archivos ISO C++ (N4100). Esta API no es la misma que la clase C++17 recursive_directory_iterator en <filesystem>. Usa diferentes firmas, incluido un noexceptincrement y un único formulario pop sin error_code sobrecarga. La implementación experimental se quitó a partir del conjunto de herramientas de Visual C++ (MSVC) 14.51 Microsoft. En su lugar, el nuevo código debe usar la clase C++17 recursive_directory_iterator .

Describe un iterador de entrada que se secuencia a través de los nombres de archivo de un directorio, posiblemente descendentes en subdirectorios de forma recursiva. Para un iterador X, la expresión *X devuelve un objeto de clase directory_entry que encapsula el nombre de archivo y todo lo que se conoce sobre su estado.

Sintaxis

class recursive_directory_iterator;

Observaciones

La clase almacena:

  1. objeto de tipo stack<pair<directory_iterator, path>>, llamado mystack aquí para los fines de exposición, que representa el anidamiento de directorios que se van a secuenciar

  2. un objeto de tipo directory_entry llamado myentry aquí, que representa el nombre de archivo actual en la secuencia de directorios.

  3. un objeto de tipo bool, denominado no_push aquí, que registra si el descenso recursivo en subdirectorios está deshabilitado.

  4. un objeto de tipo directory_options, denominado myoptions aquí, que registra las opciones establecidas en la construcción

Un objeto construido de forma predeterminada de tipo recursive_directory_iterator tiene un iterador de fin de secuencia en mystack.top().first y representa el iterador de fin de secuencia. Por ejemplo, dado el directorio abc con entradas def (un directorio), def/ghiy jkl, el código :

for (recursive_directory_iterator next(path("abc")), end; next != end; ++next)
    visit(next->path());

llama a visit con los argumentos path("abc/def/ghi") y path("abc/jkl"). Puede calificar la secuenciación a través de un subárbol de directorio de dos maneras:

  1. Un vínculo simbólico de directorio solo se examina si crea un recursive_directory_iterator con un directory_options argumento cuyo valor es directory_options::follow_directory_symlink.

  2. Si llama a disable_recursion_pending, no se examina de forma recursiva un directorio posterior encontrado durante un incremento.

Constructores

Constructor Descripción
recursive_directory_iterator Construye un objeto recursive_directory_iterator.

Funciones miembro

Función de miembro Descripción
profundidad Devuelve mystack.size() - 1, por lo que pval está en cero de profundidad.
disable_recursion_pending Almacena true en no_push.
increment Avanza al siguiente nombre de archivo en secuencia.
Opciones Devuelve myoptions.
pop Mueve el iterador a la siguiente entrada en la siguiente profundidad inferior.
recursion_pending Devuelve !no_push.

Operators

Operador Descripción
operator!= Devuelve !(*this == right).
operator= Los operadores de asignación de miembros predeterminados se comportan según lo previsto.
operator== Devuelve true solo si y *thisright son iteradores de final de secuencia o ambos no son iteradores de fin de secuencia.
operator* Devuelve myentry.
operator-> Devuelve &**this.
operator++ Incrementa .recursive_directory_iterator

Requisitos

Encabezado: <experimental/filesystem>

Espacio de nombres:std::experimental::filesystem

recursive_directory_iterator::d epth

Devuelve mystack.size() - 1, por lo que pval está en cero de profundidad.

int depth() const;

recursive_directory_iterator::d isable_recursion_pending

Almacena true en no_push.

void disable_recursion_pending();

recursive_directory_iterator::increment

Avanza al siguiente nombre de archivo en secuencia.

recursive_directory_iterator& increment(error_code& ec) noexcept;

Parameters

ec
Código de error especificado.

Observaciones

La función intenta avanzar al siguiente nombre de archivo de la secuencia anidada. Si se ejecuta correctamente, almacena ese nombre de archivo en myentry; de lo contrario, genera un iterador de fin de secuencia.

recursive_directory_iterator::operator!=

Devuelve !(*this == right).

bool operator!=(const recursive_directory_iterator& right) const;

Parameters

right
recursive_directory_iterator para la comparación.

recursive_directory_iterator::operator=

Los operadores de asignación de miembros predeterminados se comportan según lo previsto.

recursive_directory_iterator& operator=(const recursive_directory_iterator&) = default;
recursive_directory_iterator& operator=(recursive_directory_iterator&&) = default;

Parameters

recursive_directory_iterator
objeto recursive_directory_iterator que se copia en .recursive_directory_iterator

recursive_directory_iterator::operator==

Devuelve true solo si tanto *this como la derecha son iteradores de final de secuencia o ambos no son iteradores de fin de secuencia.

bool operator==(const recursive_directory_iterator& right) const;

Parameters

right
recursive_directory_iterator para la comparación.

recursive_directory_iterator::operator*

Devuelve myentry.

const directory_entry& operator*() const;

recursive_directory_iterator::operator->

Devuelve &**this.

const directory_entry * operator->() const;

recursive_directory_iterator::operator++

Incrementa .recursive_directory_iterator

recursive_directory_iterator& operator++();

recursive_directory_iterator operator++(int);

Parameters

int
Argumento ficticio. Se trata de una convención de C++ que solo se usa para distinguir el operador de incremento de postfijo del operador de incremento de prefijo. El estándar de C++ requiere que el formulario de postfijo tome un parámetro int ficticio.

Observaciones

La primera función miembro llama a increment()y, a continuación, devuelve *this. La segunda función miembro realiza una copia del objeto, llama a increment()y, a continuación, devuelve la copia.

recursive_directory_iterator::options

Devuelve myoptions.

directory_options options() const;

recursive_directory_iterator::p op

Mueve el iterador a la siguiente entrada en la siguiente profundidad inferior.

void pop();

Observaciones

Si depth() == 0es , el objeto se convierte en un iterador de fin de secuencia. De lo contrario, la función miembro finaliza el examen del directorio actual (más profundo) y se reanuda en la siguiente profundidad inferior.

recursive_directory_iterator::recursion_pending

Devuelve !no_push.

bool recursion_pending() const;

recursive_directory_iterator::recursive_directory_iterator

Construye un objeto recursive_directory_iterator.

recursive_directory_iterator() noexcept;
explicit recursive_directory_iterator(const path& pval,
    directory_options opts = directory_options::none);

recursive_directory_iterator(const path& pval,
    directory_options opts,
    error_code& ec) noexcept;
recursive_directory_iterator(const path& pval,
    error_code& ec) noexcept;
recursive_directory_iterator(const recursive_directory_iterator&) = default;
recursive_directory_iterator(recursive_directory_iterator&&) = default;

Parameters

pval
Ruta de acceso especificada.

error_code
Código de error especificado.

opts
Las opciones de directorio especificadas.

recursive_directory_iterator
recursive_directory_iterator del que se va a copiar el objeto construidorecursive_directory_iterator.

Observaciones

El primer constructor crea un iterador de fin de secuencia. El segundo constructor almacena false y no_pushopta por myoptions, después intenta abrir y leer pval como directorio. Si se ejecuta correctamente, inicializa mystack y myentry apunta al primer nombre de archivo que no es de directorio en la secuencia anidada. Si se produce un error, crea un iterador de fin de secuencia.

Los constructores tercero y cuarto se comportan igual que el segundo, salvo que notifican errores en ec en lugar de producir una excepción. El cuarto constructor almacena directory_options::none en myoptions. El constructor predeterminado se comporta según lo previsto.

Consulte también

<experimental/filesystem>
directory_entry clase