Feb 012010

Even there’s an easier way calculating directory size ftw syscall/API

ftw, nftw - file tree walk

ftw() walks through the directory tree that is located under the directory dirpath, and calls fn() once for each entry in the tree.
By default, directories are handled before the files and subdirectories they contain (pre-order traversal).

POSIX.1-2001, SVr4, SUSv1.

example code size.c

#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)) {
        return 2;
    printf("%s: %u\n", argv[1], total);
    return 0;

Compile using gcc

# gcc -o size size.c


# ./size /root/
/root/: 614730153

Using du command

# du -sb /root/
614727712       /root/

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>