Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “程序确定文件”;“磁盘上的大小”;提前_C_Windows_Winapi_Diskspace_Filesize - Fatal编程技术网

C “程序确定文件”;“磁盘上的大小”;提前

C “程序确定文件”;“磁盘上的大小”;提前,c,windows,winapi,diskspace,filesize,C,Windows,Winapi,Diskspace,Filesize,在我写之前,我需要知道一个给定的内存缓冲区作为一个磁盘(U盘)文件会有多大。我知道,除非大小落在块大小边界上,否则很可能会向上取整,例如,一个1字节的文件在磁盘上占用4096字节。我目前正在使用GetDiskFreeSpace()计算磁盘块大小,然后使用它计算磁盘大小,如下所示: GetDiskFreeSpace(szDrive, &dwSectorsPerCluster, &dwBytesPerSector, NULL, NULL); dw

在我写之前,我需要知道一个给定的内存缓冲区作为一个磁盘(U盘)文件会有多大。我知道,除非大小落在块大小边界上,否则很可能会向上取整,例如,一个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调用吗?我可以根据总体磁盘大小假设一些硬值吗?

您应该能够使用DeviceIoControl功能和
DISK\u GEOMETRY\u EX.它将返回一个包含您正在查找的信息的结构


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


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

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

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

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

这将教会我更仔细地阅读文档!我刚刚在我的硬盘上尝试了这个代码,它似乎工作得很好。谢谢。提示:这是“下一个倍数的汇总”。您可以使用blocks=(MemorySize+(BlockSize-1))%BlockSize;稍微短一点。当然,这是假设一个包含N字节的文件在所讨论的文件系统上需要多少空间。当然,它可能需要N个字节的数据,但一个文件也有元数据,这需要考虑。元数据的大小可能因文件系统而异。我还将稀疏文件添加到例外列表中。稀疏文件不会自动出现,您必须有意创建它们。OTOH,我描述的属性打包总是发生的,如果目录(或磁盘)被压缩,文件压缩也会发生。