在编写之前,我需要知道给定的内存缓冲区作为磁盘(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;
}
哪个似乎工作正常,但是 GetDiskFreeSpace()仅适用于最高2GB的磁盘,具体取决于MSDN。 GetDiskFreeSpaceEx()不会返回相同的信息,所以我的问题是,如何为驱动器> 2GB计算此信息?我错过了API调用吗?根据整体磁盘大小,我可以假设一些硬值吗?
答案 0 :(得分:3)
MSDN仅声明GetDiskFreeSpace()
功能无法报告大于2GB的卷大小。它适用于检索每个群集的扇区和每个扇区的字节数,我自己使用它来获得非常相似的代码;-)
但如果您也想要磁盘容量,则需要额外调用GetDiskFreeSpaceEx()
。
答案 1 :(得分:3)
磁盘上文件的大小是一个模糊概念。在NTFS中,文件由一组数据元素组成。你是“无名数据流”的主要思想。这是一个文件的属性,如果很小,可以用目录条目中的其他属性打包。 Apparently,您可以在目录条目本身中存储最多700-800字节的数据流。因此,您假设的1字节文件将与0字节或700字节文件一样大。
另一个影响是文件压缩。这将使磁盘上的大小可能小于内存中的大小。
答案 2 :(得分:1)
您应该能够使用DeviceIoControl功能和
获取此信息
DISK_GEOMETRY_EX。它将返回一个包含您正在寻找的信息的结构我认为
http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx
答案 3 :(得分:-3)
在动作中!
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)