Ответ 1
Как насчет этого? Это позволяет избежать исключения, часто возникающего в результате встроенного рекурсивного поиска (т.е. Вы получаете отказ в доступе к одной папке, а весь ваш поиск умирает) и лениво оценивается (т.е. Возвращает результаты, как только они их обнаруживают, а не буферизация результатов 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);
}
}
}
}
}