Книга: Разработка приложений в среде Linux. Второе издание
14.7.2. Обход дерева файлов с помощью nft()
14.7.2. Обход дерева файлов с помощью nft()
Новая версия ftw()
— nftw()
— решает неоднозначность символических ссылок, присущих ftw()
, и содержит несколько дополнительных свойств. С целью правильного определения nftw()
заголовочными файлами значение _XOPEN_SOURCE
в приложении должно быть определено 500 или больше. Ниже показан прототип nftw()
.
#define _XOPEN_SOURCE 600
#include <ftw.h>
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()
.
FTW_DP |
Этот элемент является каталогом, об оглавлении которого уже сообщили (это может произойти только в случае установки FTW_DEPTH ). |
FTW_SLN |
Этот элемент является символической ссылкой, указывающей на несуществующий файл (поврежденная ссылка). Это происходит только в том случае, если FTW_PHYS не был установлен; если же он был установлен, передается FTW_SL . |
Эти дополнительные значения flag
надлежащим образом определяют nftw()
для символических ссылок. При использовании FTW_PHYS
все символические ссылки возвращают FTW_SL
. Без nftw()
поврежденные ссылки выдают FTW_NS
, а другие символические ссылки дают тот же результат, что и цель ссылки.
Обратный вызов для nftw()
принимает еще один аргумент, ftwInfо
. Это указатель на struct FTW
, которая определяется следующим образом.
#define _XOPEN_SOURCE 600
#include <ftw.h>
struct FTW {
int base;
int level;
};
Элемент base
— это смещение имени файла в полном пути, передаваемое обратному вызову. Например, если переданный полный путь выглядит как /usr/bin/ls
, base
будет равно 9, a file + ftwInfo->base
даст имя файла ls
. level
— это количество каталогов под текущим каталогом. Если ls
был найден в nftw()
, начинающемся с /usr
, уровень будет равен 1. Если поиск начался с /usr/bin
, уровень будет равен 0.
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Почему необходима миграция
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Создание файлов с блокировкой
- Организация пользователей в группы с помощью ролей
- Уменьшение времени, необходимого для резервного копирования и восстановления
- Рекомендуемое расширение для файлов баз данных - *.ib
- Обход дерева
- Создание многофайловой базы данных
- Правила именования файлов