14.7.2. Обход дерева файлов с помощью nft()

14.7.2. Обход дерева файлов с помощью nft()

Новая версия ftw()nftw() — решает неоднозначность символических ссылок, присущих ftw(), и содержит несколько дополнительных свойств. С целью правильного определения nftw() заголовочными файлами значение _XOPEN_SOURCE в приложении должно быть определено 500 или больше. Ниже показан прототип nftw().

#define _XOPEN_SOURCE 600

#include <ftw.h>

int nftw(const char * dir, ftwFunctionPointer callback, int depth, int flags);

int nftwCallbackFunction(const char *file, const struct stat * sb,

 int flag, struct FTW * ftwInfo);

Сравнивая nftw() с ftw(), легко заметить новый параметр — flags. Это может быть один или несколько следующих флагов, объединенных с помощью логического "ИЛИ".

FTW_CHDIR Функция nftw() обычно не меняет текущий каталог программы. Если определен флаг FTW_CHDIR функция nftw() меняет текущий каталог на любой другой каталог, читаемый в данный момент. Иначе говоря, при активизации обратного вызова имя файла, передаваемое ему, всегда относится к текущему каталогу.
FTW_DEPTH По умолчанию nftw() выводит имя каталога перед списком имен файлов в этом каталоге. Этот флаг вызывает изменение порядка на обратный, то есть содержимое каталога выводится перед его именем. (Примечание. Этот флаг заставляет nftw() выполнять поиск в глубину. Подобного флага для поиска в ширину не существует.)
FTW_MOUNT Это флаг запрещает nftw() переходить границу файловой системы во время обхода. Более подробно файловые системы описаны в [32].
FTW_PHYS Вместо следования символическим ссылкам nftw() сообщает о ссылках, но не следует по ним. Побочный эффект заключается в том, что обратный вызов получает результат вызова lstat(), а не stat().

Аргумент обратного вызова flag может принимать два новых значения для nftw() вдобавок к значениям, уже упомянутым для ftw().

FTW_DP Этот элемент является каталогом, об оглавлении которого уже сообщили (это может произойти только в случае установки FTW_DEPTH).
FTW_SLN Этот элемент является символической ссылкой, указывающей на несуществующий файл (поврежденная ссылка). Это происходит только в том случае, если FTW_PHYS не был установлен; если же он был установлен, передается FTW_SL.

Эти дополнительные значения flag надлежащим образом определяют nftw() для символических ссылок. При использовании FTW_PHYS все символические ссылки возвращают FTW_SL. Без nftw() поврежденные ссылки выдают FTW_NS, а другие символические ссылки дают тот же результат, что и цель ссылки.

Обратный вызов для nftw() принимает еще один аргумент, ftwInfо. Это указатель на struct FTW, которая определяется следующим образом.

#define _XOPEN_SOURCE 600

#include <ftw.h>

struct FTW {

 int base;

 int level;

};

Элемент base — это смещение имени файла в полном пути, передаваемое обратному вызову. Например, если переданный полный путь выглядит как /usr/bin/ls, base будет равно 9, a file + ftwInfo->base даст имя файла ls. level — это количество каталогов под текущим каталогом. Если ls был найден в nftw(), начинающемся с /usr, уровень будет равен 1. Если поиск начался с /usr/bin, уровень будет равен 0.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Загрузка файлов с помощью браузера

Из книги Работа в Интернете автора Макарский Дмитрий

Загрузка файлов с помощью браузера Кроме тех основных и дополнительных возможностей, о которых говорилось в предыдущей главе, браузеры способны делать и еще некоторые полезные вещи, в частности загружать из Интернета файлы. Однако загрузка файлов из ети с помощью


Перечисление файлов с помощью DirectoryInfo

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Перечисление файлов с помощью DirectoryInfo Вдобавок к получению базовой информации о существующем каталоге, вы можете добавить в пример несколько вызовов методов типа DirectoryInfo. Сначала используем метод GetFiles(), чтобы получить информацию обо всех файлах *.bmp, размещенных каталоге


Передача файлов с помощью различных служб

Из книги Популярный самоучитель работы в Интернете автора Кондратьев Геннадий Геннадьевич

Передача файлов с помощью различных служб Передача файлов может осуществляться с помощью разных интернет-служб.– Во-первых, пересылать файлы по Интернету можно с помощью программ электронной почты в качестве приложений к письмам. Этот вопрос мы рассмотрим в третьей


9.3.2. Сортировка с помощью двоичного дерева

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

9.3.2. Сортировка с помощью двоичного дерева Двоичное дерево позволяет эффективно реализовать сортировку произвольных данных. (Правда, если данные уже отсортированы, оно вырождается в обычный связанный список.) Причина ясна: при каждом сравнении мы исключаем половину


Разделение файлов с помощью NFS

Из книги Сетевые средства Linux автора Смит Родерик В.

Разделение файлов с помощью NFS Для того чтобы обеспечить совместное использование файлов, надо сообщить серверу NFS о том, какие каталоги должны экспортироваться и какие клиенты имеют право доступа к конкретным каталогам. Кроме того, необходимо указать опции, управляющие


Закачка файлов с помощью программы μTorrent

Из книги Как найти и скачать в Интернете любые файлы автора Райтман М. А.

Закачка файлов с помощью программы ?Torrent Теперь можно приступить и к скачиванию желаемых файлов. Но для этого сначала следует найти торрент, с помощью которого потом будет закачан данный файл. Такие торренты находятся на специальных сайтах — трекерах. В России наиболее


Обход в ширину, симметричный обход и обход в глубину

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Обход в ширину, симметричный обход и обход в глубину Прежде чем приступить к описанию остальных трех алгоритмов обхода, которые взаимосвязаны, приведем несколько иное определение бинарного дерева. Бинарное дерево состоит из корневого узла, содержащего указатели на


Загрузка файлов с помощью браузера

Из книги Работа в Интернете. Энциклопедия автора Ташков Петр Андреевич

Загрузка файлов с помощью браузера Кроме тех основных и дополнительных возможностей, о которых говорилось ранее, браузеры способны делать и еще некоторые полезные вещи, в частности загружать из Интернета файлы. Однако загрузка файлов из Сети с помощью браузера по


4.6.2. Создание файлов с помощью creat()

Из книги Linux программирование в примерах автора Роббинс Арнольд

4.6.2. Создание файлов с помощью creat() Системный вызов creat()[49] создает новые файлы. Он объявлен следующим образом:#include <sys/types.h> /* POSIX */#include <sys/stat.h>#include <fcntl.h>int creat(const char *pathname, mode_t mode);Аргумент mode представляет права доступа к новому файлу (как обсуждалось в предыдущем


14.4.5. Обход дерева: twalk()

Из книги автора

14.4.5. Обход дерева: twalk() Функция twalk() объявлена в <search.h> следующим образом:typedef enum { preorder, postorder, endorder, leaf } VISIT;void twalk(const void *root, void (*action)(const void *nodep, const VISIT which,const int depth));Первый параметр является корнем дерева (не указателем на корень). Второй является указателем на функцию


14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()

Из книги автора

14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy() Наконец, вы можете удалить элементы из дерева и, на системах GLIBC, удалить само дерево целиком:void *tdelete(const void *key, void **rootp,int (*compare)(const void*, const void*));/* Расширение GLIBC, в POSIX нет: */void tdestroy(void *root, void (*free_node)(void *nodep));Аргументы


11.1. Сортировка файлов с помощью команды sort

Из книги автора

11.1. Сортировка файлов с помощью команды sort Команда sort позволяет выполнять сортировку входного потока по различным полям (ключам сортировки). Это довольно мощная команда, которая весьма полезна при обработке журнальных файлов или реорганизации текстовых столбцов в


11.3. Объединение файлов с помощью команды join

Из книги автора

11.3. Объединение файлов с помощью команды join Команда join выполняет соединение строк из двух текстовых файлов на основании совпадения указанных полей. Ее действие напоминает операцию join языка SQL. Механизм работы команды таков:   1. Каждый из двух входных файлов разбивается


18.7.4. Считывание данных из файлов с помощью IFS

Из книги автора

18.7.4. Считывание данных из файлов с помощью IFS Чтобы при выводе данных устранить разделитель полей в виде двоеточия, примените переменную ifs, предварительно сохранив ее установки. После того как сценарий завершит работу с этими установками, восстановите установки