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

Posted

技术标签:

【中文标题】如何在 C 中获取目录的大小?【英文标题】:How do I get the size of a directory in C? 【发布时间】:2010-10-03 03:06:03 【问题描述】:

是否有一个 POSIX 函数可以给我一个目录(包括所有子文件夹)的大小,大致相当于“du -s somepath”?

【问题讨论】:

【参考方案1】:
$ man nftw

姓名

ftw, nftw - 文件树遍历

描述

ftw() 遍历目录树 位于目录下 dirpath,并为每个调用一次fn() 树中的条目。默认, 目录在之前处理 它们包含的文件和子目录 (预购遍历)。

符合

POSIX.1-2001、SVr4、SUSv1。

简单示例

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

static unsigned int total = 0;

int sum(const char *fpath, const struct stat *sb, int typeflag) 
    total += sb->st_size;
    return 0;


int main(int argc, char **argv) 
    if (!argv[1] || access(argv[1], R_OK)) 
        return 1;
    
    if (ftw(argv[1], &sum, 1)) 
        perror("ftw");
        return 2;
    
    printf("%s: %u\n", argv[1], total);
    return 0;

【讨论】:

如果你在多线程环境中,不要使用这种方法。有关说明,请参阅 this answer。 最好创建一个单独的函数而不是使用主参数。【参考方案2】:

没有现成的功能,所以你必须自己制作。您可以查看 du 的 GNU 实现的源代码作为示例(请参阅http://www.gnu.org/prep/ftp.html 以获取下载位置列表)。它在coreutils 包中。

关键的 Posix 调用可能是 opendirreaddirclosedirstat

【讨论】:

和 lstat() - 如果你想区分符号链接和链接远端的文件或目录。还有ftw/nftw。【参考方案3】:

结果以字节为单位:

du -sb | grep -oE '^\s*[0-9]+'

【讨论】:

这既不是 C 也不是完整答案。

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

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

如何在 node.js 中获取目录大小而不递归遍历目录?

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

如何在 C 中获取文件的大小? [复制]

如何在目标c中获取mac中所有文件的大小[重复]

如何使用 APFS 在 iOS 10.3 上获取目录的大小?