Книга: Разработка приложений в среде Linux. Второе издание
14.7.1. Использование ftw()
14.7.1. Использование ftw()
#include <ftw.h>
int ftw(const char *dir, ftwFunctionPointer callback, int depth);
Функция ftw()
начинает с каталога dir
и вызывает указанную в callback
функцию для каждого файла в этом каталоге и его подкаталогах. Функция вызывается для всех типов файлов, включая символические ссылки и каталоги. Реализация ftw()
открывает каждый найденный каталог (с помощью файлового дескриптора) и для увеличения производительности не закрывает их, пока не закончит чтение всех элементов каталога. Это означает, что он использует количество файловых дескрипторов, равное количеству уровней подкаталогов. Чтобы предотвратить недостаток файловых дескрипторов в приложении, параметр depth
ограничивает количество файловых дескрипторов ftw()
, остающихся одновременно открытыми. Если этот предел достигается, производительность снижается, поскольку каталоги необходимо часто открывать и закрывать.
Функция, на которую указывает callback
, определяется следующим образом:
int ftwCallbackFunction(const char * file, const struct stat * sb, int flag);
Эта функция вызывается один раз для каждого файла в дереве каталогов, а первый параметр, file
, представляет собой имя файла, начинающееся с dir
, которое передается ftw()
. Например, если бы аргумент dir
принимал значение .
, одним из файловых имен было бы ./bashrc
. Если бы вместо этого использовалось /etc
, имя файла выглядело бы как /etc/hosts
.
Следующий аргумент обратного вызова, sb, указывает на структуру struct stat
как на результат применения stat()
к файлу[102]. Аргумент flag
предоставляет информацию о файле и принимает одно из следующих значений.
FTW_F |
Файл не является символической ссылкой или каталогом. |
FTW_D |
Файл является каталогом либо символической ссылкой, указывающей на каталог. |
FTW_DNR |
Файл является каталогом, полномочий на чтение которого у приложения нет (то есть его обход невозможен). |
FTW_SL |
Файл является символической ссылкой. |
FTW_NS |
Файл является объектом, к которому не удалось применить stat() . Примером может служить файл в каталоге, права на чтение которого приложение имеет (приложение может получить список файлов этого каталога), но не имеет права на выполнение (что предотвращает успешный вызов stat() применительно к файлам этого каталога). |
Когда файл является символической ссылкой, ftw()
пытается последовать за этой ссылкой и вернуть информацию о файле, на который она указывает (ftw()
проходит один и тот же каталог несколько раз, если на него имеется несколько символических ссылок). Однако для поврежденной ссылки не определено, вернется FTW_SL
или FTW_NS
. Это хорошая причина, чтобы использовать nftw()
.
Если функция обратного вызова возвращает ноль, обход каталога продолжается. Если возвращается ненулевое значение, обход дерева файлов завершается и эта величина возвращается функцией ftw()
. При удачном завершении обхода ftw()
возвращает ноль, а в случае ошибки возвращается -1.
- Листинг 14.2. Использование параметра XMLWriteMode при сохранении объекта ADO.NET DataSet
- Листинг 13.5. код формы, демонстрирующий использование прозрачности '
- ПРИЛОЖЕНИЕ А Использование примеров программ
- Восстановление с использованием инструмента gbak
- Типы страниц и их использование
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- Использование типов содержимого и столбцов
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Использование кнопки Автосумма