Czy istnieje szybszy sposób, aby znaleźć wszystkie pliki w katalogu i wszystkie podkatalogi?

Piszę program, który musi przeszukiwać katalog i wszystkie jego podkatalogi w poszukiwaniu plików, które mają określone rozszerzenie. Będzie to używane zarówno na dysku lokalnym, jak i sieciowym, więc wydajność jest trochę problemem.

Oto metoda rekurencyjna, której teraz używam:

private void GetFileList(string fileSearchPattern, string rootFolderPath, List<FileInfo> 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);
    }
}

Mogłem ustawić SearchOption na AllDirectories i nie używać metody rekurencyjnej, ale w przyszłości będę chciał wstawić jakiś kod, aby powiadomić użytkownika, który folder jest aktualnie skanowany.

Podczas gdy tworzę listę obiektów FileInfo teraz wszystko, na czym mi naprawdę zależy, to ścieżki do plików. Będę mieć istniejącą listę plików, które chcę porównać z nową listą plików, aby zobaczyć, jakie pliki zostały dodane lub usunięte. Czy istnieje szybszy sposób na wygenerowanie tej listy ścieżek plików? Czy jest coś, co mogę zrobić, aby zoptymalizować wyszukiwanie plików wokół zapytań o pliki na współużytkowanym dysku sieciowym?

Aktualizacja 1

Próbowałem utworzyć metodę nierekurencyjną, która robi to samo, najpierw znajdując wszystkie podkatalogi, a następnie skanując kolejno każdy katalog w poszukiwaniu plików. Oto metoda:

public static List<FileInfo> GetFileList(string fileSearchPattern, string rootFolderPath)
{
    DirectoryInfo rootDir = new DirectoryInfo(rootFolderPath);

    List<DirectoryInfo> dirList = new List<DirectoryInfo>(rootDir.GetDirectories("*", SearchOption.AllDirectories));
    dirList.Add(rootDir);

    List<FileInfo> fileList = new List<FileInfo>();

    foreach (DirectoryInfo dir in dirList)
    {
        fileList.AddRange(dir.GetFiles(fileSearchPattern, SearchOption.TopDirectoryOnly));
    }

    return fileList;
}

Aktualizacja 2

W porządku więc uruchomiłem kilka testów na lokalnym i zdalnym folderze, z których oba mają dużo plików (~ 1200). Oto metody, na których przeprowadziłem testy. Wyniki są poniżej.

GetFileListA (): Rozwiązanie nierekursywne w powyższej aktualizacji. Myślę, że jest to odpowiednik rozwiązania Jaya.GetFileListB (): Metoda rekurencyjna z pierwotnego pytaniaGetFileListC (): Pobiera wszystkie katalogi za pomocą statycznej metody Directory.GetDirectories (). Następnie pobiera wszystkie ścieżki plików za pomocą statycznej metody Directory.GetFiles (). Wypełnia i zwraca listęGetFileListD (): Rozwiązanie Marc Gravell używające kolejki i zwraca IEnumberable. Wypełniłem listę wynikowym IEnumerableDirectoryInfo.GetFiles: Nie utworzono dodatkowej metody. Utwórz instancję katalogu DirectoryInfo ze ścieżki folderu głównego. Wywołany GetFiles przy użyciu SearchOption.AllDirectoriesDirectory.GetFiles: Nie utworzono dodatkowej metody. Nazywany statyczną metodą GetFiles katalogu przy użyciu 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

. . . Wygląda na to, że Marc jest najszybszy.

questionAnswers(13)

yourAnswerToTheQuestion