Какао, FSEvents, флаг kFSEventStreamCreateFlagFileEvents и «переименованные» события

Я играл с FSEvents в моем небольшом приложении, чтобы синхронизировать содержимое моего приложения с тем, что находится на жестком диске (в основном, это немного просмотрщик изображений, и я хочу, чтобы его содержимое обновлялось при изменении содержимого жесткого диска)

Я создаю свой поток, используя флаг kFSEventStreamCreateFlagFileEvents , но мне трудно понять, как эти события генерируются ОС (или ядро, или что-то еще) И, к сожалению, нет документации с событиями, сгенерированными этим флагом ... Похоже, они новы для 10.7 и до сих пор не задокументированы.

Итак, моя основная проблема - " rename ». Когда я выполняю простое переименование, 2 kFSEventStreamEventFla События gItemRenamed отправляются на мой обратный вызов. Один содержит старое имя файла, второй - новое имя файла. Проблема возникает, когда вы переименовываете пакет файлов, эти события могут быть не последовательными. Например, это следующий случай:

  1. "файл1" -> "новый_файл_1"
  2. "файл2" -> "новый_файл_2"

Я могу получать события в следующем порядке:

  1. "переименовано" / " файл1 "
  2. " переименован "/" файл2 "
  3. " переименован "/" новый_файл_1 "
  4. " переименован "/" новый_файл_2 "

И, похоже, нет никакого способа получить идентификатор первое событие переименования, когда вы поймаете второе ...Итак, что я сделал: при получении "переименованного" события я выполняю stat () с именем файла. Если статистика возвращается успешно, это означает, что это новое имя файла. Если нет, значит, старый. У меня все еще нет возможности связать оба события, но, по крайней мере, я могу обойтись, удалив старые файлы и добавив новые.

Итак, у меня в основном 2 вопроса:

Первый: я полностью слеп и не вижу очевидного способа правильно поймать "переименованное" событие через fsevents?

Второй i: Иногда у меня бывает странный баг, когда вместо 2 переименованных событий отправляются 3! Итак, я дважды добавляю файл ... Я не уверен, что это ошибка, или это связано с тем, что я полностью не использую fsevent API с флагом kFSEventStreamCreateFlagFileEvents ...

Любая помощь приветствуется, у меня совершенно нет идей, чтобы это исправить!

7
задан Parag Bafna 14 August 2015 в 11:10
поделиться