Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java7 WatchService-尝试删除递归监视的嵌套目录时发生拒绝访问错误(仅限Windows)_Java_Windows_File_Nio_Java 7 - Fatal编程技术网

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

Java7 WatchService-尝试删除递归监视的嵌套目录时发生拒绝访问错误(仅限Windows),java,windows,file,nio,java-7,Java,Windows,File,Nio,Java 7,我遵循Java7NIO2教程,使用代码示例递归地监视目录的全部内容 虽然这在Linux和Mac上运行良好,但在Windows(在Vista和7上进行了测试)上,当某个嵌套目录中存在文件时,尝试使用Windows资源管理器删除嵌套的、监视的文件夹失败,并显示类似于“拒绝访问:您需要执行此操作的权限”的消息 例如,如果我在Windows中查看嵌套文件夹树: -- Folder A -- Folder A1 -- File F 并尝试删除文件夹A,我得到上述访问被拒绝错误。但是,如

我遵循Java7NIO2教程,使用代码示例递归地监视目录的全部内容

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

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

-- Folder A
   -- Folder A1
      -- File F
并尝试删除文件夹A,我得到上述访问被拒绝错误。但是,如果我:

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

有没有一种方法可以使用nio2 WatchService递归地监视一个嵌套的目录,而不是像程序正在访问嵌套的文件一样进行操作?

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


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

感谢您提供有关Windows特定文件树修饰符的说明。Java7Bug数据库中的相关bug中有一条类似的注释(我遗漏了):还要注意,在Eclipse中,我必须将rt.jar上的访问限制导致的错误降低到警告。看见