如何获取磁盘中文件的大小?如Windows资源管理器中所示?例如,文件名具有:
size: 172 bytes (172 bytes)
size on disk: 0 bytes
但我的应用程序显示:
GetDiskFreeSpace(L"C:\\" §orsPerCluster, &lpBytesPerSector,
&numberOfFreeClusters, &totalNumberOfClusters));
int TotalSize = lpBytesPerSector * ((fileLength + lpBytesPerSector - 1) / lpBytesPerSector);
printf("fileLength = %d\n", fileLength);
printf("TotalSize = %d\n", TotalSize);
它输出:
fileLength = 172
TotalSize = 512
要正确计算文件名的磁盘大小,我会遗漏什么?
发布于 2021-09-12 17:36:13
也许太晚了,但我想我有答案了。
Windows资源管理器可能会显示正确的信息。
在NTFS上,小文件数据可以嵌入到MFT (主文件表)中。主文件表是包含有关磁盘上每个文件的信息的系统文件(包括其自身,是的)。信息存储在MFT条目中,通常为1024字节。通常有文件名和在哪里可以找到它的数据。但对于较小的文件,数据可以存储在MFT本身中。
其他文件系统也可能采用某种方式将小文件嵌入到FS元数据中。FAT/FAT32/exFAT没有,但我不知道ReFS。
不将FS结构中的数据计算为磁盘上的大小是合乎逻辑的,因为对于较大的文件,名称也不会计算在内。
磁盘上的大小小于大小的其他原因是压缩或稀疏文件。
我不知道资源管理器是如何获得此信息的,但您可以使用FSCTL_GET_RETRIEVAL_POINTERS
IOCTL获取磁盘上的文件位置,然后解析生成的RETRIEVAL_POINTERS_BUFFER
。这很复杂,但我不知道更简单的方法。我尝试过GetCompressedFileSize
,但是对于in-MFT文件,它仍然返回非零的文件大小。
在评论中链接的Article在Bonus chatter中说
从Windows8.1开始,磁盘大小计算包括备用数据流的大小和尝试猜测哪些流可以存储在
中,而不将它们计入磁盘大小。(即使它们真的在磁盘上。我的意思是,如果它们不在磁盘上,那么它们在哪里?)
没有指定什么是尝试猜测的排序,但是使用FSCTL_GET_RETRIEVAL_POINTERS
可以得到准确的答案。
https://stackoverflow.com/questions/51033508
复制相似问题