LINUX.ORG.RU

Ответ на: комментарий от anonymous

iterate over file tree and stat() each file.

Ну это очевидный вариант. А какого нибудь системного вызова для этого не существует?
И ещё вопрос - как узнать размер диска (например cdrom) и насколько он заполнен?

sergijoo ()
Ответ на: комментарий от true_admin

Шутка

это не шутка - это оно так и есть на самом деле :) ещё ключик -S :) du как раз и посчитает сколько блоков fs ушло на записи в каталог и содержимое файлов. Всё равно более точный способ - только на низком уровне разбирать конкретную файловую систему.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

это не шутка - это оно так и есть на самом деле :) ещё ключик -S :) du как раз и посчитает сколько блоков fs ушло на записи в каталог и содержимое файлов.

Ну это же занимает много времени.

sergijoo ()
Ответ на: комментарий от MKuznetsov

ну просто это не C-way. Кстати, в гугле, как обычно, есть готовые решения.

true_admin ★★★★★ ()
Ответ на: комментарий от sergijoo

Ну это же занимает много времени.

ты думаешь если напишешь самопальную программу то она будет обходить дерево каталогов быстрее?

true_admin ★★★★★ ()

Не надо учить Си с такими шокирующими вопросами.

anonymous ()

А вообще... банально у Кернигана и Ритчи и в той самой книге должно было быть написано, или «как всегда»? Автор почитал только «для чайников»? Или это такое упоротое стебалово, прикрытое якобы дерзкой бездарностью? ЗЫ рекурсия поможет, если по теме.

anonymous ()
Ответ на: комментарий от true_admin

Ну предположу, что можно и

popen("du -hs ./", "r");
сделать. А дальше можно можно и распарсивать как оно вздумается...

Dennis7 ()
Ответ на: комментарий от true_admin

ты думаешь если напишешь самопальную программу то она будет обходить дерево каталогов быстрее?

Для обхода придумали nftw(). Я думаю, что скорее всего GNU du его и юзает. Так что не быстрее, но и не медленнее будет.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от sergijoo

Посмотри исходники du - будет понятно, как это делается. Но сильно уверен, что там всё делается руками, проходя по всем файлам каталога.

roy ★★★★★ ()
Ответ на: комментарий от dizza

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/du.c ?

Хм-м...
На первый взгляд кажется, что там рекурсивно обходят дерево. Только там не stat, а xfts_open (wrapper вокруг fts_open).

Да, кстати, ТС, там не забывают о возможных круговых ссылках и прочих вероятных проблемах.

proud_anon ★★★★★ ()

Ну теперь всё понятно, что кроме итерации по всем вложенным каталогам другого пути нет. Спасибо всем кто откликнулся.
Теперь я поставлю вопрос именно под мою задачу: как узнать объём записанных данных на cdrom? Неужели рекурсивный обход и stat??? Это же времени хз сколько займёт.

sergijoo ()

readdir + stat на каждый файл с рекурсией по вложенным директориям. Ничего сложного же.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от sergijoo

А по-другому никак. Кроме оптических дисках. Но ты о них в теле темы ничего не сказал.

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.