Есть ли более быстрый способ найти все файлы в каталоге и всех подкаталогах?

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.AllDirectories
Method                       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 самый быстрый.

Ответы на вопрос(13)

Ваш ответ на вопрос