Можно съэкономить время, если:
- искать в 1 проход с рекурсией по каталогам сразу;
- искать по маске *.* и внутри проверять соответствие.
Код:
uses Masks;
procedure TForm1.SearchFiles(APath : String);
const
SearchMasks : Array [0..3] Of String = ('*.doc','*.xls','*.txt','*.rtf');
var
iFound : Integer;
F : TSearchRec;
function IsMatchMask(AFileName : String) : Boolean;
var
I : Integer;
begin
Result := False;
For I := Low(SearchMasks) To High(SearchMasks) Do
Begin
Result := MatchesMask(AFileName,SearchMasks[i]);
If Result Then Break;
End;
end;
begin
APath := IncludeTrailingPathDelimiter(APath);
iFound := FindFirst(APath + '*.*',faAnyFile,F);
While iFound = 0 Do
Begin
If (F.Attr And faDirectory) <> 0
Then
Begin
If (F.Name <> '.') And (F.Name <> '..')
Then SearchFiles(APath + F.Name);
End
Else
If IsMatchMask(F.Name)
Then Memo1.Lines.Add(APath + F.Name);
iFound := FindNext(F);
End;
FindClose(F);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Ишем на диске C:
Memo1.Lines.Clear;
SearchFiles('c:');
end;
Если надо автоматом перебрать все диски, то это уже чуть сложнее - надо получить список всех дисков и в цикле пройти по ним.