Procházení souborů pomocí FindFirstFile

Klíčová slova: FindFirstFile, FindNextFile, FindClose, TWIN32FINDDATAA, WIN32_FIND_DATA, WIN32_FIND_DATAA
Rubrika: Delphi

Již delší dobu používám v DELPHI pro procházení adresářové struktury funkce FindFirstFile a FindNextFile. Získané informace o souborech totiž obsahují jak alternativní název souboru (DOS jméno) tak i informace o datu vytvoření, posledního zápisu a data posledního přístupu k souboru.

Vlastní informace o souborech a adresářích jsou reprezentovány pomocí struktury WIN32_FIND_DATA. Obě funkce FindFirstFile a FindNextFile mají jako jeden z parametrů proměnnou této struktury. V Delphi je přístupná třída TWIN32FINDDATAA a _WIN32_FIND_DATAA která reprezentuje stejnou strukturu jako již zmiňovaný  WIN32_FIND_DATA. Tato struktura je definovaná následujícím způsobem:

WIN32_FIND_DATAA = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH - 1] of AnsiChar;
    cAlternateFileName: array[0..13] of AnsiChar;
  end;

A nyní již názorný příklad toho jak funkce FindFirstFile a FindNextFile použít.

procedure TForm1.FindData(aPath:string);
var
  aHandle : dword;
  konec : boolean;
  FileD : TWIN32FINDDATAA;
  p : PChar;
  FindPath : string;
  iStrLen : integer;
Begin
  if aPath<>'' then
  begin
    if not(copy(aPath,Length(aPath),1)='\')
       then aPath := aPath + '\' ;
    FindPath  := aPath + '*';
    iStrLen := Length (FindPath)+2;
    GetMem (p, iStrLen);
    StrPCopy (p,FindPath);
    aHandle := FindFirstFile( p , FileD);
    konec := (aHandle = INVALID_HANDLE_VALUE);
    while (not konec) do
    Begin
      if  ((StrPas(FileD.cFileName)<>'.') AND 
          (StrPas(FileD.cFileName)<>'..') ) then
      Begin
         if ((FileD.dwFileAttributes AND FILE_ATTRIBUTE_DIRECTORY)
             =FILE_ATTRIBUTE_DIRECTORY) then
         begin
           // .... Našel adresář
         End
         else
         begin
           // .... Našel soubor
         end;
      End;
      Application.ProcessMessages;
      konec := not FindNextFile (aHandle,FileD);
    End;
    Windows.FindClose(aHandle);
    FreeMem (p, iStrLen);
  end;
end;

Zajisté jste si všimli, že ve smyčce WHILE je volána procedura ProcessMessages. Toto volání není sice nezbytně nutné, ale pokud provádíte ve smyčce nějaké operace s vizuálními objekty na formuláři, tato funkce zajistí jejich správné fungování (překreslení atd.).

Autor: Jiří Provazník
Datum vydání: 23.01.2008 | Zobrazeno: 10455
Permanentní odkaz: Procházení souborů pomocí FindFirstFile

Komentáře (0)
Přidej vlastní komentář:
Následující (běžně neviditelná) pole slouží pro vnitřní identifikaci systému. Pokud je vyplníte nebude možné váš požadavek na straně serveru zpracovat:
URL:
contents:
Website:
Pro odeslání vašeho komentáře použijte tlačítko "Odeslat". Toto tlačítko nepoužívejte:

Následující položky je vhodné vyplnit:
Jméno :
Email :
Web :
Místo :
Hodnocení:
Hodnocení jako pomocí hvězdiček
1/5= nejhorší, 5/5=nejlepší