2009-04-15 79 views
2

我需要知道給定的內存緩衝區在寫入磁盤(usb stick)文件之前會有多大。我知道,除非尺寸落在塊尺寸邊界上,否則它可能會四捨五入。 1個字節的文件在磁盤上佔用4096個字節。目前,我正在做這個使用GetDiskFreeSpace()摸出磁盤塊大小,然後用此來計算在磁盤上的大小是這樣的:預先編程確定文件「磁盤上的大小」

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

dwBlockSize = dwSectorsPerCuster * dwBytesPerSector; 

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

這似乎是做工精細,根據MSDN,GetDiskFreeSpace()僅適用於最大2GB的磁盤。 GetDiskFreeSpaceEx()不會返回相同的信息,所以我的問題是,我該如何計算驅動器> 2GB的此信息?有沒有我錯過的API調用?我可以根據整個磁盤大小假設一些硬性值嗎?

+0

提示:這是一個「接近下一個倍數」。你可以使用blocks =(MemorySize +(BlockSize-1))%BlockSize;有點短。 – MSalters 2009-04-15 13:52:01

+0

這當然假設有問題的文件系統上需要多少空間容納N個字節。當然,它可能需要N個字節的數據,但一個文件也有元數據,需要考慮。元數據的大小可能與文件系統有很大差異。 – unwind 2009-04-15 13:53:57

回答

3

MSDN僅指出GetDiskFreeSpace()功能無法報告卷的大小大於2GB。它可以很好地檢索每個羣集的扇區和每個扇區的字節數,我自己使用它看起來非常相似的代碼;-)

但是,如果您也想要磁盤容量,則需要額外撥打GetDiskFreeSpaceEx()

+0

這會教會我更仔細地閱讀文檔!我剛剛試過我的硬盤上的代碼,它似乎工作得很好。謝謝。 – binarybob 2009-04-15 13:01:17

3

磁盤上文件的大小是一個模糊的概念。在NTFS中,文件由一組數據元素組成。你主要想着「未命名的數據流」。這是一個文件的屬性,如果很小,可以與目錄條目中的其他屬性一起打包。 Apparently,您可以在目錄條目本身中存儲最多700-800字節的數據流。因此,假設的1個字節的文件將與0字節或700字節的文件一樣大。

另一個影響是文件壓縮。這將使磁盤上的大小可能小於內存中的大小。

-3

在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)