Buscando arquivos recursivamente

Diversas vezes nos deparamos com problemas onde há a necessidade de efetuarmos uma busca em um diretorio procurando por um arquivo. De fato, este algoritmo pode ser implementado para “n” finalidades. Ele percorre um diretório verificando a existência de arquivos e, caso seja necessário, entra dentro de subdiretórios para efetuar uma busca completa.

function TForm1.Busca(const cPath, cFile: String): Boolean;
var
  S: String;
  nRet: Integer;
  Search: TSearchRec;
begin
  nRet := FindFirst(cPath+'*.*', faAnyFile or faArchive or faDirectory, Search);
  while nRet = 0 do
  begin
    if (Trim(Search.Name) <> '.') and (Trim(Search.Name) <> '..') then
    begin
      { Se for um diretório, chama a função para percorrê-lo. }
      if Search.Attr and faDirectory > 0 then
        Busca(IncludeTrailingPathDelimiter(cPath+Search.Name), cFile)
      { Neste caso estamos fazendo uma busca exata, pode-se fazer um if com pos
        para buscar extensões partes do nome e etc. }

      else if Trim(Search.Name) = cFile then
        Memo1.Lines.Add(cPath+Search.Name);
    end;
    nRet := FindNext(Search);
  end;
end;

Exemplo de uso:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Busca('C:\Windows\', 'user32.dll');
end;