以编程方式预先确定文件“磁盘上的大小”

时间:2009-04-15 11:00:42

标签: c windows winapi diskspace filesize

在编写之前,我需要知道给定的内存缓冲区作为磁盘(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调用吗?根据整体磁盘大小,我可以假设一些硬值吗?

4 个答案:

答案 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

http://msdn.microsoft.com/en-us/library/ms809010.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)