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

2022-09-03 06:56:15

我按照 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

如果您正在Windows上监视某个目录,那么WatchService实现具有指向该目录的打开句柄(这就是Windows的工作方式)。该打开句柄不会阻止删除目录,但会阻止立即删除目录的父级。删除监视目录后,句柄将关闭,但您可能会尝试在句柄关闭之前删除该目录。发生这种情况时,您将获得您正在看到的访问被拒绝。如果您重试,我认为它对您来说工作正常,这是因为句柄将在您重试时关闭。

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


答案 2