Если вы прочитали спецификацию POSIX nftw()
, вы найдете:
В каждом найденном файле nftw()
вызывает пользовательскую функцию fn
с четырьмя аргументами:
Первый аргумент - это путь к объекту.
Второй аргумент - указатель на буфер статистики, содержащий информацию об объекте…
Третьим аргументом является целое число, дающее дополнительную информацию. Его значение является одним из следующих:
FTW_D
- Объект является каталогом.
- ...
Четвертый аргумент - указатель на структуру FTW
. Значение base
- это смещение имени файла объекта в пути, переданном в качестве первого аргумента fn
. Значение level
указывает глубину относительно корня блуждания, где корневой уровень равен 0.
Итак, ответ на ваш вопрос заключается в том, что элемент level
объекта FTW сообщает вам уровень текущего элемента. Если вам нужно определить изменения, вам нужно как-то отслеживать предыдущий уровень - скорее всего, это будет переменная области видимости файла.
Было бы неплохо, если бы был вариант nftw()
(назовите его nftw2()
), который предусматривал бы предоставленный пользователем аргумент "дополнительной информации" - void *
, который будет передан nftw2()
и который nftw2()
будет передавать вызываемую функцию. Тогда вам не понадобится переменная области видимости файла.
Системы BSD, macOS и Linux, по крайней мере, имеют альтернативу nftw()
- функциям fts(3)
(также в FreeBSD ). В руководстве по macOS говорится, что они могут быть частью будущей версии POSIX, но они не являются частью POSIX 2017. (Здесь я тоже не вижу параметра дополнительной информации - о, хорошо! Если вы когда-нибудь проектируете система обратного вызова, рассмотрите возможность предоставления параметра контекста (или «дополнительной информации»), который можно использовать.)