Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

115 sum_ent[i] = sum_subdir[i] = 0;

116 }

117 else /* info->level < prev_level */

118 {

119 /* Восхождение по иерархии.

120 nftw обрабатывает каталог лишь после всех элементов,

121 в которых был обработан каталог. Когда глубина уменьшается,

122 передать суммы от детей (prev_level) родителям.

123 Здесь текущий уровень всегда меньше, чем

124 предыдущий. */

125 assert (<size_t) info->level == prev_level - 1);

126 size_to_print += sum_ent[prev_level];

127 if (!opt_separate_dirs)

128 size_to_print += sum_subdir[prev_level];

129 sum_subdir[info->level] += (sum_ent[prev_level]

130 + sum_subdir[prev_level]);

131 }

132 }

Строки 101–132 сравнивают текущий уровень с предыдущим. Возможны три случая.

Уровни те же самые

В этом случае нет необходимости беспокоиться о статистике дочерних элементов. (Строки 103–106.)

Текущий уровень выше предыдущего

В этом случае мы спустились по иерархии, и статистику нужно восстановить (строки 107–116). Термин «аккумулятор» в комментарии подходящий: каждый элемент аккумулирует общее дисковое пространство, использованное на этом уровне. (На заре вычислительной техники регистры центрального процессора часто назывались «аккумуляторами».)

Текущий уровень ниже предыдущего

В этом случае мы завершили обработку всех дочерних элементов каталога и только что вернулись обратно в родительский каталог (строки 117–131). Код обновляет суммы, включая

size_to_print
.

134 prev_level = info->level; /* Установить статические переменные */

135 first_call = 0;

136

137 /* Включить элемент каталога в общую сумму для содержащего

138 каталога, если не указана --separate-dirs (-S). */

139 if (!(opt_separate_dirs && IS_FTW_DIR_TYPE(file_type)))

140 sum_ent[info->level] += size;

141

142 /* Даже если каталог нельзя прочесть или перейти в него,

143 включить его размер в общую сумму, ... */

144 tot_size += size;

145

146 /* ...но не выводить для него итог, поскольку без размера(-ов)

147 потенциальных элементов, это может сильно запутывать. */

148 if (file_type == FTW_DNR || file_type == FTW_DCH)

149 return 0;

150

151 /* Если мы не считаем элемент, например, потому что это прямая

152 ссылка на файл, который уже посчитан (и --count-links), не

153 выводить для него строку. */

154 if (!print)

155 return 0;

Строки 134–135 устанавливают статические переменные

prev_level
и
first_call
таким образом, что они содержат правильные значения для последующего вызова
process_file
, гарантируя, что весь предыдущий код работает правильно.

Строки 137–144 выверяют статистику на основе опций и типа файла. Комментарии и код достаточно просты. Строки 146–155 сразу завершают функцию, если сведения не должны выводиться.

157 /* FIXME: Это выглядит подозрительно годным для упрощения. */

158 if ((IS_FTW_DIR_TYPE(file_type) &&

159 (info->level <= max_depth || info->level == 0))

160 || <(opt_all && info->level <= max_depth) || info->level == 0))

161 {

162 print_only_size(size_to_print);

163 fputc('\t', stdout);

164 if (arg_length)

165 {

166 /* Вывести имя файла, но без суффикса каталога '.' или '/.'

  • Читать дальше
  • 1
  • ...
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: