std::filesystem:: directory_iterator
|
Определено в заголовке
<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
|
(начиная с C++20) | |
|
template
<>
constexpr
bool
|
(начиная с 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 |
Смотрите также
|
(C++17)
|
итератор для содержимого директории и её поддиректорий
(класс) |
|
(C++17)
|
опции для итерации по содержимому директории
(перечисление) |
|
(C++17)
|
запись директории
(класс) |