2013-04-17 3 views
2

Я внедрил приложение, которое использует NAA WatchService для мониторинга изменений в файлах и папках в дереве каталогов. При работе в Windows XP все изменения в файловой системе собираются - кроме перемещения каталога в отслеживаемое дерево путем перетаскивания в Explorer.Проблема Java 7 NIO/JPathWatch - перемещение каталогов в Windows

События собираются для вырезания и вставки каталога (ctrl + x, ctrl + v), а не перетаскивания (Редактировать - см. Обновление ниже).

Я повторно выполнил решение, используя JPathWatch, однако это относится к одной и той же проблеме.

Я регистрации стандарт ENTRY_CREATE, ENTRY_DELETE и ENTRY_MODIFY и я дополнительно используя любопытны underdocumented com.sun.nio.file.ExtendedWatchEventModifier, чтобы избежать других проблем, когда приложение выполняется на Windows.

Сохранить для голосования - что я действительно не хочу делать - есть ли у кого-нибудь идеи?

Update

Издание является с перемещением файлов в общем - я ошибся Ctrl + X/Ctrl + V рабочего. См. Решение ниже для объяснения.

+3

Пожалуйста, найдите время, чтобы ввести отчет об ошибке для java. Как вы, кажется, узнали и другие вещи, это сделало бы сообщество java полезным. –

+0

Можете ли вы попробовать его в более новой версии окон, чтобы определить, может ли он быть ошибкой в ​​Java или Windows? –

ответ

0

Написание тестового примера показало, что исходное подозрение было неправильным - проблема была связана с любыми файлом операции перемещения под Windows.

Основная проблема заключается в том, что использование модификатора ExtendedWatchEventModifier.FILE_TREE в Windows рекурсивно контролирует все дочерние каталоги при копировании родительского каталога, но не перемещается.

Когда каталог перемещен, ENTRY_CREATE зарегистрирован только в родительском каталоге, поэтому моим решением было удалить FILE_TREE и рекурсивно контролировать каталоги вручную.

Существует оговорка, и это немного потеряет/проиграет ситуацию - причина, по которой FILE_TREE была использована в первую очередь, заключалась в том, чтобы разрешить мониторинг рекурсивного удаления деревьев каталогов. Если каталоги рекурсивно просматриваются вручную, блокировка файлов помещается в дочерние каталоги. Это не позволяет пользователям удалять родительский каталог, не удаляя сначала дочерние каталоги.

Использование FILE_TREE означает, что блокировка получена только в родительской папке, поэтому полное дерево может быть удалено пользователями.

Использование JPathWatch вместо Java 7 NIO приводит к идентичному поведению re: блокировки файлов и невозможность рекурсивно удалить дерево каталогов.

окончательные, пригодный для использования раствором был использовать избирательный подход с классами мониторинга Apache Commons Ио, основанных от this example (но с дополнительным бесконечным циклом после monitor.start(), так как это не блокирует, как подразумеваются.