Как я могу получить размер каталога в C? - PullRequest
8 голосов
/ 23 января 2009

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

Ответы [ 3 ]

26 голосов
/ 23 января 2009
$ man nftw

NAME

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;
}
2 голосов
/ 23 января 2009

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

Ключевыми вызовами Posix, вероятно, являются opendir, readdir, closedir и stat.

0 голосов
/ 12 июня 2018

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

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