我按照Watching a Directory for Changes Java7 nio2教程使用代码示例WatchDir.java递归监视目录的全部内容。
虽然这在Linux和Mac上运行良好,在Windows上(在Vista和7上测试过),尝试使用Windows资源管理器删除嵌套的,已观看的文件夹失败,并显示类似于“拒绝访问:您需要获得执行此操作的权限”的消息当一个文件存在于其中一个嵌套目录中时。
例如,如果我在Windows中观看嵌套文件夹树:
-- Folder A
-- Folder A1
-- File F
并尝试删除文件夹A,我收到了“拒绝访问”错误。但是,如果我:
,它可以正常工作有没有办法使用nio2 WatchService递归地观察嵌套目录,但是不能像程序访问嵌套文件一样?
答案 0 :(得分:16)
如果您正在观看Windows上的目录,那么WatchService实现具有该目录的打开句柄(这就是Windows的工作方式)。该打开句柄不会阻止删除该目录,但它会阻止立即删除该目录的父目录。删除监视目录后,句柄将关闭,但您可能会在句柄关闭之前尝试删除目录。当发生这种情况时,您将获得拒绝的访问权限。如果您重试,我认为它适用于您,这是因为手柄将在您重试时关闭。
如果在ExtendedWatchEventModifier.FILE_TREE
调用中指定register
修饰符,Windows上的Sun JRE可以使用Windows的监视子树功能,这有助于绕过此问题,因为它只创建一个文件句柄。