Шрифт:
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 */