Я пытаюсь рекурсивно перебрать папку, используя функцию nftw() языка C для печати полной структуры каталогов, при этом я не могу найти способ проверить, изменился ли уровень, т. Е. Переместился ли он внутри каталога или итерация только в каталоге. Итак, есть ли способ проверить изменение уровня с помощью nftw()?
Проверить изменение уровня при обходе папки с помощью nftw()
Ответы (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. (Я также не вижу здесь параметра дополнительной информации — да ладно! системы обратного вызова рассмотрите возможность предоставления параметра контекста (или «дополнительной информации»), который можно использовать.)