Java 7 NIO / JPathWatch问题 - 在Windows中移动目录

时间:2013-04-17 07:57:07

标签: java windows nio watchservice

我已经实现了一个应用程序,该应用程序使用Java NIO的WatchService来监视目录树中文件和文件夹的更改。在Windows XP上运行时,除了通过在资源管理器中拖放将目录移动到受监控的树中之外,所有文件系统都会被更换。

拾取事件以剪切和粘贴目录(ctrl + x,ctrl + v),而不是拖放(编辑 - 请参阅下面的更新)。

我已使用JPathWatch重新实现了解决方案,但是这也遇到了同样的问题。

我正在注册标准ENTRY_CREATEENTRY_DELETEENTRY_MODIFY,并且还在使用好奇的未记录的com.sun.nio.file.ExtendedWatchEventModifier以避免在Windows上运行应用程序时的其他问题

保存投票 - 我真的不想做 - 有没有人有任何想法?

更新

问题在于移动文件一般 - 我错误地认为ctrl + x / ctrl + v工作。请参阅下面的解决方案以获得解释。

1 个答案:

答案 0 :(得分:0)

编写测试用例表明原始怀疑是不正确的 - 问题出在Windows下任何文件移动操作。

基本问题似乎是在Windows上使用ExtendedWatchEventModifier.FILE_TREE修饰符会在复制父目录时递归监视所有子目录,但不会移动。

当移动目录时,ENTRY_CREATE仅在父目录中注册,因此我的解决方案是删除FILE_TREE并手动递归监视目录。

有一个警告,这是一个输/输的情况 - 首先使用FILE_TREE的原因是允许监视目录树的递归删除。如果手动递归地监视目录,则会在子目录上放置文件锁。这可以防止用户在不删除子目录的情况下删除父目录。

使用FILE_TREE表示只在父文件夹上获取锁定,因此用户可以删除完整的树。

使用JPathWatch而不是Java 7 NIO会导致相同的行为:文件锁定以及用户无法递归删除目录树。

最终,可用的解决方案是使用基于this example的Apache Commons IO监控类的轮询方法(但在monitor.start()之后有一个额外的无限循环,如这不会暗示阻止。