【问题标题】:Java WatchService on Windows informing of folder creation before contents have been copiedWindows 上的 Java WatchService 在复制内容之前通知文件夹创建
【发布时间】:2012-10-22 13:27:34
【问题描述】:

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

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

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

为什么 OSX 和 Windows 之间存在差异,如何解决我在 Windows 上的问题?

【问题讨论】:

    标签: java windows java-7 watchservice


    【解决方案1】:

    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.
    

    考虑以下两种情况。

    • 比睡眠时间更长的单次复制操作。
    • 多个复制操作到同一个文件夹中。

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

    【讨论】:

    • 打算依赖于平台,或者只是依赖于平台,我读到上面的声明是说如果没有更好的可用而不是计划的分歧,则使用轮询。我要对文件夹及其内容执行的任务,它不能对添加的单个文件起作用,因此您的解决方法对我不起作用。我已经解决了第一个问题,通过计算文件夹中的文件,休眠两秒钟,再次计数,然后重复直到最后两个计数之间没有区别。你提到的第二种情况对我来说可能不是问题。
    • 你是对的,依赖 sleep() 会让你面临竞争条件。复制单个文件可能需要几秒钟以上的时间。上述两种情况之间可能没有任何可观察到的差异,解决后者涵盖了前者。如果你需要一次对一组文件进行操作,你能识别出你什么时候有一个完整的或足够的集合吗?
    • 不,我不能以稳健的方式,这就是问题所在。用例是文件代表专辑中的歌曲,文件夹代表专辑,但我不知道专辑包含多少歌曲,甚至不知道用户是否拥有原子的所有文件。我想要的是通知文件夹已创建并且其内容已完成复制,我认为这是 OSX 给我的,但它看起来就像那样,因为它正在轮询并且轮询发生在文件夹及其文件被复制之后.
    • 好的,假设用户在第一次复制相册时丢失了一个文件。片刻之后,用户完成下载文件并通过操作系统将其复制到相册副本中。你如何回应?
    • 我不想处理这种情况,只是想在复制完整文件夹时处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2014-01-13
    • 2017-07-23
    • 1970-01-01
    • 2012-10-05
    • 2020-03-13
    • 2015-10-15
    相关资源
    最近更新 更多