1

Java 7 と WatchService を使用して、フォルダーが (別の場所からコピーされて) フォルダーに追加されるタイミングを監視しようとしています。次に、新しく作成されたフォルダー内のファイルを処理したいと考えています。

OSX では、期待どおりに動作します。フォルダーとその内容がコピーされるまで、新しいフォルダーの作成の通知を受け取りません。しかし、Windows では、フォルダーの内容がコピーされる前に、フォルダーの作成時にキー イベントを受け取るため、フォルダー内のファイルを処理しようとすると、通常は最初のファイルだけが存在します。

私の現在の回避策は、フォルダー通知を受け取った後、10 秒間スリープして、その中のファイルがコピーされるのを待つことですが、フォルダーのサイズがかなり異なる可能性があるため、これはあまり満足のいくものではありません。ほとんどの時間。

OSX と Windows の違いはなぜですか? Windows で問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

WatchService は、ある程度プラットフォームに依存することを意図しています。Java 7 APIドキュメントから:

    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.

次の 2 つのケースを考えてみましょう。

  • スリープよりも時間がかかる単一のコピー操作。
  • 同じフォルダーへの複数のコピー操作。

フォルダー自体ではなく、フォルダーの内容の作成に応答する場合は、これらの両方のケースをカバーします。また、スリープに固有の競合状態を排除することもできます。

于 2012-10-22T18:09:06.217 に答える