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

9

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

3个回答

30
$ 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;
}

1
如果您处于多线程环境中,请勿使用此方法。请参阅此答案以获取解释。 - moodboom
最好创建一个单独的函数,而不是使用主要参数。 - Lei Yang

2
没有现成的函数可用,所以您需要自己编写。您可以查看GNU实现du的源代码作为示例(请参阅http://www.gnu.org/prep/ftp.html以获取下载地址列表)。它在coreutils软件包中。
关键的Posix调用可能是opendirreaddirclosedirstat

2
而lstat() - 如果你想区分符号链接和链接末端的文件或目录。还有ftw/nftw。 - Jonathan Leffler

-2

以字节为单位的结果:

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

这既不是C语言,也不是完整的答案。 - Atahan Acar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接