Livello di programmazione determinare file “dimensione su disco” in anticipo
Domanda
Ho bisogno di sapere quanto grande sarà un dato di buffer in memoria come (chiavetta USB) su disco del file prima che io scrivo. So che a meno che la dimensione cade sul confine dimensione del blocco, la sua probabilità di essere arrotondato per eccesso, per esempio un file di 1 byte occupa 4096 byte su disco. Attualmente sto facendo questo con GetDiskFreeSpace () a lavorare fuori la dimensione del blocco del disco, quindi utilizzando questo per calcolare la dimensione su disco in questo modo:
GetDiskFreeSpace(szDrive, &dwSectorsPerCluster,
&dwBytesPerSector, NULL, NULL);
dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;
if (dwInMemorySize % dwBlockSize != 0)
{
dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
dwSizeOnDisk = dwInMemorySize;
}
Il che sembra funzionare bene, MA GetDiskFreeSpace () funziona solo su dischi fino a 2 GB in base alle MSDN. GetDiskFreeSpaceEx () non restituisce le stesse informazioni, quindi la mia domanda è: in quale altro modo posso calcolare queste informazioni per le unità> 2 GB? C'è una chiamata API che ho perso? Posso assumere alcuni valori duri a seconda della dimensione complessiva del disco?
Soluzione
MSDN afferma soltanto che la funzione GetDiskFreeSpace()
non può segnalare la dimensione del volume superiori a 2 GB. Funziona bene per il recupero di settori per cluster e byte per settore, ho usato io stesso per il codice molto simili di aspetto ;-)
Ma se si vuole anche la capacità del disco, avrete bisogno di una chiamata aggiuntiva a GetDiskFreeSpaceEx()
.
Altri suggerimenti
La dimensione di un file su disco è un concetto sfocata. In NTFS, un file è costituito da un insieme di elementi di dati. Stai pensando primarilty del "flusso di dati senza nome". Questo è un attributo di un file che, se piccolo, può essere imballato con gli altri attributi nella voce di directory. Apparentemente , è possibile memorizzare un flusso di dati di fino a 700-800 byte nella voce della rubrica stessa. Quindi, il file di 1 byte ipotetica sarebbe grande come un file di 0 byte o 700 byte.
Un'altra influenza è la compressione dei file. Questo renderà la dimensione su disco potenzialmente inferiore alla dimensione in memoria.
Si dovrebbe essere in grado di ottenere queste informazioni utilizzando la funzione DeviceIoControl e
DISK_GEOMETRY_EX. Si restituirà una struttura che contiene le informazioni che state cercando Penso
http://msdn.microsoft.com/ it-it / library / aa363216 (VS.85) aspx
In ActionScript!
var size:Number = 19912;
var sizeOnDisk:Number = size;
var reminder:Number = size % (1024 * 4);
if(reminder>0){
sizeOnDisk = size + ((1024 * 4)- reminder)
}
trace(size)
trace(sizeOnDisk)