Java7的WatchService – 访问拒绝错误试图删除recursion观看的嵌套目录(仅限Windows)

我跟着看了更改目录 Java7 nio2教程recursion监视使用代码示例WatchDir.java目录的全部内容。

虽然在Linux和Mac上,在Windows上(在Vista和7上testing过),在Windows上尝试删除嵌套的监视文件夹失败,并显示类似于“访问被拒绝:您需要执行此操作的权限”存在于其中一个嵌套目录中。

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

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

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

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

有没有办法使用nio2 WatchServicerecursion地观看一个嵌套的目录,但不能像一个程序访问嵌套文件一样行事?

如果您正在Windows上观看目录,那么WatchService实现会向该目录打开一个句柄(这就是Windows的工作方式)。 该打开的句柄不会阻止目录被删除,但会阻止目录的父目录被立即删除。 一旦删除了监视的目录,那么句柄就关闭了,但是可能会在句柄关闭之前尝试删除该目录。 当发生这种情况时,您将看到您所访问的访问被拒绝。 如果你重试,我认为它适合你,这是因为在你重试的时候句柄会被关闭。

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