Как насчет этого? Он избегает исключения, часто вызываемого встроенным рекурсивным поиском (т.е. вы получаете отказ в доступе к одной папке, и весь ваш поиск умирает), и лениво оценивается (т.е. он возвращает результаты, как только он их находит, а не буферизация 2000 результатов). Ленивое поведение позволяет создавать адаптивные интерфейсы и т. Д., А также хорошо работает с LINQ (особенно First()
, Take()
и т. Д.).
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
static class Program { // formatted for vertical space
static void Main() {
foreach (string match in Search("c:\\", "*.xml")) {
Console.WriteLine(match);
}
}
static IEnumerable<string> Search(string root, string searchPattern) {
Queue<string> dirs = new Queue<string>();
dirs.Enqueue(root);
while (dirs.Count > 0) {
string dir = dirs.Dequeue();
// files
string[] paths = null;
try {
paths = Directory.GetFiles(dir, searchPattern);
} catch { } // swallow
if (paths != null && paths.Length > 0) {
foreach (string file in paths) {
yield return file;
}
}
// sub-directories
paths = null;
try {
paths = Directory.GetDirectories(dir);
} catch { } // swallow
if (paths != null && paths.Length > 0) {
foreach (string subDir in paths) {
dirs.Enqueue(subDir);
}
}
}
}
}