2015-08-01 9 views
1

Я работаю с Kqueues на mac os x, и я пытаюсь контролировать папку , поэтому я использовал фильтр EVFILT_VNODE, и я хочу получать уведомление всякий раз, когда файл удаляется, я пробовал NOTE_DELETE, но он обнаруживает только тогда, когда файл удаляется через unlink() system call, но не тогда, когда я перемещаю файл в корзину.Как определить, когда файл отправляется в корзину с помощью Kqueue?

Вопрос: Как определить, когда файл отправляется в корзину?

ответ

2

Нет простого способа сделать это. kqueue() может сообщить вам, когда файл был перемещен (a.k.a. переименован), но он не считает, что мусор является каким-то особым назначением или имеет какое-либо особое значение в отношении продолжения существования файла. То есть перемещение файла в корзину так же, как перемещение его в любой другой каталог до уровня BSD.

Итак, вы должны следить за NOTE_RENAME, чтобы узнать, когда файл перемещен/переименован. Затем вы можете использовать fcntl(fd, F_GETPATH, buffer), чтобы узнать новый путь. Обратите внимание, что для файла с жесткой привязкой это может указывать путь к одной из других ссылок, а не по пути элемента, который пользователь думает об этом. Это должно быть довольно редко.

Вам нужно было бы увидеть, находится ли новый путь внутри мусора. Это тоже сложно.

Если вам может потребоваться OS X 10.10 или новее, вы можете использовать [[NSFileManager defaultManager] getRelationship:&relationship ofDirectory:NSTrashDirectory inDomain:0 toItemAtURL:[NSURL fileURLWithPath:pathFromFcntl] error:NULL]. Если этот метод возвращает true и устанавливает relationship на что-либо, кроме NSURLRelationshipOther, файл был перемещен в корзину.

Если вам необходимо поддерживать версии 10.9 и выше, вы должны сделать это вручную:

Там не только один каталог мусора. Для каждого пользователя на каждом томе есть другой каталог. Чтобы найти каталог мусора, который будет использовать конкретный файл, вызовите [[NSFileManager defaultManager] URLForDirectory:NSTrashDirectory inDomain:NSUserDomainMask appropriateForURL:[NSURL fileURLWithPath:pathFromFcntl] create:NO error:NULL].

Затем вам нужно определить, находится ли новый путь где-то внутри этого каталога (а не сразу же внутри него). Вам нужно повторить каталоги пути. Для каждого каталога используйте -[NSURL getResourceValue:forKey:error:] с NSURLFileResourceIdentifierKey в качестве ключа для получения идентификатора ресурса. Получите то же значение для каталога мусора. Сравните их с помощью -isEqual:. Если вы найдете каталог предков, идентификатор ресурса которого совпадает с файлом корзины, то файл находится в корзине. Если итерация каталогов предков достигает корня, не обнаруживая этого, тогда это не так.

 Смежные вопросы

  • Нет связанных вопросов^_^