繁体   English   中英

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

[英]Java 7 NIO / JPathWatch issue - moving directories in Windows

我实现了一个使用Java NIO的WatchService来监视目录树中文件和文件夹的更改的应用程序。 在Windows XP上运行,所有文件系统的更改都将被拾取-除了通过在Explorer中拖放目录将目录移动到受监视的树中之外。

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

我已经使用JPathWatch重新实现了该解决方案,但是存在同样的问题。

我正在注册标准ENTRY_CREATEENTRY_DELETEENTRY_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM