Java 7 NIO/JPathWatch在Windows中移动目录时出现问题
我实现了一个应用程序,它使用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是有效的。有关解释,请参见下面的解决方案
# 1 楼答案
编写一个测试用例表明,最初的怀疑是不正确的——问题在于Windows下的任何文件移动操作
潜在的问题似乎是,在Windows上使用
ExtendedWatchEventModifier.FILE_TREE
修饰符会在复制父目录(但不移动)时递归地监视所有子目录当一个目录被移动时,
ENTRY_CREATE
只在父目录上注册,所以我的解决方案是删除FILE_TREE
并手动递归地监视目录这里有一个警告,这是一个有点丢失/丢失的情况——之所以使用
FILE_TREE
首先是为了允许监控目录树的递归删除。如果手动递归监视目录,则会在子目录上放置文件锁。这将防止用户在不先删除子目录的情况下删除父目录使用
FILE_TREE
意味着只在父文件夹上获得锁,因此用户可以删除完整的树使用JPathWatch而不是Java 7 NIO会导致相同的行为:文件锁定和用户无法递归删除目录树
最终可用的解决方案是对Apache Commons IO的监控类使用轮询方法,基于this example(但在
monitor.start()
之后有一个额外的无限循环,因为这不会像暗示的那样阻塞)