Со временем стало ясно, что интерфейс ftw()
nftw()
(«new (новая) ftw()
» [важно]). Вот прототип:#include
int nftw(const char *dir, /* Отправная точка */
int (*fn)(const char *file, /* Указатель функции на */
const struct stat *sb, /* функцию из четырех аргументов */
int flag, struct FTW *s),
int depth, int flags); /* Максимум открытых fds, флаги */
А вот аргументы:
const char *dir
Строка с именем отправной точки иерархии для обработки.
int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s)
Указатель на функцию с данными аргументами. Эта функция вызывается для каждого объекта в иерархии. Подробности ниже.
int depth
Этот аргумент назван неверно. Чтобы избежать выхода за пределы дескрипторов файлов, nftw()
depth
одновременно открытых каталогов. Это nftw()
иерархий, которые глубже уровня depth
, но меньшие значения depth
означают, что nftw()
придется делать больше работы.flags
Набор флагов, объединяемых побитовым ИЛИ, которые указывают, как nftw()
Интерфейс nftw()
nftw()
(аргумент flags
функции nftw()
). Другой набор передается предоставленной пользователем функции, которую вызывает nftw()
(аргумент flags
для (*fn)()
). Однако, интерфейс запутывает, поскольку имена обоих наборов флагов начинаются с префикса 'FTW_
'. Мы постараемся сделать все, чтобы это прояснить по ходу дела. В табл. 8.3 представлены флаги, которые контролируют nftw()
.Таблица 8.3
. Управляющие флаги дляnftw()
Флаг | Значение |
---|---|
FTW_CHDIR | При установке перед открытием каждого из каталогов сначала осуществляется переход в него. Это действие более эффективно, но вызывающее приложение должно быть готово оказаться в другом каталоге, когда nftw() завершится |
FTW_DEPTH | При установке осуществляется «сначала глубокий поиск». Это означает, что все файлы и подкаталоги обрабатываются до того, как будет обработан сам каталог |
FTW_MOUNT | При установке остается в той же самой смонтированной файловой системе. Это более специализированная опция |
FTW_PHYS | При установке не следует по символическим ссылкам |
FTW_CHDIR
stat()
или открытии каталога. Экономия времени для больших иерархий может быть вполне ощутимой.[85]FTW_DEPTH
chmod -R u-rx .
'. Эта команда удаляет права чтения и исполнения для владельца для всех файлов и подкаталогов в текущем каталоге. Если это изменение прав доступа применено к каталогу до того, как оно применено к содержимому каталога, любые последующие попытки обработки содержимого потерпят неудачу! Поэтому команда должна применяться к каталогу после обработки его содержимого.[86] Справочная страница GNU/Linux FTW_PHYS
, что «это то, что вам нужно». Это позволяет вам обрабатывать сами символические ссылки, что обычно бывает нужно (Рассмотрите du
, она должна подсчитывать занимаемое ссылками пространство отдельно от связанных с ними файлов.)8.4.3.2. Функция обратного вызова nftw()
После запуска nftw()
const char *file
Имя текущего обрабатываемого файла (каталога, символической ссылки и т.д.).
const struct stat *sb