Wyszukiwanie plików

Adam Boduch

Częstą czynnością w Delphi jest wyszukiwanie jakiegoś pliku. Chcesz np. zlokalizować starą wersje programu - wtedy przydaje się wyszukiwanie. W sumie nie jest to takie trudne.
Wszystko opiera się na rekordzie TSearchRec - zawiera on informacje o znalezionym pliku - jego nazwę, rozmiar, atrybuty itp.

Struktura tego rekordu przedstawia się następująco:

type
  TSearchRec = record
    Time: Integer;
    Size: Integer;
    Attr: Integer;
    Name: TFileName;
    ExcludeAttr: Integer;
    FindHandle: THandle;
    FindData: TWin32FindData;
  end;

Pierwszy atrybut zawiera informacje o czasie utworzenia pliku, kolejny to rozmiar utworzonego pliku. Następny parametr to atrybut pliku. Możliwe są takie oto atrybuty:

faReadOnlyTylko do odczytu
faHiddenUkryty
faSysVolumePlik systemowy
faVolumeIDEtykieta woluminu
faDirectoryKatalog
faArchiveZarchiwizowany
faAnyFileDowolny plik

Ostatni parametr zawiera bardziej szczegółowe informacje o pliku:

dwFileAttributesAtrybut pliku. Wyczerpująca informacja na ten temat znajduje się w systemi pomocy pod hasłem: WIN32_FIND-DATA
ftCreationTimeCzas utworzenia pliku
ftLastWriteTimeCzas ostatniej modyfikacji pliku
ftLastAccessTimeCzas ostatniego dostępu do pliku;

Na początku jeżeli chcesz znaleźć jakiś plik należy użyć funkcji FindFirst. Pierwszym jej parametrem musi być katalog oraz maska, w którym mają być szukane pliki. Drugi parametr do atrybut szukanego pliku, a ostatni parametr to wskazanie na rekord TSearchRec. Czyli powinno to wyglądać tak:

var
  SR : TSearchRec;
begin
  FindFirst('C:\*.*', faAnyFile, SR);
end;

To naturalnie nie wszystko bo należy to wpakować w pętle, która będzie wyszukiwać pliki z danej lokalizacji aż do wyczerpania ilości mogących zostać znalezionych plików. Liczbę znalezionych plików może reprezentować zmienna Found typu Integer.

var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow
begin
  Found := FindFirst('C:\*.*', faAnyFile, SR);
end;

Kontynuowanie procesu przeszukiwania będzie następowało za pomocą polecenia:

Found := FindNext(SR);

Na podstawie zdobytej wiedzy można napisać prostą procedurę odnajdującą pliki w danym katalogu:

procedure TForm1.Button1Click(Sender: TObject);
var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow
begin
  Found := FindFirst('C:\*.*', faAnyFile, SR); // odnajdz
  while (Found = 0) do // dopoki liczba znalezionych plikow nie bedzie rowna 0
  begin
    Memo1.Lines.Add('C:' + SR.Name); // dodaj do Memo znaleziony plik
    Found := FindNext(SR); // szukaj dalej
  end;
  FindClose(SR); // zakoncz wyszukiwanie
end;

To jest oczywiście najprostszy z możliwych do zastosowania procesów przeszukiwania plików, ale działa.

2 komentarzy

Wypadałoby to sformatować.