【发布时间】: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。
标签: c++ filesystems filesize disk utility