Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
Défini dans l'en-tête <filesystem>
class directory_iterator ;
(depuis C++17)

directory_iterator est un LegacyInputIterator qui itère sur les éléments directory_entry d'un répertoire (mais ne visite pas les sous-répertoires). L'ordre d'itération n'est pas spécifié, sauf que chaque entrée de répertoire n'est visitée qu'une seule fois. Les noms de chemin spéciaux dot et dot-dot sont ignorés.

Si le directory_iterator signale une erreur ou est avancé au-delà de la dernière entrée du répertoire, il devient égal à l'itérateur construit par défaut, également appelé itérateur de fin. Deux itérateurs de fin sont toujours égaux, déréférencer ou incrémenter l'itérateur de fin est un comportement indéfini.

Si un fichier ou un répertoire est supprimé ou ajouté à l'arborescence de répertoires après la création de l'itérateur de répertoire, il n'est pas spécifié si le changement serait observé via l'itérateur.

Table des matières

Types membres

Type de membre Définition
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

Fonctions membres

construit un itérateur de répertoire
(fonction membre publique)
(destructor)
destructeur par défaut
(fonction membre publique)
assigne le contenu
(fonction membre publique)
accède à l'entrée pointée
(fonction membre publique)
avance à l'entrée suivante
(fonction membre publique)

Fonctions non membres

prise en charge de la boucle for basée sur des intervalles
(fonction)

De plus, operator== et operator!= sont (jusqu'à C++20) operator== est (depuis C++20) fournis comme requis par LegacyInputIterator .

Il n'est pas spécifié si operator!= est fourni car il peut être synthétisé à partir de operator== , et (depuis C++20) si un opérateur d'égalité est membre ou non-membre.

Spécialisations d'assistance

template <>

constexpr bool

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

constexpr bool

ranges:: enable_view < std :: filesystem :: directory_iterator > = true ;
(depuis C++20)

Ces spécialisations pour directory_iterator en font un borrowed_range et une view .

Notes

De nombreuses API système de bas niveau pour le parcours de répertoires récupèrent les attributs de fichier avec la prochaine entrée de répertoire. Les constructeurs et les fonctions membres non constantes de std::filesystem::directory_iterator stockent ces attributs, le cas échéant, dans le std::filesystem::directory_entry pointé sans appeler directory_entry::refresh , ce qui permet d'examiner les attributs des entrées de répertoire pendant leur itération, sans effectuer d'appels système supplémentaires.

Exemple

#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 peut être parcouru en utilisant une boucle for par intervalle
    for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) 
        std::cout << dir_entry.path() << '\n';
    std::cout << "\ndirectory_iterator en tant que plage:\n";
    // directory_iterator se comporte également comme une plage dans d'autres cas
    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';
    // supprimer le répertoire sandbox et tout son contenu, y compris les sous-répertoires
    std::filesystem::remove_all(sandbox);
}

Sortie possible :

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"

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
LWG 3480 C++20 directory_iterator n'était ni un borrowed_range ni une view il est les deux

Voir aussi

un itérateur vers le contenu d'un répertoire et de ses sous-répertoires
(classe)
options pour l'itération du contenu des répertoires
(énumération)
une entrée de répertoire
(classe)