2

在写入之前,我需要知道给定的内存缓冲区作为磁盘(USB 棒)文件有多大。我知道除非大小落在块大小边界上,否则它可能会被四舍五入,例如,一个 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()根据 MSDN 仅适用于高达 2GB 的磁盘。GetDiskFreeSpaceEx()不会返回相同的信息,所以我的问题是,我还能如何计算大于 2GB 的驱动器的此信息?有没有我错过的 API 调用?我可以根据整体磁盘大小假设一些硬值吗?

4

4 回答 4

3

MSDN 仅声明该GetDiskFreeSpace()函数不能报告大于 2GB的卷大小。它可以很好地检索每个集群的扇区和每个扇区的字节数,我自己将它用于非常相似的代码;-)

但如果您也需要磁盘容量,则需要额外调用GetDiskFreeSpaceEx().

于 2009-04-15T12:55:52.220 回答
3

磁盘上文件的大小是一个模糊的概念。在 NTFS 中,文件由一组数据元素组成。您主要考虑的是“未命名的数据流”。这是一个文件的属性,如果它很小,可以与目录条目中的其他属性一起打包。显然,您可以在目录条目本身中存储多达 700-800 字节的数据流。因此,您假设的 1 字节文件将与 0 字节或 700 字节文件一样大。

另一个影响是文件压缩。这将使磁盘上的大小可能小于内存中的大小。

于 2009-04-15T14:02:48.113 回答
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

于 2009-04-15T11:30:24.407 回答
-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)
于 2010-06-11T11:37:07.857 回答