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_info
- Одно из
следующих
значений
описывает
возвращённую
структуру
FTSENT и файл,
который
она
представляет.
За
исключением
каталогов
без ошибок
( FTS_D), все эти
элементы
являются
конечными,
то есть они
не будут
повторно
обходиться,
а их
потомки не
будут
обходиться
вообще.
- FTS_D
- Каталог,
посещаемый
в прямом
порядке.
- FTS_DC
- Каталог,
вызвавший
зацикливание
в дереве
(также
будет
заполнено
поле fts_cycle
структуры
FTSENT).
- FTS_DEFAULT
- Любая
структура
FTSENT,
представляющая
тип файла,
неявно
описываемый
одним из
других
значений
fts_info.
- FTS_DNR
- Каталог,
который не
может быть
прочитан.
Это
значение
возвращается
при ошибке,
и поле fts_errno
будет
заполнено
тем, что
вызвало
ошибку.
- FTS_DOT
- Файл с
именем «.»
или «..»,
который не
был указан
в качестве
имени
файла в fts_open()
(смотрите
FTS_SEEDOT).
- FTS_DP
- Каталог,
посещаемый
в обратном
порядке.
Содержимое
структуры
FTSENT будет
неизменно,
как если бы
он
посещался
в прямом
порядке, то
есть
значение
поля fts_info
равно FTS_D.
- FTS_ERR
- Это
значение
возвращается
при ошибке,
и поле fts_errno
будет
заполнено
тем, что
вызвало
ошибку.
- FTS_F
- Обычный
файл.
- FTS_NS
- A file for which no [l]stat(2) information
was available. The contents of the fts_statp field are undefined.
This is an error return, and the fts_errno field will be set to
indicate what caused the error.
- FTS_NSOK
- A file for which no [l]stat(2) information
was requested. The contents of the fts_statp field are
undefined.
- FTS_SL
- Символьная
ссылка.
- FTS_SLNONE
- Символьная
ссылка,
указывающая
на
несуществующий
объект. В
поле fts_statp
содержится
ссылка на
информацию
о
свойствах
самой
символьной
ссылки.
- fts_accpath
- Путь к
файлу
относительно
текущего
каталога.
- fts_path
- Путь к
файлу
относительно
начального
каталога
обхода.
Этот путь
содержит в
себе путь
(как
префикс),
указанный
в fts_open().
- fts_pathlen
- Сумма
длин строк,
на которые
ссылается
fts_path и fts_name.
- fts_name
- Имя
файла.
- fts_namelen
- Длина
строки, на
которую
ссылается
fts_name.
- fts_level
- Глубина
погружения
в дерево
иерархии,
от -1 до N, на
которой
был
обнаружен
файл.
Структура
FTSENT,
представляющая
родительский
каталог
обхода (или
начальный
каталог),
обозначена
как -1, а
структура
FTSENT для
самой
начальной
точки
поиска
обозначена
как 0.
- fts_errno
- Если при
возврате
структуры
FTSENT
функцией
fts_children() или fts_read()
её поле fts_info
равно FTS_DNR, FTS_ERR
или FTS_NS, то в
поле fts_errno
содержится
номер
ошибки (то
есть
значение
errno),
обозначающее
причину
ошибки. В
других
случаях,
содержимое
поля fts_errno не
определено.
- fts_number
- Это поле
создано
для
использования
пользовательским
приложением
и не
изменяется
функциями
fts. При
инициализации
оно
устанавливается
в 0.
- fts_pointer
- Это поле
создано
для
использования
пользовательским
приложением
и не
изменяется
функциями
fts. При
инициализации
оно
устанавливается
в NULL.
- fts_parent
- Указатель
на
структуру
FTSENT, которая
ссылается
на файл в
иерархии
непосредственно
над
текущим
файлом, то
есть на
каталог,
членом
которого
является
текущий
файл.
Родительский
каталог
начальной
точки
поиска
также
может быть
доступен,
однако
инициализируются
только
поля fts_level, fts_number
и fts_pointer.
- fts_link
- При
возврате
функции
fts_children() поле fts_link
указывает
на
следующую
структуру
в
связанном
списке
(заканчивающемся
NULL)
содержимого
каталога. В
другим
случаях
содержимое
поля fts_link не
определено.
- fts_cycle
- Если
каталог
вызывает
зацикливание
иерархии
(смотрите
FTS_DC), либо
из-за
жёсткой
ссылки
между
двумя
каталогами,
либо из-за
символьной
ссылки,
указывающей
на каталог,
то поле fts_cycle
будет
указывать
на
структуру
FTSENT в
иерархии,
которая
ссылается
на тот же
файл, что и
текущая
структура
FTSENT. В других
случаях
содержимое
поля fts_cycle не
определено.
- fts_statp
- A pointer to [l]stat(2) information for the
file.
Для всех
путей всех
файлов в
иерархии
используется
единый
буфер.
Следовательно,
поля
fts_path и
fts_accpath
гарантировано
завершаются
null
только
для файла,
который
был
возвращён
fts_read()
последним.
Для
использования
этих полей
для
обращения
к любым
файлам,
представленным
другими
структурами
FTSENT
необходимо,
чтобы
буфер пути
был
изменён в
соответствии
с
информацией,
содержащейся
в поле
fts_pathlen
структуры
FTSENT. Любое
изменение
должно
быть
обратно
восстановлено
перед
дальнейшими
попытками
вызова
fts_read().
Поле
fts_name
всегда
завершается
null.
Функция
fts_open()
ожидает
указатель
на массив
символьных
указателей,
обозначающих
один или
несколько
путей,
образующих
логическую
файловую
иерархию,
по которой
будет
проводиться
обход.
Массив
должен
заканчиваться
указателем
null.
Есть
несколько
флагов,
должен
быть
указан
хотя бы
один (либо
FTS_LOGICAL, либо
FTS_PHYSICAL).
Флаги,
выбираемые
с помощью
логического
объединения,
имеют
следующие
значения:
- FTS_LOGICAL
- This option causes the fts routines to return FTSENT
structures for the targets of symbolic links instead of the symbolic links
themselves. If this option is set, the only symbolic links for which
FTSENT structures are returned to the application are those
referencing nonexistent files: the fts_statp field is obtained via
stat(2) with a fallback to lstat(2).
- FTS_PHYSICAL
- This option causes the fts routines to return FTSENT
structures for symbolic links themselves instead of the target files they
point to. If this option is set, FTSENT structures for all symbolic
links in the hierarchy are returned to the application: the
fts_statp field is obtained via lstat(2).
- FTS_COMFOLLOW
- This option causes any symbolic link specified as a root
path to be followed immediately, as if via FTS_LOGICAL, regardless
of the primary mode.
- FTS_NOCHDIR
- As a performance optimization, the fts functions change
directories as they walk the file hierarchy. This has the side-effect that
an application cannot rely on being in any particular directory during the
traversal. This option turns off this optimization, and the fts functions
will not change the current directory. Note that applications should not
themselves change their current directory and try to access files unless
FTS_NOCHDIR is specified and absolute pathnames were provided as
arguments to fts_open().
- FTS_NOSTAT
- By default, returned FTSENT structures reference
file characteristic information (the fts_statp field) for each file
visited. This option relaxes that requirement as a performance
optimization, allowing the fts functions to set the fts_info field
to FTS_NSOK and leave the contents of the fts_statp field
undefined.
- FTS_SEEDOT
- По
умолчанию,
все файлы с
именами «.»
или «..»,
обнаруженные
в файловой
иерархии,
игнорируются,
если они не
указаны
как
параметры
пути в fts_open().
Данный
флаг
принуждает
функции fts
для таких
файлов
возвращать
структуры
FTSENT.
- FTS_XDEV
- Этот
флаг
предотвращает
функции fts
от
вхождения
в каталоги,
которые
имеют
номер
устройства,
отличный
от файла, с
которого
начался
обход.
В
параметре
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_NAMEONLY
- Необходимы
только
имена
файлов.
Содержимое
всех полей
в
возвращаемом
связанном
списке
структур
не
определено,
за
исключением
полей fts_name и
fts_namelen.
Функция
fts_set()
позволяет
пользовательскому
приложению
определять
дальнейшую
обработку
файла
f в
потоке
ftsp.
При
успешном
выполнении
функция
fts_set()
возвращает
0 и -1 при
ошибке.
Значением
аргумента
instr может
быть 0
(«ничего не
делать»)
или одно из
следующих
значений:
- FTS_AGAIN
- Повторно
посетить
файл; файл
любого
типа может
быть
повторно
посещён.
Последующий
вызов fts_read()
возвратит
файл, к
которому
идёт
обращение.
Поля fts_stat и fts_info
структуры
будут
переинициализированы
в этот
момент, но
никакие
поля
больше не
будут
изменены.
Этот
параметр
значим
только для
последнего
возвращённого
файла из
fts_read(). Обычно
его
используют
при
посещении
каталогов
в обратном
порядке; в
этом
случае
каталог
посещается
повторно (в
прямом и
обратном
порядке), а
также все
его
потомки.
- FTS_FOLLOW
- Рассматриваемый
файл
должен
быть
символьной
ссылкой.
Если
рассматриваемый
файл —
последний
возвращённый
fts_read(), то
следующий
вызов fts_read()
возвратит
файл с
изменёнными
полями fts_info и
fts_statp, в
которых
будут
отражать
повторно
инициализированные
данные
цели
символьной
ссылки, а
не самой
символьной
ссылки.
Если
рассматриваемый
файл —
последний
возвращённый
fts_children(), то поля
fts_info и fts_statp
структуры
при
возврате
из fts_read()
будут
отражать
данные
цели
символьной
ссылки, а
не самой
символьной
ссылки. В
любом
случае,
если цель
символьной
ссылки не
существует,
то поля
возвращаемой
структуры
не будут
меняться, а
поле fts_info
будет
равно FTS_SLNONE.
- Если
цель
ссылки —
каталог, то
выполняется
возврат
при прямом
прохождении,
после него
возврат
всех его
потомков,
после чего
выполняется
возврат в
обратном
порядке.
- FTS_SKIP
- Не
посещать
потомков
данного
файла. Файл
может быть
одним из
последних
возвращённых
либо fts_children(),
либо fts_read().
Функция
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
следующие
значения:
- EINVAL
- Некорректное
значение
options или instr.
Эти
функции
доступны в
версиях 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).
find(1),
chdir(2),
lstat(2),
stat(2),
ftw(3),
qsort(3)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]