Есть ли функция POSIX, которая даст мне размер каталога (включая все подпапки), примерно эквивалентный «du -s somepath
»?
Как мне получить размер каталога в C?
Ответы (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
Если вы работаете в многопоточной среде, не используйте этот подход. См. этот ответ для объяснения.
- person moodboom; 18.07.2016
Лучше создать отдельную функцию вместо использования основных аргументов.
- 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
И lstat() - если вы хотите различать символические ссылки и файлы или каталоги на дальнем конце ссылки. Также фтв/нфтв.
- person Jonathan Leffler; 24.01.2009
Результат в байтах:
du -sb | grep -oE '^\s*[0-9]+'
person
Rajdeep Kacha
schedule
12.06.2018
Это не C и не полный ответ.
- person Atahan Acar; 13.01.2021