Java7 WatchService - ошибка «Отказано в доступе» при попытке удалить рекурсивно просматриваемые вложенные каталоги (только для Windows) - PullRequest
15 голосов
/ 06 июня 2011

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

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

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

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

и попробуйте удалить папку А, я получаю указанную ошибку «Отказано в доступе». Тем не менее, он работает нормально, если я:

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

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

1 Ответ

16 голосов
/ 07 июня 2011

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

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

...