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

Java7 WatchService - Ошибка доступа к отказам при попытке удалить рекурсивно просмотренные вложенные каталоги (только для Windows)

Я следил за Просмотр каталога изменений Учебник Java7 nio2 для рекурсивного мониторинга всего содержимого каталога с использованием примера кода WatchDir.java.

В то время как это хорошо работает на Linux и Mac, в Windows (проверено на Vista и 7), пытаясь удалить вложенные, просмотренные папки с помощью проводника Windows с сообщением, сходным с "Access Denied: вам нужно разрешение для выполнения этого действия", когда файл существует в одном из вложенных каталогов.

Например, если я смотрю дерево вложенных папок в Windows:

-- Folder A
   -- Folder A1
      -- File F

и попробуйте удалить папку A, я получаю указанную ошибку Access Denied. Однако он отлично работает, если I:

  • Удалить папку A1 и удалить папку A
  • Удалить файл F, затем удалить папку A

Есть ли способ использовать nio2 WatchService для рекурсивного просмотра вложенного каталога, но не действовать так, как если бы программа обращалась к вложенным файлам?

4b9b3361

Ответ 1

Если вы смотрите каталог в Windows, то реализация WatchService имеет открытый дескриптор этого каталога (что работает Windows). Этот открытый дескриптор не препятствует удалению каталога, но он предотвращает немедленное удаление родителя каталога. Как только вы удаляете просматриваемый каталог, дескриптор закрывается, но возможно, что вы попытаетесь удалить каталог до того, как дескриптор будет закрыт. Когда это произойдет, вы получите отказ в доступе, который вы видите. Я предполагаю, что он отлично работает для вас, если вы повторите попытку, и это связано с тем, что ручка будет закрыта к моменту повторной попытки.

Sun JRE в Windows может использовать возможности поддерева Windows, если вы укажете модификатор ExtendedWatchEventModifier.FILE_TREE в вызове register, который может помочь обойти эту проблему, поскольку он создает только один дескриптор файла.