有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 7 NIO/JPathWatch在Windows中移动目录时出现问题

我实现了一个应用程序,它使用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) 个答案

  1. # 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()之后有一个额外的无限循环,因为这不会像暗示的那样阻塞)