如何获取目录C ++的磁盘大小

Posted

技术标签:

【中文标题】如何获取目录C ++的磁盘大小【英文标题】:How to get size on disk of a directory C++ 【发布时间】:2020-08-02 05:11:37 【问题描述】:

如何使用 C++ 代码而不是文件大小获取磁盘大小?

我正在尝试获取目录(文件夹)在磁盘上的大小,并且将文件大小相加仅给出实际文件大小。我需要的是磁盘上的大小,有什么办法得到吗?

谢谢

#include <iostream> 
using namespace std;
#include <filesystem>
using namespace std::filesystem;
int main(size_t argc, char* argv[])

   if (argc == 1) 
        void rscan3(path const&, unsigned i = 0);
        rscan3(".");

    

void rscan3(path const& f, unsigned i) 
    string indent(i, ' ');
    uintmax_t size = 0;
    for (auto d : directory_iterator(f)) 

        size += d.file_size();
        cout << indent << "Folder = " << absolute(f).string() << " SIZE: " << size << endl;
        if (is_directory(d.status())) 
            rscan3(d.path(), i + 2);

    

【问题讨论】:

空目录大小为 0 字节。 (你可以在windows上做实验,我不确定其他系统)......我认为一个目录的整个大小只是它的文件大小的总和。 这取决于系统。在 Linux 上,有一个“真实”目录大小,即目录本身(即文件列表)占用的大小,以及“总”目录大小,它是 on-disk 大小的总和的内容。磁盘文件大小是实际占用的大小,并且通常大于“表观”文件大小,因为空间是以块为单位分配的(但如果使用文件系统级压缩,也可能更小)。 @GhaziMajdoub “空目录大小为 0 字节。” - 这显然错了。即使是一个空目录必须作为其父目录中的一个条目在磁盘上占用一些空间 - 目录的名称会占用空间,并且根据文件系统的不同,它可能会占用比名称更多的空间。零字节不可能是正确的。 @JesperJuhl 我创建了一个空目录并检查了大小(在属性上):它说 0 字节。但是,显然,它肯定必须有一个大小。我同意。 (现在,考虑它占用的几个字节有多大用处?) @GhaziMajdoub 不过,这不仅仅是“几个字节”。文件系统条目占用的空间是块大小的倍数——现在通常是 4k。 【参考方案1】:

由于您在 cmets 中指定了您在询问 Windows:

文件由文件索引或文件表中的条目指示(MFT 表示 NTFS,FAT 表示 FAT 文件系统)。该表位于物理文件系统(例如硬盘)的特殊位置,并保存每个文件的地址和元数据。文件大小是文件实际占用的空间量;这可以是零或任何更大的大小。当一个文件没有数据时,它是空的(size = 0)。

在 Windows 文件系统中,目录的大小是其中所有文件(以及子文件夹中的文件)的总和。因此,空目录的大小为零。

Source: Why does an empty folder have zero bytes on Windows?

STL filesystem::file_size 仅适用于文件,它会引发目录异常:filesystem error: cannot get file size: Is a directory [dir]。为什么?因为目录只是文件索引或表中的一个条目。

在 Windows 上,当您检查包含许多子目录/文件的目录时,您可能会注意到属性上报告的“磁盘大小”逐渐增加;这推断系统正在通过子目录/文件递归迭代以汇总所有文件大小...您可以做一个实验来检查完整大小是否真的等于所有单个文件的总和(不包括目录)。

【讨论】:

以上是关于如何获取目录C ++的磁盘大小的主要内容,如果未能解决你的问题,请参考以下文章

C#/C++ - 如何获取路径太长或权限被拒绝的目录大小?

如何在 C 中获取目录的大小?

Java中如何获得某个磁盘(根目录)?比如C盘

您如何获取磁盘上的文件,而不仅仅是 Java 中的文件大小?

如何从在 C 中存储 shell 脚本输出的指针获取多个字符串?

java如何获取一个对象的大小