[英]Java 7 NIO / JPathWatch issue - moving directories in Windows
我实现了一个使用Java NIO的WatchService
来监视目录树中文件和文件夹的更改的应用程序。 在Windows XP上运行,所有文件系统的更改都将被拾取-除了通过在Explorer中拖放目录将目录移动到受监视的树中之外。
拾取事件用于剪切和粘贴目录(ctrl + x,ctrl + v),而不是拖放( 编辑 -请参见下面的更新)。
我已经使用JPathWatch重新实现了该解决方案,但是存在同样的问题。
我正在注册标准ENTRY_CREATE
, ENTRY_DELETE
和ENTRY_MODIFY
并且还使用未公开说明的com.sun.nio.file.ExtendedWatchEventModifier
来避免在Windows上运行应用程序时出现其他问题。
保存以进行轮询-我真的不想这么做-有人有什么想法吗?
更新
总体而言,问题在于移动文件-我误认为ctrl + x / ctrl + v正常工作。 请参阅下面的解决方案以获取解释。
编写测试用例表明,最初的怀疑是不正确的-问题在于Windows下的任何文件移动操作。
根本的问题似乎是在复制父目录但不移动父目录时,在Windows上使用ExtendedWatchEventModifier.FILE_TREE
修饰符来递归监视所有子目录。
移动目录时,仅在父目录上注册ENTRY_CREATE
,因此我的解决方案是删除FILE_TREE
并手动递归监视目录。
需要注意的是,这是一种失败/失败的情况-首先使用FILE_TREE
的原因是允许监视目录树的递归删除。 如果手动递归监视目录,则会在子目录上放置文件锁。 这样可以防止用户删除父目录而不先删除子目录。
使用FILE_TREE
意味着仅在父文件夹上获得锁定,因此用户可以删除整个树。
使用JPathWatch代替Java 7 NIO会导致相同的行为:文件锁定,并且用户无法递归删除目录树。
最终可用的解决方案是基于此示例对Apache Commons IO的监视类使用轮询方法(但在monitor.start()
之后附加了一个无限循环,因为这不会像暗示的那样阻塞)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.