2013-01-12 3 views
10

私はアプリケーションワークベンチとの同期データファイルにWatchServiceを使用しています。監視ディレクトリの名前を変更したり移動したりすると、イベントが発生せず、WatchKeyも無効になりません。私はまだ名前が変更されたディレクトリからイベントを取得しますが、実際にはWatchKey.watchable()以外のWatchKeyの実際のパスを見つける方法はありませんが、それでも元のディレクトリパスが返されます。私はアプリケーションを可能な限り軽量に保つために、監視されたディレクトリを変更に対してロックする必要がないようにしたいと思います。Java7 WatchService - 実際の監視ディレクトリの名前変更/移動を検出する方法

私は

のWindows 7上のJDK 7u10でこの問題を経験しているディレクトリをロックするか、ルートにすべてのディレクトリを見ずに、あなたがこの問題の任意の回避策を知っていますか? Linuxの

UPDATE

私は同じ動作を観察しています。

これまでのところ、3つのオプションがあるようです。

1)データディレクトリを移動しないようにユーザーの規律に依拠します。未定義の動作につながる可能性があるので、私はこのオプションが本当に好きではありません。

2))

3より広範な非標準のネイティブライブラリを使用し、優れたディレクトリの番犬の階層を作成します。このイベント(またはOVERFLOW)は、実際に監視されているディレクトリが移動または削除されたため無効になった瞬間に表示される必要があるため、ENTRY_DELETEイベントのみを受け入れます。

+0

のJavadocは、これは、そのためにネイティブに利用可能なメカニズムを使用して、あなたがしようとしているとwin7ののメカニズムが、この場合に作用する方法を検索することを指定します? – fge

+0

Windows上のネイティブメカニズムは、ディレクトリの名前が変更された/移動されたが特定のイベントが送信されたときに変更されないディレクトリハンドルを使用します。これは問題ではありませんが、javaではこれらのウィンドウ固有のイベントを検出する方法も、実際のディレクトリハンドル値を取得して調べる方法もありません。 – rjezek

答えて

6

私の理解では、ディレクトリの名前を変更すると、名前が変更されたディレクトリではなく、古い親ディレクトリと新しい親ディレクトリでファイルシステムイベントが生成されることになります。 Can iNotify tell me where a monitored file is moved?への答えによれば、OSは、宛先ディレクトリを監視していない限り、何かがどこに移動されたかを伝えることができません。 (それに、Javaで7/8 MOVEイベントは、時計のサービスの実装では処理されません。)あなたが使用して(platform specific)拡張イベントのサポートを追加するjpathwatchプロジェクトを試みることができる

UPDATE標準Java7 WatchService API。

参考文献:

+0

まあ、私は本当に私のディレクトリが移動されたか知る必要はありません。新しい状況に応じてウォッチキーの登録を変更できるように、ムーブされたことを知っても大丈夫です。 JREの実装を確認したところ、システムからこれらのイベントを捨て去ったようです。これまでの実装でこれを処理する唯一の方法は、すべてのディレクトリをルートまで監視することです。それは非常にきれいに見えませんが、私はそれをこのように解決できると思いますか、それとももっと良いアイデアはありますか? – rjezek

+0

jpathwatchライブラリの[KEY_INVALID](http://jpathwatch.sourceforge.net/name/pachler/nio/file/ext/ExtendedWatchEventKind.html#KEY_INVALID)によると、他のシステムがWatchKeyを無効にするので、これは独立したWindowsの問題のようですそれが動いたとき。実際、標準のJava 7 WatchServiceもこのように動作するかどうかという疑問があります。そのため、Linuxでの動作をさらに詳しく調査し、結果をここに掲載します。 – rjezek

関連する問題