Linux программирование в примерах
Шрифт:
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
Переменная
all_files
соответствует опции – А
, которая показывает файлы, имена которых начинаются с точки, но не являются '.
' и '..
'. Переменная really_all_files
соответствует опции – а
, которая предполагает – А
, а также показывает '.
' и '..
'. При наличии таких сведений, условие в строках 228–2284 может быть представлено следующим псевдокодом: if (/* показать все файлы независимо от их имени (-а) */
OR /* первый символ имени не точка */
OR (/* показать файлы с точкой (-А) */
AND /* в имени файла несколько символов */
AND (/* второй символ не точка */
OR /* третий символ не завершает имя */)))
return TRUE;
ЗАМЕЧАНИЕ.
fnmatch
может оказаться дорогостоящей функцией, если она используется в локали с многобайтным набором символов. Обсудим многобайтные наборы символов в разделе 13.4 «Можете произнести это для меня по буквам?» 12.7.2. Раскрытие имени файла:
glob
и globfree
Функции
glob
и globfree
более разработанные, чем fnmatch
: #include <glob.h> /* 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
Число путей, которые подошли.
char **gl_pathv
Массив подходящих путей.
gl_pathv[gl_pathc]
всегда равен NULL
. size_t gl_offs
«Зарезервированные слоты» в
gl_pathv
. Идея заключается в резервировании слотов спереди от gl_pathv
для заполнения их приложением впоследствии, как в случае с именем команды и опциями. Список затем может быть передан непосредственно execv
или execvp
(см. раздел 9.1.4 «Запуск новой программы: семейство exec
»). Зарезервированные слоты устанавливаются в NULL
. Чтобы все это работало, в flags
должен быть установлен GLOB_DOOFFS
. В табл. 12.2 перечислены стандартные флаги для
glob
. Таблица 12.2. Флаги для
glob
Флаг | Значение |
---|---|
GLOB_APPEND | Добавить результаты текущего вызова к предыдущим |
GLOB_DOOFFS | Зарезервировать места gl_offs спереди в gl_pathv |
GLOB_MARK | Добавлять символ / в конец каждого имени, которое обозначает каталог |
GLOB_NOCHECK | Если шаблон не соответствует имени какого-нибудь файла, вернуть его без изменений |
GLOB_NOESCAPE | Рассматривать обратный слеш как обычный символ. Это делает невозможным обозначать метасимволы подстановок |
GLOB_NOSORT | Не сортировать результаты, по умолчанию они сортируются |
GLIBC версия структуры
glob_t
содержит дополнительные члены: typedef struct { /* GLIBC */
/* Компоненты POSIX: */
size_t gl_pathc; /* Число подходящих путей */
char **gl_pathv; /* Список подходящих путей */
size_t gl_offs; /* Резервируемые в gl_pathv слоты */
/* Компоненты GLIBC: */
int gl_flags; /* Копия флагов, дополнительные флаги GLIBC */
void (*gl_closedir)(DIR *); /* Частная версия closedir */
struct dirent *(*gl_readdir)(DIR *); /* Частная версия readdir)) */
DIR *(*gl_opendir)(const char *); /* Частная версия opendir)) */
int (*gl_lstat)(const char *, struct stat *);
/* Частная версия lstat */
int (*gl_stat)(const char *, struct stat *); /* Частная версия stat */
} glob_t;
Члены структуры следующие:
Поделиться:
Популярные книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Истребитель. Ас из будущего
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Честное пионерское! Часть 3
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Обгоняя время
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Страж. Тетралогия
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Девятый
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Отмороженный 8.0
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Совершенный: охота
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Калибр Личности 1
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Личник
3. Ермак
Фантастика:
альтернативная история
6.33