Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

#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.

14.7.3. Реализация

find

Команда

find
выполняет в одном или нескольких деревьях каталогов поиск файлов, соответствующих определенным характеристикам. Ниже приведена простая реализация
find
, реализованная на основе
nftw
. Она использует
fnmatch
(см. главу 23) для реализации переключателя
– name
и иллюстрирует многие флаги, воспринимаемые
nftw
.

 1: /* find.с */

 2:

 3: #define _XOPEN_SOURCE 600

 4:

 5: #include <fnmatch.h>

 6: #include <ftw.h>

 7: #include <limits.h>

 8: #include <stdio.h>

 9: #include <stdlib.h>

10: #include <string.h>

11:

12: const char * name = NULL;

13: int minDepth = 0, maxDepth = INT_MAX;

14:

15: int find (const char * file, const struct stat * sb, int flags,

16: struct FTW * f) {

17: if (f->level < minDepth) return 0;

18: if (f->level > maxDepth) return 0;

19: if (name && fnmatch(name, file + f->base, FNM_PERIOD)) return 0;

20:

21: if (flags == FTW_DNR) {

22: fprintf(stderr, "find: %s: недопустимые полномочия\n", file);

23: } else {

24: printf("%s\n", file);

25: }

26:

27: return 0;

28: }

29:

30: int main(int argc, const char ** argv) {

31: int flags = FTW_PHYS;

32: int i;

33: int problem = 0;

34: int tmp;

35: int rc;

36: char * chptr;

  • Читать дальше
  • 1
  • ...
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: