fts(3) | Library Functions Manual | fts(3) |
fts, fts_open, fts_read, fts_children, fts_set, fts_close - обход файловой иерархии
Standard C library (libc, -lc)
#include <sys/types.h> #include <sys/stat.h> #include <fts.h>
FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **));
FTSENT *fts_read(FTS *ftsp);
FTSENT *fts_children(FTS *ftsp, int instr);
int fts_set(FTS *ftsp, FTSENT *f, int instr);
int fts_close(FTS *ftsp);
Функции fts созданы для обхода файловой иерархии. Обзорное описание: функция fts_open() возвращает «описатель» (с типом FTS *), который указывает на «поток» файловой иерархии. Далее он используется другими функциями fts. Функция fts_read() возвращает указатель на структуру, описывающую один из файлов в файловой иерархии. Функция fts_children() возвращает указатель на связанный список структур, каждая из которых описывает один из файлов, содержащихся в каталоге иерархии.
В общем случае, каталоги обходятся двумя разными путями — в прямом порядке (перед тем, как обработаны их потомки) и в обратном порядке (после того, как обработаны все потомки). Файлы обрабатываются только один раз. Возможен «логический» обход иерархии (обрабатываются файлы, на которые указывают символьные ссылки) и «физический» (обрабатываются сами символьные ссылки), то есть обход иерархии сократится или какая-то часть будет пройдена повторно.
В файле <fts.h> определены две структуры (связанные с ними типы). Первая — структура FTS, представляющая саму иерархию файлов. Вторая — структура FTSENT, представляющая файл в иерархии файлов. Обычно, структура FTSENT возвращается для каждого файла в файловой иерархии. В этой справочной странице понятия «файл» и «структура FTSENT» взаимозаменяемы.
Структура FTSENT содержит поля, описывающие файл. На имеет, по меньшей мере, следующие поля (есть и дополнительные поля, но для реализации они должны считаться скрытыми):
typedef struct _ftsent {
unsigned short fts_info; /* flags for FTSENT structure */
char *fts_accpath; /* access path */
char *fts_path; /* root path */
short fts_pathlen; /* strlen(fts_path) +
strlen(fts_name) */
char *fts_name; /* filename */
short fts_namelen; /* strlen(fts_name) */
short fts_level; /* depth (-1 to N) */
int fts_errno; /* file errno */
long fts_number; /* local numeric value */
void *fts_pointer; /* local address value */
struct _ftsent *fts_parent; /* parent directory */
struct _ftsent *fts_link; /* next file structure */
struct _ftsent *fts_cycle; /* cycle structure */
struct stat *fts_statp; /* [l]stat(2) information */ } FTSENT;
Эти поля определены следующим образом:
Для всех путей всех файлов в иерархии используется единый буфер. Следовательно, поля fts_path и fts_accpath гарантировано завершаются null только для файла, который был возвращён fts_read() последним. Для использования этих полей для обращения к любым файлам, представленным другими структурами FTSENT необходимо, чтобы буфер пути был изменён в соответствии с информацией, содержащейся в поле fts_pathlen структуры FTSENT. Любое изменение должно быть обратно восстановлено перед дальнейшими попытками вызова fts_read(). Поле fts_name всегда завершается null.
Функция fts_open() ожидает указатель на массив символьных указателей, обозначающих один или несколько путей, образующих логическую файловую иерархию, по которой будет проводиться обход. Массив должен заканчиваться указателем null.
Есть несколько флагов, должен быть указан хотя бы один (либо FTS_LOGICAL, либо FTS_PHYSICAL). Флаги, выбираемые с помощью логического объединения, имеют следующие значения:
В параметре compar() указывается определяемая пользователем функция, которая может использоваться для упорядочивания обхода иерархии. В качестве параметров ей требуется два указателя на указатели на структуры FTSENT, и она должна возвращать отрицательное значение, ноль или положительное значение для того, чтобы показать, расположен ли файл, на который указывает первый параметр, перед (относительно текущего упорядочивания), на одном уровне или после файла, на который указывает второй параметр. Поля fts_accpath, fts_path и fts_pathlen структур FTSENT могут быть никогда не использованы при таком сравнении. Если значение поля fts_info равно FTS_NS или FTS_NSOK, то поле fts_statp может не использоваться. Если значение параметра compar() равно NULL, то порядок обхода каталогов определяется параметрами, указанными в path_argv для корневых путей, и в порядке, перечисленном в каталоге, для всего остального.
Функция fts_read() возвращает указатель на структуру FTSENT, описывающую файл в иерархии. Каталоги (корректно считанные и не образующие зацикливаний), посещаются как минимум дважды — первый раз в прямом прохождении и второй раз в обратном. Все остальные файлы посещаются минимум один раз (жёсткие ссылки между каталогами, не образующие зацикливаний, или символьные ссылки на символьные ссылки могут привести к тому, что файлы будут посещаться более одного раза, а каталоги более двух раз).
If all the members of the hierarchy have been returned, fts_read() returns NULL and sets errno to 0. If an error unrelated to a file in the hierarchy occurs, fts_read() returns NULL and sets errno to indicate the error. If an error related to a returned file occurs, a pointer to an FTSENT structure is returned, and errno may or may not have been set (see fts_info).
Структуры FTSENT, возвращаемые fts_read(), могут быть перезаписаны после вызова fts_close() в том же файловом потоке иерархии или после вызова fts_read() в том же файловом потоке иерархии, если они не представляют файл типа «каталог»; в этом случае они не будут перезаписаны до тех пор, пока функция fts_read() не вернёт структуру FTSENT при выполнении обхода в обратном порядке.
Функция fts_children() возвращает указатель на структуру FTSENT, описывающую первый член связанного списка (оканчивающегося NULL) файлов в каталоге, представленного структурой FTSENT, возвращённой fts_read() последней. Список связан через поле fts_link структуры FTSENT, и упорядочен определённой пользователем функцией сравнения, если таковая существует. Повторные вызовы fts_children() будут пересоздавать этот связанный список.
As a special case, if fts_read() has not yet been called for a hierarchy, fts_children() will return a pointer to the files in the logical directory specified to fts_open(), that is, the arguments specified to fts_open(). Otherwise, if the FTSENT structure most recently returned by fts_read() is not a directory being visited in preorder, or the directory does not contain any files, fts_children() returns NULL and sets errno to zero. If an error occurs, fts_children() returns NULL and sets errno to indicate the error.
Структура FTSENT, возвращаемая fts_children(), может быть перезаписана после вызова fts_children(), fts_close() или fts_read() в том же файловом потоке иерархии.
Параметр instr может принимать значение нуля или одного из следующих значений:
Функция fts_set() позволяет пользовательскому приложению определять дальнейшую обработку файла f в потоке ftsp. При успешном выполнении функция fts_set() возвращает 0 и -1 при ошибке.
Значением аргумента instr может быть 0 («ничего не делать») или одно из следующих значений:
Функция fts_close() закрывает поток файловой иерархии, на который указывает ftsp, и делает текущим каталогом тот, который был до вызова fts_open() для открытия ftsp. При успешном выполнении функция fts_close() возвращает 0 и -1 при ошибке.
Функция fts_open() может завершиться с ошибкой и назначить переменной errno значения, перечисленные в open(2) и malloc(3).
Функция fts_close() может завершиться с ошибкой и назначить переменной errno значения, перечисленные в chdir(2) и close(2).
The functions fts_read() and fts_children() may fail and set errno for any of the errors specified for chdir(2), malloc(3), opendir(3), readdir(3), and [l]stat(2).
Кроме того, функции fts_children(), fts_open() и fts_set() могут завершиться с ошибкой и назначить переменной errno следующие значения:
Эти функции доступны в версиях Linux начиная с glibc2.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
fts_open(), fts_set(), fts_close() | Безвредность в нитях | MT-Safe |
fts_read(), fts_children() | Безвредность в нитях | MT-Unsafe |
4.4BSD.
Before glibc 2.23, all of the APIs described in this man page are not safe when compiling a program using the LFS APIs (e.g., when compiling with -D_FILE_OFFSET_BITS=64).
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 декабря 2022 г. | Linux man-pages 6.03 |