Я столкнулся с той же проблемой только сегодня. Я взломал следующий код. Если вы хотите использовать его в реальном продукте, вам может потребоваться улучшить обработку ошибок. Так как это было для сценария с одним выстрелом, мне было все равно.
static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*")
{
var todo = new Queue<string>();
todo.Enqueue(root);
while (todo.Count > 0)
{
string dir = todo.Dequeue();
string[] subdirs = new string[0];
string[] files = new string[0];
try
{
subdirs = Directory.GetDirectories(dir);
files = Directory.GetFiles(dir, pattern);
}
catch (IOException)
{
}
catch (System.UnauthorizedAccessException)
{
}
foreach (string subdir in subdirs)
{
todo.Enqueue(subdir);
}
foreach (string filename in files)
{
yield return filename;
}
}
}
Чтобы использовать его, вы можете:
string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
, который сначала перечисляет все файлы, сохраняет все имена файлов в памяти и только затем отображает их. В качестве альтернативы вы можете:
IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
Который пишет при перечислении и, следовательно, не должен хранить все имена файлов в памяти одновременно.