Мой совет - просто откусить пулю и выполнить сканирование каталогов в другом потоке, даже если вы говорите о тысячах файлов.Но если вы настаиваете, вот ответ:
Нет способа сделать это, не закатывая рукава и не погружаясь в ядро.
Первый вариант - использовать среду FSEvents, которая рассылает уведомления при создании, редактировании или удалении файла (а также о том, что делать с атрибутами).Обзор здесь , и кто-то написал обертку Objective C вокруг API, хотя я не пробовал.Но в обзоре не упоминается часть о событиях, связанных с изменениями file , только каталоги (как с kqueue).В итоге я использовал код из здесь вместе с файлом заголовка здесь , чтобы скомпилировать свой собственный регистратор, который я мог бы использовать для получения событий на уровне отдельных файлов.Вам нужно написать код в своем приложении, чтобы запустить регистратор в фоновом режиме и отслеживать его.
В качестве альтернативы, посмотрите на команду " fs_usage ", которая постоянно отслеживает всеактивность файловой системы (и я имею в виду all ).Это уже с Дарвином, так что вам не нужно его компилировать самостоятельно.Вы можете использовать kqueue для прослушивания изменений каталога, одновременно отслеживая вывод « fs_usage ».Если вы получили уведомление от kqueue о том, что каталог изменился, вы можете посмотреть на вывод fs_usage, посмотреть, в какие файлы были записаны файлы, и проверить имена файлов в соответствии с каталогом, который был изменен.fs_usage - пожарный шланг, поэтому будьте готовы использовать некоторые опции вместе с Grep, чтобы приручить его.
Чтобы сделать все более увлекательным, и вашему регистратору FSEvents, и fs_usage требуется root-доступ, поэтому вам нужно будет получить авторизацию от пользователя, прежде чем вы сможете использовать их в своем приложении OS X (см. Руководство по программированию служб авторизации для получения информации о том, как это сделать).
Если все это звучит ужасно сложно, то это потому, что это так.Но, по крайней мере, вам не нужно было искать трудный путь!