Windows上的Java WatchService在复制内容之前通知文件夹创建

时间:2012-10-22 13:27:35

标签: java windows java-7 watchservice

我正在尝试使用Java 7和WatchService监视何时将文件夹添加到文件夹(通过从其他位置复制),然后我想对新创建的文件夹中的文件执行操作。

在OSX上它按预期工作,在文件夹及其内容被复制之前,我没有收到新文件夹创建的通知。但是在Windows上,我在文件夹的内容被复制之前收到了关于文件夹创建的关键事件,所以当我尝试处理文件夹中的文件时,通常只有第一个文件存在。

我目前的解决方法是在收到文件夹通知后,我睡了10秒等待文件内的文件复制过来,但这不是很令人满意,因为文件夹的大小可能会有很大差异因此我会睡得不够长或大部分时间太长。

为什么OSX和Windows之间的区别,以及如何在Windows上解决我的问题?

1 个答案:

答案 0 :(得分:0)

WatchService旨在在某种程度上依赖于平台。来自Java 7 API documentation

    The implementation that observes events from the file system is 
    intended to map directly on to the native file event notification 
    facility where available, or to use a primitive mechanism, such as 
    polling, when a native facility is not available. Consequently, many 
    of the details on how events are detected, their timeliness, and 
    whether their ordering is preserved are highly implementation specific.

考虑以下两种情况。

  • 单次复制操作,需要的时间比睡眠时间长。
  • 在同一文件夹中进行多次复制操作。

如果您回复创建文件夹内容而不是文件夹本身,则会涵盖这两种情况。您还可以消除睡眠中固有的竞争条件。