Newsgroup: it.comp.lang.delphi
Titolo: FindFirst e FindNext sono cachate?

Ho un'applicazione (sì, sempre la solita ;-)) in cui posso trascinare file e
cartelle.
Siccome è frequente che si tratti di quantità abbastanza grosse (per fare le
prove uso tutto il mio disco C...) devo mostrare una barra di stato
dell'avanzamento dell'operazione.
Quindi per fare questo prima conto il numero di files totali coinvolti
nell'operazione (e lo uso per impostare il valore massimo di una
ProgressBar) e quindi svolgo l'operazione stessa.
Mi sono accorto che la fase di 'conta' è più lenta dell'operazione stessa e
questo mi pare quanto meno improbabile perchè ci sono parecchi aggiornamenti
grafici (mostro il percorso che sto analizzando) e alcuni oggetti/routine da
compiere.
Per esempio, per la sola cartella 'Documents and settings' (13k files e 430
cartelle per un totale di più di 9gb) l'operazione di conteggio dei files
dura dai 15 ai 20 secondi, mentre l'aggiunta vera e propria alla mia
applicazione dura dai 3 ai 6 secondi. Dopo un attimo di incredulità ho
pensato a dei malfunzionamenti nell'operazione di aggiunta ma tutto funziona
correttamente e i files ci sono tutti.
Può darsi quindi che ci sia una sorta di meccanismo di caching alle spalle
della FindFirst e FindNext?
La procedura che uso per fare la conta è questa:
function CountFiles(SearchPath: string): Integer;
var
  SearchRec : TSearchRec;
  bHasFiles: Boolean;
begin
  Result := 0;
  bHasFiles := FindFirst(SearchPath, faAnyFile, SearchRec) = 0;
  while bHasfiles do begin
    if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
      if (SearchRec.Attr and faDirectory) = faDirectory then
        Inc(Result, CountFilesInPath(ExtractFilePath(SearchPath) + '\' +
SearchRec.Name + '\*.*'))
      else
        Inc(Result);
    end;
    Application.ProcessMessages;
    bHasFiles := FindNext(SearchRec) = 0;
  end;
  FindClose(SearchRec);
end;
e la procedura che fa l'aggiunta è strutturalmente identica, solo che è più
"farcita"
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://lis77.bravepages.com
 (aggiornato *con foto*: 16/06/03)

 end;
Bye
A
--
Per rispondere non usare il reply ma scrivere al seguente indirizzo:
alsalvati(at)
supereva.it

 quadriprocessore alpha:
L'ho dimenticata, nella procedura che fa il conteggio inizialmente non c'era
(perchč in effetti non ne ho bisogno) ed era l'unica differenza
'sostanziale' dall'altra procedura che esegue l'operazione piů complessa.
L'avevo aggiunta per vedere se, per un qualche strano motivo, velocizzasse
la cosa.
A sostegno della tesi della cache č che trascinando una prima volta la
cartella 'documents and settings' impiega dai 15 ai 20 secondi, se ripeto la
stessa operazione subito dopo impiega dai 180 ai 200 millesimi di secondo
per rifare il conteggio dei files (per verificare i tempi uso la
GetTickCount)...


 della FindFirst e FindNext?
non penso proprio. Senz'altro e' Windows che cacha le strutture directory.
Ciao, Sandro

 della FindFirst e FindNext?
Windows effettua il caching dei persorsi a file e cartelle per velocizzare
gli accessi frequenti al disco. Infatti prova a fare un banale trova su
tutto il disco di qualcosa e a rifarlo subito dopo. Se i dati che andrebbero
in cache non sono superiori alla cache stessa, l'operazione è quasi
istantanea. Se invece i dati sono troppi, l'aggiunta degli ultimi cancella i
dati in cache dei primi e le prestazioni sono inferiori.
Ciao
Matteo

 non penso proprio. Senz'altro e' Windows che cacha le strutture directory.
Appunto, e cosa c'č alle spalle delle 2 funzioni se non Windows? ;-)


 dati in cache dei primi e le prestazioni sono inferiori.
Infatti è quello che succede a me, un tempo ridicolo per leggere le
informazioni di 13k files dopo che ho già fatto una prima lettura...
