Existe uma maneira mais rápida do que isso de encontrar todos os arquivos em um diretório e todos os subdiretórios?

Estou escrevendo um programa que precisa pesquisar em um diretório e em todos os seus subdiretórios por arquivos com uma determinada extensão. Isso será usado tanto em uma unidade local quanto em uma unidade de rede; portanto, o desempenho é um problema.

Aqui está o método recursivo que estou usando agora:

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);
    }
}

Eu poderia definir o SearchOption como AllDirectories e não usar um método recursivo, mas no futuro desejarei inserir algum código para notificar o usuário sobre a pasta que está sendo verificada no momento.

Enquanto estou criando uma lista de objetos FileInfo agora, tudo o que realmente me interessa são os caminhos para os arquivos. Vou ter uma lista de arquivos existente, que quero comparar com a nova lista de arquivos para ver quais arquivos foram adicionados ou excluídos. Existe alguma maneira mais rápida de gerar essa lista de caminhos de arquivo? Há algo que eu possa fazer para otimizar essa pesquisa de arquivos, consultando os arquivos em uma unidade de rede compartilhada?

Atualização 1

Tentei criar um método não recursivo que faça a mesma coisa, primeiro localizando todos os subdiretórios e depois analisando iterativamente cada diretório em busca de arquivos. Aqui está o método:

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;
}

Atualização 2

Tudo bem, então eu executei alguns testes em uma pasta local e remota, os quais têm muitos arquivos (~ 1200). Aqui estão os métodos nos quais eu executei os testes. Os resultados estão abaixo.

GetFileListA (): Solução não recursiva na atualização acima. Eu acho que é equivalente à solução de Jay.GetFileListB (): Método recursivo da pergunta originalGetFileListC (): Obtém todos os diretórios com o método estático Directory.GetDirectories (). Em seguida, obtém todos os caminhos de arquivo com o método estático Directory.GetFiles (). Preenche e retorna uma ListaGetFileListD (): A solução de Marc Gravell usando uma fila e retorna IEnumberable. Eu preenchi uma lista com o IEnumerable resultanteDirectoryInfo.GetFiles: Nenhum método adicional criado. Instanciada uma DirectoryInfo do caminho da pasta raiz. Chamado GetFiles usando SearchOption.AllDirectoriesDirectory.GetFiles: Nenhum método adicional criado. Chamado o método estático GetFiles do Diretório usando o 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

. . .so parece que Marc é o mais rápido.

questionAnswers(13)

yourAnswerToTheQuestion