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

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

Я испытал эту проблему с JDK 7u10 на Windows 7

Знаете ли вы какие-либо обходные пути для этой проблемы без блокировки каталога или просмотра всех каталогов в корне?

ОБНОВИТЬ

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

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

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

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

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

1 ответ

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

ОБНОВИТЬ

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

Рекомендации:

Другие вопросы по тегам