2015-04-23 11 views
0

Я использую FSEventsFramework для контроля каталогов изменений. Мне было интересно, звучит ли моя логика, для обнаружения старого имени файла и нового имени после переименования.Обнаружение старого имени файла и нового имени файла через FSEventsFramework

  • Я думаю, что при переименовании оба события находятся в одном обратном вызове.
  • Старое имя файла будет иметь идентификатор события X-1
  • Новое имя файла будет иметь даже идентификатор X

ли это?

Благодаря

ответ

1

Насколько я испытал это, ваше предположение не всегда верно. В FSEventStreamCreate вы будете пропускать латентность, а также флаг для значения латентности kFSEventStreamCreateFlagNoDefer. Поэтому события могут или не могут совпадать с тем же обратным вызовом. Кроме того, есть разные способы переименования файла. Некоторые Filesystem-API фактически переименовывают файл, сохраняя индекс inode как mv, другие, такие как NSDocument, создают новый индексный дескриптор. Иногда вы получаете kFSEventStreamEventFlagItemRenamed в обратном вызове, иногда нет.

EDIT: Альтернативы FSEvents являются Kernel Queues и NSFileCoordinator

FSEvents каким-то образом не полностью документированы в API-Docs. Посмотрите на файл заголовка FSEvent.h, там есть еще что прочитать.

Затем, чтобы легко увидеть, что происходит для переименования, запустите приложение и выполните переименование с помощью Finder с терминальным mv, а также в приложении на основе документов, используя маленький треугольник справа от имени файла.

+0

Спасибо mahal, я установил латентность 0, как вы думаете, в этом случае должен произойти тот же обратный вызов? Но независимо от того, знаете ли вы в том же CB, если старое/новое событие переименования должно быть X и X + 1 идентификатором события? – Noitidart

+0

Спасибо @mahal за ваши изменения! :) Вы имеете в виду для очередей ядра: https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/FSEvents_ProgGuide/KernelQueues/KernelQueues.html – Noitidart

+1

@Noitidart помог вам? если да, вы хотели бы принять его, используя зеленую галочку слева от моего ответа? –