Mir-knigi.online
Книги онлайн читать бесплатно!
  • Главная
  • Жанры
  • ТОП книг
  • ТОП авторов
  • Контакты

Linux программирование в примерах

Часть 179 из 253 Информация о книге

struct dirent dp;

DIR *dir;

char pattern[100];

/* ...заполнить шаблон, открыть каталог, проверить ошибки... */

while ((dp = readdir(dir)) != NULL) {

 if (fnmatch(pattern, dir->d_name, FNM_PERIOD) == 0)

  /* имя файла соответствует шаблону */

 else

  continue; /* не соответствует */

}

GNU

ls
использует
fnmatch()
для реализации своей опции
--ignore
. Вы можете предоставить несколько игнорируемых шаблонов (с помощью нескольких опций).
ls
сопоставляет каждое имя файла со всеми шаблонами. Она делает это с помощью функции
file_interesting()
в
ls.с
:

2269 /* Возвращает не ноль, если файл в 'next' должен быть перечислен. */

2270

2271 static int

2272 file_interesting(const struct dirent *next)

2273 {

2274  register struct ignore_pattern* ignore;

2275

2276  for (ignore = ignore_patterns; ignore; ignore = ignore->next)

2277   if (fnmatch(ignore->pattern, next->d_name, FNM_PERIOD) == 0)

2278    return 0;

2279

2280  if (really_all_files

2281   || next->d_name[0] !=

2282   || (all_files

2283   && next->d_name[1] != '\0 '

2284   && (next->d_name[1] || next->d_name[2] != '\0')))

2285   return 1;

2286

2287  return 0;

2288 }

Цикл в строках 2276–2278 сопоставляет имя файла со списком шаблонов для игнорируемых файлов. Если один из шаблонов подходит, файл не интересен и

file_interesting()
возвращает false (то есть 0).

Переменная

all_files
соответствует опции
-А
, которая показывает файлы, имена которых начинаются с точки, но не являются '
.
' и '
..
'. Переменная
really_all_files
соответствует опции
-а
, которая предполагает
-А
, а также показывает '
.
' и '
..
'. При наличии таких сведений, условие в строках 228–2284 может быть представлено следующим псевдокодом:

if (/* <i>показать все файлы независимо от их имени (-а)</i> */

 OR /* <i>первый символ имени не точка</i> */

 OR (/* <i>показать файлы с точкой (-А)</i> */

  AND /* <i>в имени файла несколько символов</i> */

  AND (/* <i>второй символ не точка</i> */

   OR /* <i>третий символ не завершает имя</i> */)))

 return TRUE;

ЗАМЕЧАНИЕ.

fnmatch()
может оказаться дорогостоящей функцией, если она используется в локали с многобайтным набором символов. Обсудим многобайтные наборы символов в разделе 13.4 «Можете произнести это для меня по буквам?»

12.7.2. Раскрытие имени файла:

glob()
и
globfree()

Функции

glob()
и
globfree()
более разработанные, чем
fnmatch()
:

#include &lt;glob.h&gt; /* POSIX */

int glob(const char *pattern, int flags,

int (*errfunc)(const char *epath, int eerrno), glob_t *pglob);

void globfree(glob_t *pglob);

Функция

glob()
осуществляет просмотр каталога и сопоставление с шаблонами, возвращая список всех путей, соответствующих
pattern
. Символы подстановки могут быть включены в нескольких местах пути, а не только в качестве последнего компонента (например, '
/usr/*/*.so
'). Аргументы следующие:

const char *pattern

Шаблон для раскрывания.

int flags

Флаги, управляющие поведением

glob()
, вскоре будут описаны.

int (*errfunc)(const char *epath, int eerrno)

Указатель на функцию для использования при сообщениях об ошибках. Это значение может равняться

NULL
. Если нет и если
(*errfunc)()
возвращает ненулевое значение или в
flags
установлен
GLOB_ERR
,
glob()
прекращает обработку. Аргументами
(*errfunc)()
являются путь, вызвавший проблему, и значение errno, установленное функциями
opendir()
,
readdir()
или
stat()
.

glob_t *pglob

Указатель на структуру

glob_t
, использующуюся для хранения результатов. Структура
glob_t
содержит список путей, которые выдает
glob()
:

typedef struct {  /* POSIX */

 size_t gl_pathc; /* Число найденных подходящих путей */

 char **gl_pathv; /* Список подходящих путей */

 size_t gl_offs;  /* Слоты для резервирования в gl_pathv */

} glob_t;

size_t gl_pathc

Число путей, которые подошли.


Перейти к странице:
Предыдущая страница
Следующая страница
Жанры
  • Военное дело
  • Деловая литература
  • Детективы и триллеры
  • Детские
  • Детские книги
  • Документальная литература
  • Дом и дача
  • Дом и Семья
  • Жанр не определен
  • Зарубежная литература
  • Знания и навыки
  • История
  • Компьютеры и Интернет
  • Легкое чтение
  • Любовные романы
  • Научно-образовательная
  • Образование
  • Поэзия и драматургия
  • Приключения
  • Проза
  • Прочее
  • Психология и мотивация
  • Публицистика и периодические издания
  • Религия и духовность
  • Родителям
  • Серьезное чтение
  • Спорт, здоровье и красота
  • Справочная литература
  • Старинная литература
  • Техника
  • Фантастика и фентези
  • Фольклор
  • Хобби и досуг
  • Юмор
Mir-knigi.online

Бесплатная онлайн библиотека для чтения книг без регистрации с телефона или компьютера. У нас собраны последние новинки, мировые бестселлеры книжного мира.

Контакты
  • [email protected]
Информация
  • Карта сайта
© mir-knigi.online, 2026. | Вход