Ленивый перебор файлов в C#
Ленивое перечисление важно в больших каталогах: методы Directory.EnumerateFiles
и DirectoryInfo.EnumerateFiles отдают имена по одному по мере обхода
и не собирают весь список в память сразу.
Цикл можно прервать после нужного файла, и остальные имена с диска не читаются.
Метод Directory.GetFiles сразу строит массив целиком.
Вызов Count в примере доходит до конца списка.
Подготовим каталог с двумя текстовыми файлами и посчитаем их по маске "*.txt". Обход к этому моменту уже закончен, поэтому каталог удаляется. Пока перечислитель ещё открыт, каталог не удаляют и не переименовывают:
string root = Path.Combine(Path.GetTempPath(), "lazy-gamma");
Directory.CreateDirectory(root);
File.WriteAllText(Path.Combine(root, "a.txt"), "1");
File.WriteAllText(Path.Combine(root, "b.txt"), "2");
DirectoryInfo dir = new DirectoryInfo(root);
int count = dir.EnumerateFiles("*.txt").Count();
Console.WriteLine(count); // выведет 2
Directory.Delete(root, true);
В каталоге "inbox" создайте файлы "note.txt", "photo.png" и "draft.txt". Выведите, сколько файлов с расширением txt вернёт перечисление.