Проблема Java 7 NIO / JPathWatch - перемещение каталогов в Windows
Я реализовал приложение, которое использует Java NIO WatchService
отслеживать изменения файлов и папок в дереве каталогов. В Windows XP все изменения файловой системы отслеживаются, за исключением перемещения каталога в отслеживаемое дерево путем перетаскивания в Проводнике.
События выбираются для вырезания и вставки каталога (ctrl+x, ctrl+v), но не перетаскивания (редактирование - см. Обновление ниже).
Я переопределил решение, используя JPathWatch, однако это страдает от той же проблемы.
Я регистрирую стандарт ENTRY_CREATE
, ENTRY_DELETE
а также ENTRY_MODIFY
и я также использую любопытных недооцененных com.sun.nio.file.ExtendedWatchEventModifier
чтобы избежать других проблем при запуске приложения в Windows.
За исключением опроса - что я действительно не хочу делать - у кого-нибудь есть идеи?
Обновить
Проблема с перемещением файлов в целом - я ошибся насчет работы ctrl+x/ctrl+v. Смотрите решение ниже для объяснения.
1 ответ
Написание контрольного примера продемонстрировало, что первоначальное подозрение было неверным - проблема заключалась в любой операции перемещения файла под Windows.
Основная проблема заключается в том, что использование ExtendedWatchEventModifier.FILE_TREE
Модификатор в Windows рекурсивно отслеживает все дочерние каталоги, когда родительский каталог копируется, но не перемещается.
Когда каталог перемещается ENTRY_CREATE
зарегистрирован только в родительском каталоге, поэтому мое решение было удалить FILE_TREE
и рекурсивно контролировать каталоги вручную.
Есть предостережение, и это немного проигрышная ситуация - причина, по которой FILE_TREE
был использован в первую очередь, чтобы позволить мониторинг рекурсивного удаления деревьев каталогов. Если каталоги рекурсивно отслеживаются вручную, на дочерние каталоги накладывается блокировка файла. Это предотвращает удаление пользователем родительского каталога без предварительного удаления дочерних каталогов.
С помощью FILE_TREE
означает, что блокировка получается только для родительской папки, поэтому пользователи могут удалить полное дерево.
Использование JPathWatch вместо Java 7 NIO приводит к идентичному поведению в отношении блокировок файлов и невозможности рекурсивного удаления дерева каталогов пользователями.
Последнее, пригодное для использования решение состояло в том, чтобы использовать подход опроса с классами мониторинга Apache Commons IO, основанный на этом примере (но с дополнительным бесконечным циклом после monitor.start()
, поскольку это не блокирует, как подразумевается.