Найти пути, соответствующие шаблону
#include <glob.h>int glob( const char *pattern,int flags,int (*errfunc)( const char *epath,int error ),glob_t *pglob );
Необходимо создать структуру glob_t
перед вызовом glob(). Функция glob() выделяет необходимые ресурсы для массива gl_pathv. Используйте globfree() для освобождения этих ресурсов.
libc
Функция glob() находит пути, соответствующие заданному шаблону.
Чтобы иметь доступ к пути, glob() должен иметь разрешение на поиск для каждого компонента пути, кроме последнего, и разрешение на чтение для каждого каталога каждого компонента имени файла шаблона, который содержит любой из специальных символов (*, ?, [ и ]).
Аргумент errfunc - это указатель на функцию-обработчик ошибок с прототипом:
int errfunc( const char *epath, int error );
Функция errfunc вызывается, когда glob() встречает каталог, который он не может открыть или прочитать. Аргументы функции:
Функция errfunc должна возвращать 0
, если функция glob() должна продолжаться, или ненулевое значение, если функция glob() должна прекратить поиск.
Вы можете установить для errfunc значение NULL
, чтобы игнорировать эти типы ошибок.
Аргумент flags может иметь любую комбинацию следующих битов:
NULL
указателей нужно добавить в начало pglob->pathv. После вызова glob() pglob->pathv будет содержать NULL
указатели pglob->gl_offs, за которыми следуют пути pglob->gl_pathc, за которыми следует NULL
указатель. Это может быть полезно, если вы создаете команду, которая будет применяться к совпадающим файлам. Следующие флаги являются расширениями BSD:
GLOB_NOCHECK
без магических символов (csh). ARG_MAX
. 0
в случае успешного завершения, или код ошибки.
GLOB_ERR
или функция errfunc вернула ненулевое значение. GLOB_NOCHECK
не был установлен в flags. Простой пример для поиска всех файлов с расширением .c в текущей директории и вывода их в том порядке, в котором их нашла файловая система.
#include <unistd.h>#include <stdio.h>#include <glob.h>int main( void ){glob_t paths;int retval;paths.gl_pathc = 0;paths.gl_pathv = NULL;paths.gl_offs = 0;retval = glob( "*.c", GLOB_NOCHECK | GLOB_NOSORT, NULL, &paths );if( retval == 0 ){int idx;for ( idx = 0; idx < paths.gl_pathc; idx++ ){printf( "[%d]: %s\n", idx, paths.gl_pathv[idx] );}globfree( &paths );} else {puts( "glob() failed" );}return (0);}
POSIX 1003.1
Не изменйяте значения в pglob между вызовами glob() и globfree().
glob_t, globfree(), wordexp(), wordfree()
Предыдущий раздел: Описание API системной библиотеки