Newsgroup: it.comp.lang.delphi
Titolo: File size Delphi 7

Ciao a tutti!!! Io ho provato calcolare la grandezza di un file e ho
trovato molte funzioni che mi permettono di fa ciò...però riesco a
calcolare solo le dimensioni effettive e non la dimensione su disco
che è quello che mi interessa...mi potete aiutare?
Grazie mille!!!

 trovato molte funzioni che mi permettono di fa ciò...
quali?
A.


http://www.swissdelphicenter.ch/torry/showcode.php?id=172

> 
http://www.swissdelphicenter.ch/torry/showcode.php?id=172
billy, ti 6 fermato a torry? :-((
A.

Billy ha scritto:

Questo è complicato perchè dipende sia dal tipo di FAT che dalla 
dimensione del disco dove il file è memorizzato
Mi spiego (prendo come riferimento la FAT NTFS che, ora come ora, è 
molto comune)
  Dimensione unità
  (volume logico)                    Dimensione cluster       Settori
----------------------------------------------------------------------
       512 MB o inferiore                  512 byte              1
       513 MB - 1.024 MB (1 GB)         1.024 byte (1 KB)        2
     1.025 MB - 2.048 MB (2 GB)         2.048 byte (2 KB)        4
     2.049 MB e superiore               4.096 byte (4 KB)        8
Come vedi se il file è memorizzato su un disco superiore ai 2 MB e con 
fat NTFS il valore che dovro' usare sarà 4096, mentre se il disco è 
piccolo (per esempio 1 MB) il valore da usare è 2048.
Come usare questo valore? Facile... mettiamo che ho un file di cui so la 
dimensione (funzione FileSize) e voglio sapere lo spazio occupato su 
disco, basta che divido questa dimensione per il valore preso dalla 
tabella sopra, memorizzo la parte intera e, se vi è resto la incremento 
di un unità; ora basterà rimoltiplicare il valore ottenuto per lo stesso 
numero di prima.
Un po' di codice per capirci meglio (e per nulla ottimizzato):
Function Spazio_Effettivo_Su_Disco(DimFile, DimCluster : Integer) : Integer;
Var
   Valore, Resto : Integer;
Begin
   Valore := DimFile Div DimCluster;
   Resto  := DimFile Mod DimCluster;
   If Resto <> 0 Then Inc(Valore);
   Result := Valore * DimCluster;
End;
Come vedi non è facile specialmente per la prima parte (la dimensione 
del cluster) ma ti vengo in aiuto...
La tabella per NTFS te l'ho data io - per le altre basta usare google
Per sapere il drive dove è situato il file usa la funzione ExtractFileDrive.
Per sapere che tipo di fat ha un disco basta usare la funzione 
GetVolumeInformation e guarda il parametro di ritorno 
lpFileSystemNameBuffer che conterrà, in stringa, il tipo di fat (per 
esempio 'FAT' per fat normale o 'NTFS' per NTFS
bye, bye

Dimenticavo.... la fat NTFS puo' essere compressa ed allora la faccenda 
si complica. Non tanto per sapere se è compressa o meno (la funzione 
GetVolumeInformation ritorna questa informazione) ma per la dimensione 
del file (in questo caso FileSize serve a poco per il tuo scopo) per il 
quale devi usare la funzione GetCompressedFileSize.
Un'ultima cosa.. tutti questi magheggi non funzionano assolutamente su 
dischi di rete, per i quali non puoi sapere il tipo di FAT utilizzata (e 
a volte neanche la dimensione del disco)

 molto comune)
...quello che IO mi chiedo è perchè ci si limita a usare codice
beccato chissa dove in
modo assolutamente bovino senza fare il benche' minimo sforzo di
capire il fottuto codice che fa??
.. ancora, xche si si dimentica (o magari si VUOLE dimenticare...)
che  molte delle cose che delphi fa le fa xche sotto ci sta windows
che espone un api, documentata in modo sicuramente migliorabile, ma
documentata su un sito che OGNI SVILUPPATORE WINDOWS, su questa terra,
non puo non conoscere.
Magari, andando sul sito si scopre che una delle api usate dal codice
indicato nel link postato è dichiarata "obsolete", con un bel
suggerimento di quale API va usata al suo posto....
uff... :-|
A.

 suggerimento di quale API va usata al suo posto....
Come sopra. Personalmente su questo problema posto da Billy ho tentato 
di dare una soluzione, puo' essere buona o meno, ma comunque e' una base 
di partenza.
Per la cronaca il codice non e' stato preso a nessuna parte e, il codice 
per l'uso delle API viene dall'help dato dalla borland.
E per concludere io ho cercato di dare una risposta (cosa che si 
dovrebbe fare su un gruppo come questo) e non ho risposto a caso come 
"quali?" o "billy, ti 6 fermato a torry?". Queste non sono risposte ma 
solamente frasi che servono a mettere messaggi sul newsgroup e a 
stimolare flame vari.

 stimolare flame vari.
vero.
ma se dai un occhio ai vecchi post potresti, FORSE, condividere la mia
sensazione...
cmq, buon weeeknd! :-D
A.

 Mi spiego (prendo come riferimento la FAT NTFS che,
FAT e NTFS sono due cose diverse... non esiste la FAT NTFS...
Per sapere la dimensione del cluster, che è quello che serve per conoscere
lo spazio occupato indipendentemente dalla dimensione del disco, è
sufficiente chiederlo a Windows. La funziona non la ricordo, ma non sarà
diffcile trovarla.
bye, giubbe