Есть ли более быстрый способ найти все файлы в каталоге и всех подкаталогах?
m написание программы, которая должна искать в каталоге и во всех его подкаталогах файлы с определенным расширением. Это будет использоваться как на локальном, так и на сетевом диске, поэтому производительность является проблемой.
Вот'это рекурсивный метод, который яиспользую сейчас:
private void GetFileList(string fileSearchPattern, string rootFolderPath, List files)
{
DirectoryInfo di = new DirectoryInfo(rootFolderPath);
FileInfo[] fiArr = di.GetFiles(fileSearchPattern, SearchOption.TopDirectoryOnly);
files.AddRange(fiArr);
DirectoryInfo[] diArr = di.GetDirectories();
foreach (DirectoryInfo info in diArr)
{
GetFileList(fileSearchPattern, info.FullName, files);
}
}
Я мог бы установить SearchOption на AllDirectories и не использовать рекурсивный метод, но в будущем я 'Я хочу вставить код, чтобы уведомить пользователя о том, какая папка сканируется в данный момент.
В то время как я'Теперь я создаю список объектов FileInfo, и все, что меня действительно волнует, - это пути к файлам. Я'у меня будет существующий список файлов, который я хочу сравнить с новым списком файлов, чтобы увидеть, какие файлы были добавлены или удалены. Есть ли более быстрый способ создать этот список путей к файлам? Могу ли я что-нибудь сделать, чтобы оптимизировать поиск файлов вокруг запросов файлов на общем сетевом диске?
Обновление 1
Я попытался создать нерекурсивный метод, который делает то же самое, сначала находя все подкаталоги, а затем итеративно сканируя каждый каталог на наличие файлов. Вот's метод:
public static List GetFileList(string fileSearchPattern, string rootFolderPath)
{
DirectoryInfo rootDir = new DirectoryInfo(rootFolderPath);
List dirList = new List(rootDir.GetDirectories("*", SearchOption.AllDirectories));
dirList.Add(rootDir);
List fileList = new List();
foreach (DirectoryInfo dir in dirList)
{
fileList.AddRange(dir.GetFiles(fileSearchPattern, SearchOption.TopDirectoryOnly));
}
return fileList;
}
Обновление 2
Хорошо, так что яМы выполнили несколько тестов для локальной и удаленной папок, в которых много файлов (~ 1200). Вот методы, которые ямы запускаем тесты Результаты ниже.
GetFileListA (): Нерекурсивное решение в обновлении выше. Я думаю это'эквивалентно Джеюс решением.GetFileListB (): Рекурсивный метод из оригинального вопросаGetFileListC (): Получает все каталоги с помощью статического метода Directory.GetDirectories (). Затем получает все пути к файлам с помощью статического метода Directory.GetFiles (). Заполняет и возвращает списокGetFileListD (): Марк ГравеллРешение с использованием очереди и возвращает IEnumberable. Я заполнил список полученным IEnumerableDirectoryInfo.GetFiles: Дополнительный метод не создан. Создание DirectoryInfo из пути к корневой папке. Вызывается GetFiles с использованием SearchOption.AllDirectoriesDirectory.GetFiles: Дополнительный метод не создан. Вызывается статический метод GetFiles каталога с использованием SearchOption.AllDirectoriesMethod Local Folder Remote Folder
GetFileListA() 00:00.0781235 05:22.9000502
GetFileListB() 00:00.0624988 03:43.5425829
GetFileListC() 00:00.0624988 05:19.7282361
GetFileListD() 00:00.0468741 03:38.1208120
DirectoryInfo.GetFiles 00:00.0468741 03:45.4644210
Directory.GetFiles 00:00.0312494 03:48.0737459
, , так выглядит как Маркs самый быстрый.