Указатель на struct stat
int flag
Одно из нескольких значений флагов (описанных ниже), указывающих, какой это вид файла или была ли ошибка для объекта.
struct FTW *s
Эта структура предоставляет две отдельные части информации:
struct FTW {
int base; /* Индекс в файле базовой части имени файла */
int level; /* Глубина этого элемента относительно точки отсчета */
};
Параметр flag
Таблица 8.4
. Значения флагов для функции обратного вызоваnftw()
Флаг | Значение |
---|---|
FTW_F | Объект является обычным файлом |
FTW_D | Объект является каталогом |
FTW_DNR | Объект является каталогом, который нельзя прочесть |
FTW_SL | Объект является символической ссылкой |
FTW_NS | Объект не является символической ссылкой, а stat() потерпела неудачу |
FTW_DP | Объект является каталогом, элементы которого были уже обработаны. Это может случиться, лишь когда в вызове nftw() использовался FTW_DEPTH |
FTW_SLN | Объект является символической ссылкой, указывающей на несуществующий файл. Это может случиться, лишь когда в вызове nftw() не используется FTW_PHYS |
struct FTW* s
s->bas
e действует в качестве индекса в file
; file
является полным путем обрабатываемого объекта (относительно точки отсчета), 'file + s->base
' указывает на первый символ компонента имени файла.s->level
Функция обратного вызова должна вернуть 0, если все нормально. Любое ненулевое возвращенное значение заставляет nftw()
nftw()
был шанс произвести очистку: т.е. освободить динамически выделенную память, закрыть открытые дескрипторы файлов и т.д. Функции обратного вызова не следует использовать longjmp()
, если только программа не завершается немедленно, (longjmp()
является продвинутой функцией, которую мы опишем в разделе 12.5 «Нелокальные goto».) Рекомендуемой методикой обработки ошибок является установка глобальной переменной, указывающей на наличие проблем, возвращение 0 из функции обратного вызова и обработка ошибок после завершения перемещения nftw()
по иерархии файлов. (GNU du
это делает, как мы вскоре увидим.)Давайте свяжем все это воедино в примере программы. ch08-nftw.c
nftw()
. Функция, обрабатывающая каждый файл, выводите отступом имя и тип файла, показывая иерархическое положение каждого файла. Для разнообразия мы сначала покажем результаты, а затем покажем и обсудим программу:$ pwd
/ home/аrnold/work/prenhall/progex
$ code/ch08/ch08-nftw code
code (directory) /* Каталог верхнего уровня */
ch02 (directory) /* Подкаталоги с отступом на один уровень */
ch02-printenv.c (file) /* Файлы в подкаталоге с отступом
на два уровня */
ch03 (directory)
ch03-memaddr.c (file)
ch04 (directory)
ch04-holes.c (file)
ch04-cat.с (file)
ch04-maxfds.c (file)
v7cat.c (file)
...
Вот сама программа:
1 /* ch08-nftw.c --- демонстрирует nftw() */
2
3 #define _XOPEN_SOURCE 1 /* Требуется под GLIBC для nftw() */
4 #define _XOPEN_SOURCE_EXTENDED 1 /* To же */
5
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12