【问题标题】:How do I get the size of file in disk?如何获取磁盘中文件的大小?
【发布时间】:2018-12-04 14:54:59
【问题描述】:

如何获取磁盘中文件的大小?如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版本是错误的。一个 172 字节的文件在磁盘上的大小不能为 0,似乎当 = 1 时它们已经向下舍入了扇区数
  • 文件已损坏。这就是我要确定的。这算不算?
  • 您可以尝试拨打stat
  • @SteveSummit:我在 Windows 上。这是仅限 UNIX 的功能吗?
  • @Jack 我认为有 Windows 版本,但我不确定,我不确定他们会告诉您与您的 GetDiskFreeSpace() 通话不同的任何内容。但这可能值得一试。

标签: c winapi windows-10


【解决方案1】:

也许为时已晚,但我想我有答案了。

Windows 资源管理器可能会显示正确的信息。

在 NTFS 上,可以将小文件数据嵌入到 MFT(主文件表)中。主文件表是包含有关磁盘上每个文件的信息的系统文件(包括它本身,是的)。信息存储在 MFT 条目中,通常为 1024 字节。通常有文件名和在哪里可以找到它的数据。但对于较小的文件,数据可以存储在 MFT 本身中。

其他文件系统也可能采用某种方式将小文件嵌入到 FS 元数据中。 FAT/FAT32/exFAT 没有,但我不知道 ReFS。

不将 FS 结构中的数据计算为磁盘上的大小是合乎逻辑的,因为对于较大的文件名也不计算在内。

磁盘大小小于大小的其他原因是压缩文件或稀疏文件。

我不知道资源管理器是如何获取这些信息的,但是你可以使用FSCTL_GET_RETRIEVAL_POINTERSIOCTL 来获取磁盘上的文件位置,然后解析得到的RETRIEVAL_POINTERS_BUFFER。这很复杂,但我不知道更简单的方法。我尝试了GetCompressedFileSize,但它仍然返回非零文件大小的 in-MFT 文件。

Article在评论中链接在奖励chatter

从 Windows 8.1 开始,磁盘上的大小计算包括备用数据流的大小,并尝试猜测哪些流可以存储在 MFT 中,而不是将它们计入磁盘上的大小。 (即使它们确实在磁盘上。我的意思是,如果它们不在磁盘上,那么它们在哪里?)

没有具体说明 sort-of-kind-of-tries-to-guess 的含义,但使用 FSCTL_GET_RETRIEVAL_POINTERS 您可以得到准确的答案。

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2020-08-02
    相关资源
    最近更新 更多