Frage

Ich muß wissen, wie groß ein gegebener in-Speicherpuffer als On-Disk (USB-Stick) sein wird, Datei, bevor ich es schreiben. Ich weiß, dass, wenn die Größe von der Blockgröße Grenze fällt, sein wahrscheinlich aufzurunden erhalten, z.B. eine 1-Byte-Datei nimmt 4096 Bytes auf der Festplatte auf. Ich bin derzeit diese mit GetDiskFreeSpace () tue , um die Plattenblockgröße zu arbeiten, dann dies die On-Disk-Größe wie folgt berechnen mit:

GetDiskFreeSpace(szDrive, &dwSectorsPerCluster, 
                 &dwBytesPerSector, NULL, NULL);

dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;

if (dwInMemorySize % dwBlockSize != 0)
{
    dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
    dwSizeOnDisk = dwInMemorySize;
}

Welche scheint gut zu funktionieren, ABER GetDiskFreeSpace () funktioniert nur auf Festplatten bis zu 2 GB gemäß MSDN. GetDiskFreeSpaceEx () nicht die gleichen Informationen nicht zurück, so meine Frage ist, wie sonst kann ich diese Informationen für Antriebe berechnen> 2GB? Gibt es eine API-Aufruf ich verpasst habe? Kann ich abhängig von der gesamten Festplattengröße einige harte Werte annehmen?

War es hilfreich?

Lösung

MSDN besagt nur, dass die GetDiskFreeSpace() Funktion nicht melden kann Volumengrößen größer als 2 GB. Es funktioniert gut für Sektoren pro Cluster Abrufen und Bytes pro Sektor, ich habe es selbst verwendet habe, für sehr ähnlich aussehenden Code ;-)

Aber wenn Sie Plattenkapazität zu wollen, müssen Sie einen zusätzlichen Aufruf GetDiskFreeSpaceEx() müssen.

Andere Tipps

Die Größe einer Datei auf der Festplatte ist ein Fuzzy-Konzept. In NTFS, besteht eine Datei aus einer Reihe von Datenelementen. Du bist primarilty Denken des „unbenannte Datenstrom“. Das ist ein Attribut einer Datei, die, wenn klein ist, kann mit den anderen Attributen im Verzeichniseintrag verpackt werden. Anscheinend , können Sie einen Datenstrom von Speichern von bis zu 700-800 Bytes im Verzeichniseintrag selbst. Daher Ihre hypothetische 1 Byte-Datei würde so groß wie eine 0 Byte oder 700 Byte-Datei sein.

Ein weiterer Einfluss ist die Dateikomprimierung. Dadurch wird die On-Disk-Größe möglicherweise kleiner als die In-Memory-Größe.

Es sollte möglich sein, diese Informationen zu erhalten, mit der DeviceIoControl Funktion und
DISK_GEOMETRY_EX. Es wird eine Struktur zurück, die die Informationen enthält, die Sie suchen Ich denke

http://msdn.microsoft.com/ en-us / 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top