Programowanie w języku Delphi

FindFirst

  • 2010-10-31 18:27
  • 3 komentarze
  • 4456 odsłon
  • Oceń ten tekst jako pierwszy
FindFirst
Moduł: SysUtils

function FindFirst (const FileMask: string; Attributes: Integer; var SerchResult: TSearchRec): Integer;

Funkcja FindFirst wyszukuje pliki pasujące do wzorca FileMask i posiadające atrybuty określone w Attributes. Jeśli zostały znalezione pliki pasujące do szablonu to pierwszy z nich jest zwracany w zmiennej SerchResult.

Zwracana wartość
Jeśli jakikolwiek plik zostanie znaleziony Funkcja zwraca wartość 0, w przeciwnym razie zwraca wartość niezerową.

FileMask
Zmienna FileMask może zawierać ścieżkę i/lub nazwę pliku. W nazwie można używać symboli wieloznacznych ? oraz *
symbol ? zastępuje jeden znak
symbol * zastępuje 0, 1 lub wiele znaków

Attributes
W zależności od wartości zmiennej Attributes wyszukiwane są tylko te pliki, które posiadają wymagane parametry.
Zmienna Attributes może przyjmować następujące wartości:
Nazwa stałejWartośćOpis
faReadOnly$00000001pliki tylko do odczytu
faHidden$00000002pliki ukryte
faSysFile$00000004pliki systemowe
faVolumeID$00000008pliki Volume ID
faDirectory$00000010katalogi
faArchive$00000020pliki archiwalne
faAnyFile$0000003Fwszystkie plik

Zmienna faAnyFile to suma wszystkich pozostałych atrybutów (faReadOnly + faHidden + faSysFile + faVolumeID + faDirectory + faArchive)
Oczywiście nic nie stoi na przeszkodzie aby wyszukiwać pliki, które będą miały więcej niż jeden wymagany atrybut - wystarczy je dodać do siebie.

SearchResult
SearchResult to rekord różniący się ilością i typem pól w zależności od systemu operacyjnego. Jego strukturę można zobaczyć poniżej

type
  TFileName = type string;
  TSearchRec = record
    Time: Integer;
    Size: Integer;
    Attr: Integer;
    Name: TFileName;
    ExcludeAttr: Integer;
{$IFDEF MSWINDOWS}
    FindHandle: THandle  platform;
    FindData: TWin32FindData  platform;
{$ENDIF}
{$IFDEF LINUX}
    Mode: mode_t  platform;
    FindHandle: Pointer  platform;
    PathOnly: String  platform;
    Pattern: String  platform;
{$ENDIF}
  end;


Opisze tylko część przeznaczoną dla systemu windows.

NazwaOpis
Timeczas i data ostatniej modyfikacji pliku. Może być przekonwertowany do typu TDateTime funkcją FileDateToDateTime
Sizerozmiar pliku w bajtach
Attratrybuty pliku (patrz opis zmiennej Attributes)
Namedługa nazwa pliku wraz z rozszerzeniem
ExcludeAttr??
FindHandlewewnętrzny uchwyt wykorzystywany do śledzenia aktualnego stanu wyszukiwania
FindDatato rekord zawierający dodatkowe dane, takie jak czas stworzenia pliku, zas ostatniego dostępu do pliku oraz krótką (DOSową) oraz długą (Windowsową) nazwę pliku


Po zakończeniu wyszukiwania (jeśli FindFirst zwróciła wartość 0) należy wywołać procedurę FindClose. Zwolni to zasoby zarezerwowane przez procedurę wyszukiwania

Jeśli FileMask nie zawiera informacji o ścieżce przeszukany zostanie aktualny katalog, który można zmienić np. procedurą ChDir

Przykład


//Wyszukiwanie plików tekstowych w bieżącym katalogu
procedure FindTXT;
var
  SearchResult : TSearchRec;
begin
  if FindFirst('*.txt', faAnyFile, SearchResult) = 0 then
  begin
    repeat
      ShowMessage(SearchResult.Name);
    until FindNext(SearchResult) <> 0;
    FindClose(searchResult);
  end;
end;


Zobacz też:


Funckje FindFirst i FindNext występują również w Turbo Pascalu, jednak różnią się one nieznacznie od swoich odpowiedników w delphi. Zdefiniowane są w module Dos.
Deklaracja:
procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);

gdzie zmienna Attr przyjmuje analogiczne nazwy jak delphi z tą różnicą, że nie są one poprzedzone prefiksem fa.
Nieco inne jest również podejście korzystania z owych procedur:
 var
  DirInfo: SearchRec;         
 begin                          
  FindFirst('*.PAS', Archive, DirInfo); 
  while DosError = 0 do
  begin
    Writeln(DirInfo.Name);
    FindNext(DirInfo);
  end;
 end.

3 komentarze

Misiekd 2006-09-09 20:52

a czego Ci brakuje???

JAK 2006-09-09 20:42

Szkoda, że rekord TSearchRec nie został dokładnie opisany. Mam tu na myśli podrekord FindData.

Oleksy_Adam 2006-07-31 10:36

Krótki i treściwy materiał. Na pewno będzie pomocny dla słabo znających angielski, a uzywających FindFirst/FindNext po raz pierwszy.