Newsgroup: it.comp.lang.delphi
Titolo: [D7] Dimensione di un file

Ciao
        Qualcuno sa dirmi come riuscire a farmi restituire la dimensione di
un file senza usare assignfile??
Esiste per caso un API che dato il nome file me ne restituisca la
dimensione???
Io ho trovato getfilesize ma non riesco ad usarla in nessun modo....
Gio

> Io ho trovato getfilesize ma non riesco ad usarla in nessun modo....
Posta il codice cosi vediamo dove sbagli.
Comunque, gai gia visto il TSearchRec nella guida di delphi?
Bye
A
--
Per rispondere non usare il reply ma scrivere al seguente indirizzo:
zzato(at)supereva;it
Please, don'r reply this message.
Use this address:
zzato(at)supereva;it

 un file senza usare assignfile??
function GetFileSize(const FileName: TFileName): LongInt;
var
  SearchRec: TSearchRec;
begin
  if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
    begin
      Result := SearchRec.Size;
      FindClose(SearchRec);
    end
  else
    Result := -1;
end;
--
Acqua

 end;
Cosě facendo perň ci sono dei problemi con i file piů lunghi di un LongInt.
Al posto di usare la SearchRec.Size, io solitamente faccio cosě:
iSize: Int64
iSize := (Int64(SearchRec.FindData.nFileSizeHigh) * $100000000) +
Int64(SearchRec.FindData.nFileSizeLow);
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://snurl.com/sito_lis

 Int64(SearchRec.FindData.nFileSizeLow);
Sicuramente darebbe piů *sicurezza*.
Se poi si vuole esagerare di brutto:
var S : TSearchRec;
      Size : Extended;
begin
  FindFirst('c:\*.*', faAnyFile, S);
  Size := (S.FindData.nFileSizeHigh * MAXDWORD) + s.FindData.nFileSizeLow
  ...
--
Acqua

Ho provato con questo codice:
findfirst(dirmonitor1.directory+filename, faAnyFile, f);
AssignFile(log,'c:\temp\log.txt');
if FileExists('c:\temp\log.txt')
    then
        begin
            append(log);
            writeln(log,dirmonitor1.directory+filename+' '+app+'
'+inttostr(f.size));
        end
    else
        begin
            rewrite(log);
            writeln(log,dirmonitor1.directory+filename+' '+app+'
'+inttostr(f.size));
        end;
closefile(log);
Questo codice crea esattamente il file log.txt che però contiene
informazioni sbagliate. Tale porzione di codice viene eseguita quando accade
qualcosa sul
disco in quanto è chiamato da un componente che monitora.....
Rinominando, per esempio, il file "Esercizi.ps" in "1 Esercizi1.ps" ottengo
sul file log.txt il seguente out:
c:\temp\1 
esercizi.ps
 RENAMED OLD 512
c:\temp\
esercizi.ps
 RENAMED NEW 238079
La dimensione reale del file è 238079  e nn capisco perchè la prima volta me
lo indichi di 512 byte...
Saluti
Giò

 lo indichi di 512 byte...
di sicuro il tuo componente usa al suo interno la
FindFirstChangeNotification che, se configurata in un certo modo, ti alza
l'evento ad ogni variazione del file.
Quindi, la prima volta hai la dimensione relativa ai dati scritti sul file
al momento della sua creazione, 0 + n, le successive hai 0 + n +n1.. ad ogni
scrittura sul file in uso.
Io ho avuto un problema credo analogo al tuo e ho usato la stessa funzione
in una mia classe a seguito di un suggerimento di Arosio.
Ma avevo la necessita di processare un determinato file solo quando la sua
scrittura fosse stata completata.
Ho risolto passando alla FindFirstChangeNotification una serie di parametri
affinche l'evento trappato dalla waitforsingleobjec all'atto della modifica
degli attributi del file...
In pratica:
1) scrivo il file
2) quando ho finito di scriverci, lo imposto a sola lettura
3) un altra app ha una waitforsingleobject basata sull'handle di una
FindFirstChangeNotification configurata x rilevare solo i cambi di attributi
sui files del path indicato.
Appena cabiano gli attributi, questa app legge il file, fa un po di cose e
lo cancella.
