Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
Определено в заголовке <filesystem>
class directory_iterator ;
(начиная с C++17)

directory_iterator является LegacyInputIterator , который выполняет итерацию по элементам directory_entry каталога (но не посещает подкаталоги). Порядок итерации не определён, за исключением того, что каждая запись каталога посещается только один раз. Специальные имена путей dot и dot-dot пропускаются.

Если directory_iterator сообщает об ошибке или продвигается за последнюю запись в директории, он становится равным итератору, созданному конструктором по умолчанию, также известному как конечный итератор. Два конечных итератора всегда равны, разыменование или инкрементирование конечного итератора является неопределенным поведением.

Если файл или каталог удаляется или добавляется в дерево каталогов после создания итератора каталога, не определено, будет ли это изменение обнаружено через итератор.

Содержание

Типы членов

Тип члена Определение
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

Функции-члены

создает итератор директории
(публичная функция-член)
(destructor)
деструктор по умолчанию
(публичная функция-член)
присваивает содержимое
(публичная функция-член)
обращается к указываемой записи
(публичная функция-член)
переходит к следующей записи
(публичная функция-член)

Функции, не являющиеся членами класса

поддержка range-based for loop
(функция)

Кроме того, operator== и operator!= предоставляются (до C++20) operator== предоставляется (начиная с C++20) в соответствии с требованиями LegacyInputIterator .

Не указано, предоставляется ли operator!= , поскольку он может быть синтезирован из operator== , и (начиная с C++20) является ли оператор равенства членом класса или внешней функцией.

Вспомогательные специализации

template <>

constexpr bool

ranges:: enable_borrowed_range < std :: filesystem :: directory_iterator > = true ;
(начиная с C++20)
template <>

constexpr bool

ranges:: enable_view < std :: filesystem :: directory_iterator > = true ;
(начиная с C++20)

Эти специализации для directory_iterator делают его borrowed_range и view .

Примечания

Многие низкоуровневые API ОС для обхода каталогов получают атрибуты файлов вместе со следующей записью каталога. Конструкторы и неконстантные функции-члены std::filesystem::directory_iterator сохраняют эти атрибуты, если они есть, в указываемый std::filesystem::directory_entry без вызова directory_entry::refresh , что позволяет проверять атрибуты записей каталога во время итерации по ним без дополнительных системных вызовов.

Пример

#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 можно итерировать с помощью цикла range-for
    for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) 
        std::cout << dir_entry.path() << '\n';
    std::cout << "\ndirectory_iterator как диапазон:\n";
    // directory_iterator также ведет себя как диапазон и в других аспектах
    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';
    // удалить директорию sandbox и все ее содержимое, включая поддиректории
    std::filesystem::remove_all(sandbox);
}

Возможный вывод:

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"

Отчёты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3480 C++20 directory_iterator was neither a borrowed_range nor a view it is both

Смотрите также

итератор для содержимого директории и её поддиректорий
(класс)
опции для итерации по содержимому директории
(перечисление)
запись директории
(класс)