Вы должны также отслеживать, какие каталогов которые были посещены, согласно вашему первому примеру, но в противном случае нет лучшего решения, чем сохранение посещенных флагов для каждого файла.
Поддержание флагов было бы проще, если бы был переносимый способ получения короткого уникального идентификатора для смонтированной файловой системы. Даже тогда вам нужно подумать о последствиях операций mount и umount, возникающих во время сканирования, в частности, поскольку такое сканирование может занять довольно много времени, если дерево файловой системы включает в себя удаленные файловые системы.
В теории вы можете получить «идентификатор файловой системы» с интерфейса stafvfs
, но на практике это не полностью переносимо. Цитирование man statfs
из дистрибутива:
Никто не знает, что f_fsid
должен содержать & hellip;
& hellip; Общая идея состоит в том, что f_fsid
содержит некоторые случайные вещи, так что пара (f_fsid,ino)
однозначно определяет файл. Некоторые операционные системы используют (вариант) номер устройства или номер устройства в сочетании с типом файловой системы. Несколько ОС ограничивают выделение поля f_fsid только суперпользователю (и нулевое значение для непривилегированных пользователей), поскольку это поле используется в дескрипторе файла файловой системы при экспорте NFS и выдает его из соображений безопасности.
Это последнее ограничение - что f_fsid
представлен как 0 для непривилегированных пользователей - не нарушает стандарт Posix упоминавшегося выше, потому что стандарт включает в себя очень общий disclaimer: «Не определен ли все члены структура statvfs
имеет значимые значения для всех файловых систем ».
При использовании readdir() может быть прочитан тип записи каталога (d_type), таким образом программа может определить, является ли ее символьная ссылка или каталог или файл, а также игнорировать/продолжать искать дальше. См. Http://linux.die.net/man/3/readdir, опять же это зависит от реализации базового FS. – askb