Search code examples
csizeposixdirectory

How do I get the size of a directory in C?


Is there a POSIX function that will give me the size of a directory (including all sub-folders), roughly equivalent to "du -s somepath"?


Solution

  • $ man nftw
    

    NAME

    ftw, nftw - file tree walk

    DESCRIPTION

    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).

    CONFORMING TO

    POSIX.1-2001, SVr4, SUSv1.

    Simple example

    #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;
    }