gpt4 book ai didi

c - 如何获取磁盘中文件的大小?

转载 作者:行者123 更新时间:2023-12-04 13:44:40 24 4
gpt4 key购买 nike

如何获取磁盘中文件的大小?如 Windows 资源管理器中所示?例如,文件名具有:

size: 172 bytes (172 bytes)
size on disk: 0 bytes

但我的应用程序显示:
GetDiskFreeSpace(L"C:\\" &sectorsPerCluster, &lpBytesPerSector,
&numberOfFreeClusters, &totalNumberOfClusters));
int TotalSize = lpBytesPerSector * ((fileLength + lpBytesPerSector - 1) / lpBytesPerSector);
printf("fileLength = %d\n", fileLength);
printf("TotalSize = %d\n", TotalSize);

它输出:
fileLength = 172
TotalSize = 512

我缺少什么来正确计算文件名的磁盘大小?

最佳答案

也许为时已晚,但我想我有了答案。
Windows 资源管理器可能会显示正确的信息。
在 NTFS 上,小文件数据可以嵌入到 MFT(主文件表)中。主文件表是系统文件,其中包含有关磁盘上每个文件的信息(包括其本身,是的)。信息存储在 MFT 条目中,通常为 1024 字节。通常有文件名和在哪里可以找到它的数据。但是对于较小的文件,数据可以存储在 MFT 本身中。
其他文件系统也可能采用某种方式将小文件嵌入到 FS 元数据中。 FAT/FAT32/exFAT 没有,但我不知道 ReFS。
不将 FS 结构中的数据计算为磁盘上的大小是合乎逻辑的,因为对于较大的文件,名称也不计算在内。
磁盘上的大小小于 size 的其他原因是压缩或稀疏文件。
我不知道 Explorer 是如何获取这些信息的,但您可以使用 FSCTL_GET_RETRIEVAL_POINTERS IOCTL 获取磁盘上的文件位置,然后解析生成的 RETRIEVAL_POINTERS_BUFFER .这很复杂,但我不知道更简单的方法。我试过了 GetCompressedFileSize ,但它仍然为 in-MFT 文件返回非零文件大小。
Article评论中的链接在 中说奖金闲聊

Starting in Windows 8.1, the Size on disk calculation includes the sizes of alternate data streams and sort-of-kind-of tries to guess which streams could be stored in the MFT and not count them toward the size on disk. (Even though they really are on disk. I mean, if they’re not on disk, then where are they?)


没有具体说明什么意味着某种类型的尝试猜测,但使用 FSCTL_GET_RETRIEVAL_POINTERS你可以得到准确的答案。

关于c - 如何获取磁盘中文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51033508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com