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

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

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

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

  1. "file1" -> "new_file_1"
  2. "file2" -> "new_file_2"

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

  1. «переименовано» / «file1»
  2. «переименовано» / «file2»
  3. «переименовано» / «new_file_1»
  4. "renamed" / "new_file_2"

И, похоже, нет никакого способа получить идентификатор первого события переименования, когда вы перехватываете второе ... Так чточто я сделал: при получении «переименованного» события я делаю stat () с именем файла.Если статистика возвращается успешно, это означает, что это новое имя файла.Если нет, значит это старый.У меня все еще НЕТ СПОСОБА связать оба события, но, по крайней мере, я могу обойти, удалив старые файлы и добавив новые.

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

Первыйэто: Я полностью слепой и не вижу очевидного способа правильно перехватить «переименованное» событие через fsevents?

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

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

Ответы [ 2 ]

1 голос
/ 30 августа 2012

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

Имейте в виду, однако, что ОС может повторно использовать номер индекса удаленного файла, поэтому в зависимости от них уникальные идентификаторы не являются непогрешимыми.

0 голосов
/ 01 июля 2015

Вы можете получить идентификатор файла, создав URL-адрес из пути, а затем позвонив:

NSString *fileID = nil;

[url getResourceValue:&fileID forKey:NSURLFileResourceIdentifierKey error:&error]; //NS_AVAILABLE(10_7, 5_0);

(Этот идентификатор не является постоянным при перезапуске системы)

...