[ reiser @ 26.06.2004. 18:32 ] @
Treba mi sto brzi i manji algoritam za rekurzivnu pretragu fajlova na hard disku (ukljucujuci i subdirektorijume). Trazio sam po internetu, nasao sam samo neke komponente za pretrazivanje, btw meni treba (skup) procedura/funkcija koji ce, recimo da zapisu sve putanje do fajlova u jedan fajl.

Poz, Marko.
[ hwfanatic @ 26.06.2004. 21:06 ] @
Evo ja znam kako to da se odradi koristeći Windows-ov API, ako ti to nešto znači. Mada, to je ujedno i najsporija metoda...
[ bancika @ 28.06.2004. 00:47 ] @
evo ovako:
Code:

var
  FindResult: integer;
  SearchRec : TSearchRec;
begin
...
  FindResult := FindFirst(Path + '*.*', faAnyFile - faDirectory, SearchRec);
  while FindResult = 0 do
   begin
     //radis nesto sa fajlom SearchRec.Name
     FindResult := FindNext(SearchRec);
   end;
...
end;

promeni ono *.* u masku fajla koji trazis, path ti je ime direktorijuma.
i ako mene pitas, ovo je sasvim zadovoljavajuce brzine.
pozdrav
[ hwfanatic @ 28.06.2004. 08:55 ] @
Ne bi bilo loše da sve to staviš u try..finally klauzulu za slučaj neke neočekivane greške. Treba još dodati i SysUtils.FindClose(SearchRec); inače rizikuješ da handle bar jedne datoteke ostane zauzet.
[ reiser @ 28.06.2004. 12:54 ] @
Hvala na odgovorima, preradio sam onu proceduru koju mi je bancika dao :

Code:

procedure FindFiles(const Path, FileExt : String);
var
  SearchRec : TSearchRec;
begin
  If FindFirst(Path + FileExt, faAnyFile - faDirectory, SearchRec) = 0 Then
    repeat
      // Pronadjen fajl koji zadovoljava kriterijme (putanja = Path + SearchRec.Name)
    until FindNext(SearchRec) <> 0;

  If FindFirst(Path + '*.*', faDirectory, SearchRec) = 0 Then
    repeat
      If (SearchRec.Attr and faDirectory <> 0) and
         (SearchRec.Name <> '.') and
         (SearchRec.Name <> '..') Then
        FindFiles(Path + SearchRec.Name + '\', FileExt);
    until FindNext(SearchRec) <> 0;

  FindClose(SearchRec);
end;


Poz, Marko.

[ hwfanatic @ 28.06.2004. 13:16 ] @
Pazi samo da ti taj FindClose ne uzme iz Windows unit-a, jer to nije isto. Za svaki slučaj naznači da je iz unit-a SysUtils (negde gore sam napisao i kako).
[ reiser @ 28.06.2004. 13:36 ] @
Ne moze da pozove Windows.FindClose nikako, zato sto se ona poziva sa nekim parametrom tipa Cardinal, dok se SysUtils.FindClose poziva sa parametrom tipa TSearchRec.

Poz, Marko.
[ hwfanatic @ 28.06.2004. 14:48 ] @
Može, može... Ne bih ti ja to bez veze govorio. Meni je zbog toga pravio problem. Čisto da znaš, pa ako tebi radi ok i bez toga - super.