FSEvents странность на OS X Leopard - PullRequest
2 голосов
/ 27 мая 2009

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 27 мая 2009

У меня работает. Я эмулировал эти характеристики:

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

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

...