FTW_F | Файл не является символической ссылкой или каталогом. |
FTW_D | Файл является каталогом либо символической ссылкой, указывающей на каталог. |
FTW_DNR | Файл является каталогом, полномочий на чтение которого у приложения нет (то есть его обход невозможен). |
FTW_SL | Файл является символической ссылкой. |
FTW_NS | Файл является объектом, к которому не удалось применить stat() . Примером может служить файл в каталоге, права на чтение которого приложение имеет (приложение может получить список файлов этого каталога), но не имеет права на выполнение (что предотвращает успешный вызов stat() применительно к файлам этого каталога). |
Когда файл является символической ссылкой, ftw()
пытается последовать за этой ссылкой и вернуть информацию о файле, на который она указывает (ftw()
проходит один и тот же каталог несколько раз, если на него имеется несколько символических ссылок). Однако для поврежденной ссылки не определено, вернется FTW_SL
или FTW_NS
. Это хорошая причина, чтобы использовать nftw()
.
Если функция обратного вызова возвращает ноль, обход каталога продолжается. Если возвращается ненулевое значение, обход дерева файлов завершается и эта величина возвращается функцией ftw()
. При удачном завершении обхода ftw()
возвращает ноль, а в случае ошибки возвращается -1.
14.7.2. Обход дерева файлов с помощью nft()
Новая версия ftw()
— nftw()
— решает неоднозначность символических ссылок, присущих ftw()
, и содержит несколько дополнительных свойств. С целью правильного определения nftw()
заголовочными файлами значение _XOPEN_SOURCE
в приложении должно быть определено 500 или больше. Ниже показан прототип nftw()
.
#define _XOPEN_SOURCE 600
#include
int nftw(const char * dir, ftwFunctionPointer callback, int depth, int flags);
int nftwCallbackFunction(const char *file, const struct stat * sb,
int flag, struct FTW * ftwInfo);
Сравнивая nftw()
с ftw()
, легко заметить новый параметр — flags
. Это может быть один или несколько следующих флагов, объединенных с помощью логического "ИЛИ".
FTW_CHDIR | Функция nftw() обычно не меняет текущий каталог программы. Если определен флаг FTW_CHDIR функция nftw() меняет текущий каталог на любой другой каталог, читаемый в данный момент. Иначе говоря, при активизации обратного вызова имя файла, передаваемое ему, всегда относится к текущему каталогу. |
FTW_DEPTH | По умолчанию nftw() выводит имя каталога перед списком имен файлов в этом каталоге. Этот флаг вызывает изменение порядка на обратный, то есть содержимое каталога выводится перед его именем. (nftw() выполнять поиск в глубину. Подобного флага для поиска в ширину не существует.) |
FTW_MOUNT | Это флаг запрещает nftw() переходить границу файловой системы во время обхода. Более подробно файловые системы описаны в [32]. |
FTW_PHYS | Вместо следования символическим ссылкам nftw() сообщает о ссылках, но не следует по ним. Побочный эффект заключается в том, что обратный вызов получает результат вызова lstat() , а не stat() . |
Аргумент обратного вызова flag
может принимать два новых значения для nftw()
вдобавок к значениям, уже упомянутым для ftw()
.