Подтвердить что ты не робот

Java7 WatchService - Как обнаружить переименование/перемещение фактического наблюдаемого каталога

Я использую WatchService для файлов данных синхронизации с помощью приложения workbench. Когда я переименую/перемещаю наблюдаемый каталог, я не получаю никакого события, и WatchKey не станет недействительным. Я все еще получаю события из переименованного каталога, но насколько я знаю, нет способа узнать фактический Путь к WatchKey, кроме WatchKey.watchable() который, тем не менее, возвращает исходный путь к каталогу. Я хотел бы избежать необходимости блокировки наблюдаемого каталога от изменений, так как я хочу, чтобы приложение было как можно более легким.

Я столкнулся с этой проблемой с JDK 7u10 в Windows 7

Известно ли вам обходное решение этой проблемы без блокировки каталога или просмотра всех каталогов в корне?

UPDATE

В Linux я наблюдал такое же поведение.

Пока кажется, что у меня есть три варианта.

1) Положитесь на пользовательскую дисциплину, чтобы он не перемещал каталоги данных. Мне не нравятся эти параметры, поскольку это может привести к поведению undefined.

2) Используйте более обширную нестандартную собственную библиотеку

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

4b9b3361

Ответ 1

Я понимаю, что переименование каталога будет генерировать события файловой системы в старых и новых родительских каталогах, а не в переименованном каталоге. Согласно ответу на Может ли iNotify указать мне, где перемещается файл мониторинга?, ОС не может сообщить вам, где что-то было перемещено, если вы не контролируете целевой каталог. (И, кроме того, в Java 7/8 события MOVE не обрабатываются реализацией службы часов.)

UPDATE

Вы можете попробовать проект jpathwatch, который добавляет поддержку (специфическая для платформы) расширенные события с использованием стандартных API-интерфейсов Java7 WatchService.

Литература: