Newsgroup: it.comp.lang.delphi
Titolo: Ricerca Files... ma....

Salve a tutti...
vengo subito al dunque...
ho realizzato un piccolo programma che deve ottenere una lista completa di
tutti i files contenuti in una dir e tutte le eventuali sottodir ... ho
risolto temporaneamente facendo uso delle funzioni FindFirst e Findnext
richiamate in modo ricorsivo. ma a me servirebbe una cosa che non richieda
la ricorsività ne le funzioni findfirst findnext (che accendono direttamnte
al disco... e quindi sono lente..)
(occupa troppe risorse e troppo tempo se sono presenti molti files).
--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|()|===================|()|
|()|                                           |()|
|()|        .-=] ExTrEmE [=-.      |()|
|()|                                           |()|
|()|          ICQ#12987528        |()|
|()|   MailTo : 
extr...@tin.it
  |()|
|()|                                           |()|
|()|===================|()|
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

...


Ti ringrazio dei suggerimenti.. sopratutto del findclose (che io non ho
usato :-)) )
Per memorizzare i path ho usato un array di stringhe che ridimensiono man
mano che mi serve più spazio ...possibile che sia qui il rallentamento?
In particolare questa procedura opera tramite una shell extension di tipo
property sheet che sistematicamente non viene "refreshata" (termine orribile
creato per l'occasione) mentre la procedura viene eseguita..
questa è la procedura mia...
... è un po' lunghetta e forse non molto chiara (i commenti sono pura
illusione :-) )
P.S. :Outlook ha stressato con il mettere "file://"
file://questa procedura riempe l'array con i path dei file scansionando
tutte le subdir a partire da una basedir (Path)
   Procedure ScanFiles(Path:Ansistring;FileExtension:string;var
FolderCount:integer;var FilesCount:integer);
    var searchrec:Tsearchrec;
        result:integer;
        Messaggio:TMsg;
        S:AnsiString;
    function CheckExt(Filename:AnsiString;extension:string):boolean;
    var
      FnameLen:byte;
      Ext:array [1..4] of char;
      strext:string[4];
    begin
      if extension='.*' then
        CheckExt:=True
      else
      begin
        filename:=uppercase(filename);
        extension:=uppercase(extension);
        FnameLen:=length(Filename);
        ext[4]:=filename[fnamelen-0];
        ext[3]:=filename[fnamelen-1];
        ext[2]:=filename[fnamelen-2];
        ext[1]:=filename[fnamelen-3];
        strext:=ext;
        if strext=extension then
          CheckExt:=true
          else
            CheckExt:=False;
      end;
    end;
    begin
//   try
      chdir(path);
//    except EInOutError do
//      begin
//        MessageDlg('Error occurred by tryng to change
directory',mtwarning,[mbOK],0);
//        exit;
//      end;
//  end;
      if length(path)<>3 then
        path:=path+'\';
      FindFirst(path+'*.*',faanyfile,searchrec);
      repeat
        if searchrec.attr=Fadirectory then
          begin
            if (
searchrec.name
<>'.')AND(
searchrec.name
<>'..')then
              begin
                Inc(FolderCount);
                getdir(0,s);
                if length(s)<>3 then
                  s:=s+'\';
ScanFiles(s+
searchrec.name
,EstensioneFile,DirNumber,FileNumber);
              end;
          end
        else
          begin
            GetDir(0,s);
            if (length(s)<>3) then
              begin
                if (checkext(
searchrec.name
,FileExtension)) then
                  begin
                    inc(FilesCount);
                    SetLength(FileList,Filescount+1);
                    FileList[Filescount]:=s+'\'+
searchrec.name
;
                  end;
              end
          else
             begin
               if (checkext(
searchrec.name
,FileExtension)) then
                begin
                  inc(FilesCount);
                  SetLength(FileList,Filescount+1);
                  FileList[Filescount]:=s+'\'+
searchrec.name
;
                end;
             end;
       end;
       result:=Findnext(searchrec);
     until result<>0;
     getdir(0,s);
     if length(s)<>3 then chdir('..');
end;

file.txt) perchè ci metteva di meno che a farmelo io a manina...
NB: "opzioneX" era un'opzione di "dir" che ometteva le intestazioni (ti
ritrovi proprio solo la lista di files senza dimensioni, ecc ecc)....
In genere cmq io cerco di evitare di cercarmi files sparsi sul disco: se il
disco è grosso (ormai molti dischi sono ben sopra i 5 Gb) la procedura è
lenta...
Se possibile faccio scegliere all'utente almeno la directory da cui partire
con la ricerca...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply