我遵循了WatchDir.java.代码示例的"监视目录以更改Java7 nio2"教程,递归地监视目录的整个内容
虽然这在Linux和Mac上运行良好,但在Windows(在Vista和7上进行了测试)上,当文件存在于其中一个嵌套目录中时,尝试使用Windows资源管理器删除嵌套的、受关注的文件夹失败,并显示类似于"拒绝访问:您需要执行此操作的权限"的消息。
例如,如果我在Windows:中观看嵌套文件夹树
-- Folder A
-- Folder A1
-- File F
并尝试删除文件夹A,我得到所说的访问被拒绝的错误。然而,如果I:,它可以正常工作
- 删除文件夹A1,然后删除文件夹A
- 删除文件F,然后删除文件夹A
有没有一种方法可以使用nio2 WatchService递归地监视嵌套目录,而不是像程序访问嵌套文件一样操作?
如果您在Windows上监视一个目录,则WatchService实现具有该目录的打开句柄(这就是Windows的工作方式)。该打开句柄不会阻止目录被删除,但会阻止目录的父级立即被删除。一旦您删除了关注的目录,句柄就会关闭,但您可能会在句柄关闭之前尝试删除目录。当这种情况发生时,您将看到访问被拒绝。我认为如果您重试,它对您来说很好,这是因为在您重试时句柄将关闭。
如果在register
调用中指定ExtendedWatchEventModifier.FILE_TREE
修饰符,则Windows上的Sun JRE可以使用Windows的监视子树功能,这有助于绕过此问题,因为它只创建一个文件句柄。