Проверка на изменение уровня при обходе папки с помощью nftw () - PullRequest
0 голосов
/ 01 сентября 2018

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

1 Ответ

0 голосов
/ 01 сентября 2018

Если вы прочитали спецификацию 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. (Здесь я тоже не вижу параметра дополнительной информации - о, хорошо! Если вы когда-нибудь проектируете система обратного вызова, рассмотрите возможность предоставления параметра контекста (или «дополнительной информации»), который можно использовать.)

...