16

我按照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 递归地监视嵌套目录,但不像程序正在访问嵌套文件?

4

1 回答 1

17

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

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

于 2011-06-07T13:24:34.433 回答