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

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


person John Carter    schedule 23.01.2009    source источник


Ответы (3)


$ 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;
}
person Alex B    schedule 23.01.2009
comment
Если вы работаете в многопоточной среде, не используйте этот подход. См. этот ответ для объяснения. - person moodboom; 18.07.2016
comment
Лучше создать отдельную функцию вместо использования основных аргументов. - person Lei Yang; 09.01.2017

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

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

person Community    schedule 23.01.2009
comment
И lstat() - если вы хотите различать символические ссылки и файлы или каталоги на дальнем конце ссылки. Также фтв/нфтв. - person Jonathan Leffler; 24.01.2009

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

du -sb | grep -oE '^\s*[0-9]+'
person Rajdeep Kacha    schedule 12.06.2018
comment
Это не C и не полный ответ. - person Atahan Acar; 13.01.2021