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