如何在 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 调用可能是 opendir
、readdir
、closedir
和 stat
。
【讨论】:
和 lstat() - 如果你想区分符号链接和链接远端的文件或目录。还有ftw/nftw。【参考方案3】:结果以字节为单位:
du -sb | grep -oE '^\s*[0-9]+'
【讨论】:
这既不是 C 也不是完整答案。以上是关于如何在 C 中获取目录的大小?的主要内容,如果未能解决你的问题,请参考以下文章