【问题标题】:Java7 WatchService - Access Denied error trying to delete recursively watched nested directories (Windows only)Java7 WatchService - 尝试删除递归监视的嵌套目录的访问被拒绝错误(仅限 Windows)
【发布时间】:2011-09-09 11:21:09
【问题描述】:

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

【问题讨论】:

    标签: java windows file nio java-7


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您提供有关 Windows 特定 FILE_TREE 修饰符的说明。 Java 7 Bug 数据库中的相关错误中有类似的评论(我错过了):bugs.sun.com/bugdatabase/…
    • 另外请注意,在 Eclipse 中,我必须将 rt.jar 上的访问限制导致的错误降低为警告。见lkamal.blogspot.com/2008/09/…
    猜你喜欢
    • 2019-01-14
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多