Обойти файловое дерево
#include <ftw.h>int nftw( const char *path,int (*fn)( const char *fname,const struct stat *sbuf,int flags,struct FTW *ftw ),int depth,int flags );
1
. Значение depth не должно превышать количество файловых дескрипторов, доступных в данный момент. Функция nftw() работает быстрее, если значение depth не меньше, чем количество уровней дерева.<ftw.h>
. libc
Функция nftw() рекурсивно обходит файловое дерево, корень которого определяется path. Для каждого объекта в иерархии nftw() вызывает определяемую пользователем функцию, передавая в нее:
NULL
, содержащую имя объекта <nftw.h>
: FTW_DEPTH
выше. FTW_PHYS
выше.
Обход дерева продолжается до полного обхода дерева, возврата функцией fn() ненулевого значения или ошибки в nftw() (например, ошибка ввода/вывода). Если обход дерева завершен, nftw() возвращает ноль. Если fn() возвращает ненулевое значение, nftw() останавливает обход дерева и возвращает значение, которое вернула функция fn().
Когда nftw() завершается, она закрывает все открытые файловые дескрипторы; она не закрывает файловые дескрипторы, которые могли быть открыты с помощью fn().
EACCESS
). Код ошибки записан в errno.nftw() — POSIX 1003.1 X/Open Systems Interfaces Extension; nftw64() — Поддержка больших файлов
Из-за того, что функция nftw() рекурсивна, она может завершиться с ошибкой памяти при достаточно глубокой файловой структуре дерева.
Данная функция использует malloc() для выделения динамического хранилища для внутренних операций. Если nftw() принудительно завершается, например в случае, когда в fn() выполняется longjmp(), или в случае прерывания, у nftw() нет возможности очистить хранилище, поэтому оно остается выделенным. Безопасный вариант обработки прерывания - сохранение факта о прерывании и возвращение ненулевого значения при следующем вызове fn().
struct stat, struct FTW, ftw(), longjmp(), malloc(), stat()
Предыдущий раздел: Описание API системной библиотеки