我已经实现了一个应用程序,该应用程序使用Java NIO的WatchService
来监视目录树中文件和文件夹的更改。在Windows XP上运行时,除了通过在资源管理器中拖放将目录移动到受监控的树中之外,所有文件系统都会被更换。
拾取事件以剪切和粘贴目录(ctrl + x,ctrl + v),而不是拖放(编辑 - 请参阅下面的更新)。
我已使用JPathWatch重新实现了解决方案,但是这也遇到了同样的问题。
我正在注册标准ENTRY_CREATE
,ENTRY_DELETE
和ENTRY_MODIFY
,并且还在使用好奇的未记录的com.sun.nio.file.ExtendedWatchEventModifier
以避免在Windows上运行应用程序时的其他问题
保存投票 - 我真的不想做 - 有没有人有任何想法?
更新
问题在于移动文件一般 - 我错误地认为ctrl + x / ctrl + v工作。请参阅下面的解决方案以获得解释。
答案 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()
之后有一个额外的无限循环,如这不会暗示阻止。