Вопрос

Я хочу отслеживать события файловой системы для пары каталогов на Mac.Каталоги, которые я хочу отслеживать, могут изменяться во время выполнения, поэтому с помощью FSEvents вот что делает мое приложение:

  • создает глобальную функцию обратного вызова для обработки обратных вызовов
  • создайте новый FSEventStreamRef для каждой папки, связав его с обратным вызовом, созданным выше, и добавив контекст к EventStream, который помогает мне связать обратный вызов изменения с этой папкой

Кажется, что в основном все работает, но я заметил некоторую странность в том, когда вызываются обратные вызовы и значения 'eventPaths' отправляются на обратный вызов.

Например, если я создал StreamRefs для /Foo и /Bar, если я добавлю файл в /Bar, мой обратный вызов вызывается почти сразу, но eventPaths указывает на местоположение в / Foo, и контекст, который я связал с StreamRef, также является контекстом /Foo .

Или, скажем, я отслеживаю / Foo и / Bar, а затем удаляю /Bar (правильно остановив и закрыв StreamRef для /Bar).Теперь я создаю новый FSEventStreamRef для / Fee и связываюсь с тем же обратным вызовом.Любые изменения, которые я вношу в / Fee, не вызывают вызова обратного вызова, но изменения в / Foo продолжают вызывать обратный вызов.

В любом примере или документации, которые я видел в Интернете, говорится только о мониторинге одной папки.Что-то не так с тем, как я связываю отдельные обратные вызовы с несколькими ссылками FSEventStreamRefs?Хотя, похоже, это не должно быть проблемой...

Кто-нибудь делал что-то подобное таким образом, чтобы это работало надежно, или какие-либо предложения о том, что я мог бы попробовать по-другому?

Одна вещь, которую я пытался сделать, экспериментируя с этим, - использовать один FSEventStreamRef и передавать ему CFArrayRef со всеми путями, которые я хотел, и когда мой список наблюдения изменится, закройте и заново создайте новый FSEventStreamRef - это работает еще хуже, чем вышеописанный.

Это было полезно?

Решение

Работает на меня. Я подражал этим характеристикам:

  1. Один путь для каждого потока
  2. Один контекст на путь / поток
  3. Один обратный вызов для всех потоков

Можете ли вы показать код, который терпит неудачу?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top