Метод EnumerateFiles
Directory.EnumerateFiles возвращает
IEnumerable<string>, а не массив:
элементы читаются по мере обхода. Сразу весь
список в память даёт
GetFiles
с типом string[]. Маска и
SearchOption работают так же.
Есть EnumerateFilesAsync.
Синтаксис
IEnumerable<string> seq = Directory.EnumerateFiles(path);
IEnumerable<string> seq = Directory.EnumerateFiles(
path, "*.txt");
Пример
Давайте посчитаем файлы через
foreach:
using System;
using System.IO;
class Program
{
static void Main()
{
Directory.CreateDirectory("abcde");
File.WriteAllText("abcde/12345.txt", "12345");
File.WriteAllText("abcde/67890.txt", "67890");
int res = 0;
foreach (string _ in Directory.EnumerateFiles("abcde"))
{
res++;
}
Console.WriteLine(res);
Directory.Delete("abcde", true);
}
}
Результат выполнения кода:
2
Пример
Давайте отфильтруем по маске
"*.txt":
using System;
using System.IO;
class Program
{
static void Main()
{
Directory.CreateDirectory("abcde");
File.WriteAllText("abcde/12345.txt", "12345");
File.WriteAllText("abcde/67890.dat", "67890");
int res = 0;
foreach (string _ in Directory.EnumerateFiles(
"abcde", "*.txt"))
{
res++;
}
Console.WriteLine(res);
Directory.Delete("abcde", true);
}
}
Результат выполнения кода:
1
Пример
Давайте сравним с GetFiles - число
элементов совпадает:
using System;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
Directory.CreateDirectory("abcde");
File.WriteAllText("abcde/12345.txt", "12345");
int lazy = Directory.EnumerateFiles("abcde").Count();
int arr = Directory.GetFiles("abcde").Length;
Console.WriteLine(lazy == arr);
Directory.Delete("abcde", true);
}
}
Результат выполнения кода:
True
Смотрите также
-
метод
GetFiles,
который сразу возвращает массив -
метод
EnumerateDirectories,
который лениво обходит папки -
метод
GetFileSystemEntries,
который смешивает файлы и каталоги -
File,
которым создают файлы для обхода