Java7 WatchService - 尝试删除递归监视的嵌套目录时出现"拒绝访问"错误(仅限Windows)

FR.*_*FR. 15 java windows nio file java-7

我跟着的变化看目录 Java7 NIO2教程递归监视使用代码样本目录中的全部内容WatchDir.java.

虽然这在Linux和Mac上运行良好,在Windows上(在Vista和7上测试),尝试使用Windows资源管理器删除嵌套的,已观看的文件夹失败,并显示类似于"拒绝访问:您需要获得执行此操作的权限"的消息存在于其中一个嵌套目录中.

例如,如果我在Windows中观看嵌套文件夹树:

-- Folder A
   -- Folder A1
      -- File F
Run Code Online (Sandbox Code Playgroud)

并尝试删除文件夹A,我得到所述拒绝访问错误.但是,如果我:

  • 删除文件夹A1然后删除文件夹A.
  • 删除文件F,然后删除文件夹A.

有没有办法使用nio2 WatchService递归地观察嵌套目录,但不能表现为程序正在访问嵌套文件?

小智 16

如果您正在Windows上查看目录,那么WatchService实现具有该目录的打开句柄(这就是Windows的工作方式).该打开句柄不会阻止删除该目录,但它会阻止立即删除该目录的父目录.删除监视目录后,句柄将关闭,但您可能会在句柄关闭之前尝试删除目录.当发生这种情况时,您将获得拒绝的访问权限.如果你重试,我认为它适用于你,这是因为你重试时手柄将被关闭.

如果ExtendedWatchEventModifier.FILE_TREEregister调用中指定修饰符,Windows上的Sun JRE可以使用Windows的监视子树功能,这可以帮助绕过此问题,因为它只创建一个文件句柄.