为什么目录上的 std::filesystem::file_size 留给实现?

Why is std::filesystem::file_size on directories left to the implementaiton?

所以我有以下问题:我需要总结特定目录中所有文件的字节大小,这包括子目录的大小,因为在我的情况下它们实际上可以增加大小。

但是,如果我们 运行 将此代码放在包含文件和子目录的目录中,如下所示:

#include <filesystem>
#include <iostream>
#include <cstdint>

int main(void)
{
    std::uintmax_t result = 0; 
    for (const auto& path : std::filesystem::directory_iterator("."))
    {
        result += std::filesystem::file_size(path)
    }

    std::cout << "Total size is: " << result << std::endl; 
    return 0;
}

然后你会得到一个错误,你正在尝试获取目录的文件大小。如果你 运行 它在 macOS 上或 Linux 至少用 Clang++ 10 或 11 编译。 现在根据 Cppreference on std::filesystem::file_size 获取目录的大小取决于实现。 然而,在我看来,这很奇怪,因为 file_size 基本上只是 "wraps" stat,因此应该在目录上完美运行,至少在 Linux、*BSD 和 macOS 上。

那么谁能告诉我为什么这一直留给实现,我可以访问 C++ 标准,但找不到好的理由。

目录的大小在不同平台甚至同一平台上的不同文件系统上可能意味着不同的事情:可能是保存文件列表的磁盘分配大小,或者目录中包含的文件数,或者别的东西。在某些 platforms/filesystems 上,可能没有易于访问的有意义的大小,因此可能会引发错误。

"size of a directory" 没有适用于所有地方的通用定义,因此规范将其保留为实现定义。

确定目录使用多少磁盘 space 的正确方法是递归地查找该目录中的文件并求和它们的大小——但要注意:

  • 同一个文件的多个硬链接;你应该只算一个,否则你会多报使用过的 space.
  • 外观尺寸与实际尺寸;一个稀疏文件可能有 TB 级的表观大小,但实际上只有几 KB 的分配范围。
  • 符号链接;您是仅将它们计算为它们自己的使用量,还是目标的使用量?