Проверить изменение уровня при обходе папки с помощью nftw()

Я пытаюсь рекурсивно перебрать папку, используя функцию nftw() языка C для печати полной структуры каталогов, при этом я не могу найти способ проверить, изменился ли уровень, т. Е. Переместился ли он внутри каталога или итерация только в каталоге. Итак, есть ли способ проверить изменение уровня с помощью nftw()?


person Vishal Chugh    schedule 01.09.2018    source источник


Ответы (1)


Если вы прочтете спецификацию POSIX для nftw(), вы обнаружите:

При каждом обнаружении файла nftw() вызывает предоставленную пользователем функцию fn с четырьмя аргументами:

  • Первый аргумент — это путь к объекту.

  • Второй аргумент — указатель на буфер статистики, содержащий информацию об объекте…

  • Третий аргумент — целое число, дающее дополнительную информацию. Его значение является одним из следующих:

    • FTW_D — The object is a directory.
  • Четвертый аргумент — указатель на структуру FTW. Значение base — это смещение имени файла объекта в пути, переданном в качестве первого аргумента fn. Значение level указывает глубину относительно корня обхода, где уровень корня равен 0.

Итак, ответ на ваш вопрос заключается в том, что элемент level объекта FTW сообщает вам уровень текущего предмета. Если вам нужно обнаружить изменения, вам нужно каким-то образом отслеживать предыдущий уровень — скорее всего, это будет переменная области видимости файла.

Было бы неплохо, если бы существовал вариант nftw() (назовем его nftw2()), который предусматривал бы предоставленный пользователем аргумент «дополнительной информации» — void *, который передавался бы nftw2(), а nftw2() передавался бы вызываемой функции. Тогда вам не понадобится переменная области видимости файла.

По крайней мере, в системах BSD, macOS и Linux есть альтернатива nftw()fts(3)" (также на FreeBSD). В руководстве по macOS говорится, что они могут быть частью будущей версии POSIX, но они не являются частью POSIX 2017. (Я также не вижу здесь параметра дополнительной информации — да ладно! системы обратного вызова рассмотрите возможность предоставления параметра контекста (или «дополнительной информации»), который можно использовать.)

person Jonathan Leffler    schedule 01.09.2018