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

时间:2011-06-06 17:01:05

标签: java windows file nio java-7

我按照Watching a Directory for Changes Java7 nio2教程使用代码示例WatchDir.java递归监视目录的全部内容。

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

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

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

并尝试删除文件夹A,我收到了“拒绝访问”错误。但是,如果我:

,它可以正常工作
  • 删除文件夹A1,然后删除文件夹A
  • 删除文件F,然后删除文件夹A

有没有办法使用nio2 WatchService递归地观察嵌套目录,但是不能像程序访问嵌套文件一样?

1 个答案:

答案 0 :(得分:16)

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

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