Как получить размер каталога в C?

есть ли функция POSIX, которая даст мне размер каталога (включая все подпапки), примерно эквивалентный"du -s somepath"?

3 ответов


$ man nftw

имя

ftw, nftw - file tree walk

описание

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

нет готовой функции, поэтому вам придется сделать свой собственный. Вы можете посмотреть исходный код имплементации GNU du в качестве примера (см.http://www.gnu.org/prep/ftp.html для списка мест для загрузки). Это в .

решающие вызовы Posix, вероятно,opendir, readdir, closedir и stat.


результат в байтах:

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