2009-04-15 35 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)