Показать сообщение отдельно
  #3  
Старый 10.07.2008, 01:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Можно съэкономить время, если:
- искать в 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;

Если надо автоматом перебрать все диски, то это уже чуть сложнее - надо получить список всех дисков и в цикле пройти по ним.
Ответить с цитированием