首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取磁盘中文件的大小?

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

Stack Overflow用户
提问于 2018-06-26 08:52:27
回答 1查看 121关注 0票数 4

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

代码语言:javascript
复制
size: 172 bytes (172 bytes)
size on disk: 0 bytes

但我的应用程序显示:

代码语言:javascript
复制
GetDiskFreeSpace(L"C:\\" &sectorsPerCluster, &lpBytesPerSector,
            &numberOfFreeClusters, &totalNumberOfClusters));
    int TotalSize = lpBytesPerSector * ((fileLength + lpBytesPerSector - 1) / lpBytesPerSector);
    printf("fileLength = %d\n", fileLength);
    printf("TotalSize = %d\n", TotalSize);

它输出:

代码语言:javascript
复制
fileLength = 172
TotalSize = 512

要正确计算文件名的磁盘大小,我会遗漏什么?

EN

回答 1

Stack Overflow用户

发布于 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文件,它仍然返回非零的文件大小。

在评论中链接的ArticleBonus chatter中说

从Windows8.1开始,磁盘大小计算包括备用数据流的大小和尝试猜测哪些流可以存储在

中,而不将它们计入磁盘大小。(即使它们真的在磁盘上。我的意思是,如果它们不在磁盘上,那么它们在哪里?)

没有指定什么是尝试猜测的排序,但是使用FSCTL_GET_RETRIEVAL_POINTERS可以得到准确的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51033508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档