std::filesystem:: directory_iterator
|
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
|
(depuis C++20) | |
|
template
<>
constexpr
bool
|
(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
|
(C++17)
|
un itérateur vers le contenu d'un répertoire et de ses sous-répertoires
(classe) |
|
(C++17)
|
options pour l'itération du contenu des répertoires
(énumération) |
|
(C++17)
|
une entrée de répertoire
(classe) |