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?

È stato utile?

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

http://msdn.microsoft.com/en-us/library /ms809010.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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top