Newsgroup: it.comp.lang.delphi
Titolo: Ricerca file in directory

Ho realizzato (prendendo spunto da un esempio trovato in rete) una
procedura che dovrebbe restituire un dato file o vari files all'interno
di una directory e nelle sue sottocartelle.
Il problema č che ad ogni avvio della procedura, questa mi restituisce
(a fronte di una stessa richiesta) un numero di risultati differenti.
E non capisco il perchč...   :(
Qualcuno sa dirmi dove sbaglio o dov'č l'errore?
// richiesta
begin
  RicercaFiles('*.exe', 'c:');
end
procedure RicercaFiles(Ricercato, Directory: String);
var bFoundFile: Boolean;
    mySearchRec: TSearchRec;
    sFileName: String;
    Nome: String;
    Est : String;
begin
  StatusBar.SimpleText := 'Ricerca in ' + Directory;
  Application.ProcessMessages;
  Ricercato := LowerCase(Ricercato);
  while Pos('*', Ricercato) > 0 do
    Ricercato := Copy(Ricercato, 1, Pos('*', Ricercato) -1) +
Copy(Ricercato, Pos('*', Ricercato) +1, 1000);
  if Pos('.', Ricercato) > 0 then begin
    Nome := copy(Ricercato, 1, pos('.', Ricercato) -1);
    Est  := copy(Ricercato, pos('.', Ricercato), 100);
  end else begin
    Nome := Ricercato;
    Est  := '';
  end;
  Directory := IncludeTrailingPathDelimiter(Directory);
  bFoundFile := FindFirst(Directory + '*.*', faAnyFile, mySearchRec) =
0;
  while bFoundFile do begin
    if (mySearchRec.Name[1] <> '.') then begin      // skip "." and ".."
      sFileName := LowerCase( Directory + mySearchRec.Name );
      Application.ProcessMessages;
      if ((mySearchRec.Attr and faDirectory) = 0) then begin // found a
file
        if ( (pos(Nome, sFileName) > 0) or (Nome = '') ) and (
(ExtractFileExt(sFileName) = Est) or (Est = '') ) then
          InserisciInLista(sFileName, False, ListaFilesRipristino);
      end else begin // found a directory
        sFileName := IncludeTrailingPathDelimiter(sFileName);
        // list the subdirectory
        RicercaFiles(Ricercato, sFileName);
      end;
    end;
    // find next file
    bFoundFile := FindNext(mySearchRec) = 0;
  end;
  FindClose(mySearchRec);
end;
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 (a fronte di una stessa richiesta) un numero di risultati differenti.
Io uso questa procedura e non ho mai incontrato problemi quando la usavo:
Unit FindFileSL;
{$R-}
Interface
Uses SysUtils,classes;
var continuare:boolean;
Procedure FindFiles (DirPath : String;      (* initial path           *)
                     Mask : String;          (* mask to look For       *)
                     Recurse : Boolean;      (* recurse into sub-dirs? *)
                     VAR Filelist : Tstringlist);
Implementation
Procedure FindFiles (DirPath : string;      (* initial path           *)
                     Mask : String;          (* mask to look For       *)
                     Recurse : Boolean;      (* recurse into sub-dirs? *)
                     Var filelist : Tstringlist);
  Procedure SubVisit ( DirPath : string );
  Var
    Looking4 : TSearchRec;
    doserror : integer;
  begin
    if continuare then DosError:=FindFirst ( Concat ( DirPath, Mask ),
faAnyFile, looking4);
    While ( DosError = 0 )and(continuare) Do begin
      if (( looking4.attr and ( faVolumeID + faDirectory ) ) = 0)
       then filelist.Append(DirPath+
looking4.name
);
      DosError:=FindNext ( Looking4 );
      end;   (* While *)
    findclose(looking4);
    if (Recurse)and( continuare)
     then begin
      DosError:=FindFirst ( Concat ( DirPath, '*.*' ), faAnyFile, looking4);
      While ( DosError = 0 ) and ( 
looking4.name
 [1] = '.' ) and
(continuare) Do
        DosError:=FindNext (looking4);   (* skip . and .. directories *)
      While ( DosError = 0 ) Do begin
        if ( ( looking4.attr and faDirectory ) =
faDirectory )and(continuare)
         then SubVisit ( Concat ( DirPath, 
looking4.name
, '\' ) );
        DosError:=FindNext ( Looking4 );
        end;   (* While *)
      end;   (* if recursing *)
   findclose(looking4);
  end;   (* SubVisit *)
begin   (* FindFiles *)
 continuare:=true;
 if filelist=nil then exit;
  SubVisit ( DirPath );
end;   (* FindFiles *)
end.
Questo permette di interrompere la ricerca in qualunque momento, inserendo
la ricerca in un thread e ponendo dal thread principale la variabile
continuare a false.
Il sorgente l'ho modificato...era per turbo pascal e l'ho adattato a delphi
2 (quindi funzionante anche su tutte le versioni 32 bit).
Prova a vedere se ti può andare...
Ciao
Matteo

 Prova a vedere se ti può andare...
Cavolo funziona eccome! 
Grazie mille Matteo
Ciao
