2011-12-27 5 views
1

ディレクトリを監視したいと思っています。ファイルが表示されたらそのファイルを開いて処理し、別のディレクトリに移動します。問題は、他のプログラムがそれを書いていることを確認する方法です。 Java 7ではFileSystemのWatchServiceを使用できますが、ファイルの作成時にしか確認できません。私が望むのは、すべてのファイルハンドルがいつ解放されるかを知ることです。すべてのファイルハンドルがJavaでリリースされたときを確認します

私は最初に排他的ロックを得ることができたと考えましたが、ファイルを実際に更新している間に別のアプリケーションを追い出すことが可能であることが判明しました。

Javaでこれを行うには、どのような方法が適していますか?ありがとう!

+1

あなたが行うことができる唯一のことは、それがプログラムが終了したことを示すファイルを探していますそれと一緒に。 –

+0

@PeterLawrey:残念ながら、私のプログラムはそれらを生成する可能性のあるプログラムからファイルを拾うことができるはずです。追加ファイルを作成する方法はありません。 –

答えて

1

現在、ウォッチャーAPIは、監視対象ディレクトリでファイルシステムオブジェクトが作成、変更、または削除されたときにイベントを見ることができます。彼らは他のinotifyイベント(Linuxの場合)については教えてくれません。実際、純粋なJavaでこれを行う方法はないと思います。

私は数週間前にこれを自分で行う方法を探していたと私はあなたが他のファイルをサポートされているファイルウォッチャーを提供 FileSystem APIのカスタム実装を記述することが示唆されたメールスレッドに出くわした

システムイベント。私はそれを追求しないことにしました。なぜなら、私が見ているファイルがどのように生成されているかという知識に基づいて、代替の解決策があるからです。

私の場合、ファイルは、イメージファイルを共有ドライブに保存する計測器によって生成されます。解決方法は、新しく作成されたファイルの「変更された」イベントのストリームを見ることです。それが止まり、数秒間(「整定時間」)もはや来ていない場合、ファイルを処理することができます。

この解決策が信頼できないと判明した場合、フォールバックは、inotify呼び出しを直接使用してC/C++で監視と初期処理(ファイルのスナップショットを取る)を実装することです。これにより、ファイルクローズイベントを直接観察することができます。

+0

ありがとう!それは理にかなっている。私がやったことは、 'WatchService'を放棄して、指定された時点でディレクトリ内のファイルのスナップショットを取得し、その後数秒後に新しいファイルを取得することでした。これらのスナップショットの交点にある変更されていないファイルは、処理に安全であると考えられました。これについてのバグレポートを受け取ったら、書き直すことを検討しますが、今は要件を満たしていると仮定します。 –

1

ファイルベースのインタフェースのための最も簡単な方法は次のとおりです。

  1. 送信者が変更されたファイル名(例えば「example.xml_」)でファイルを書き込み
  2. 送信者がファイルを書き終えたとき、彼は名前を変更それは(例えば「example.xml_」に「example.xml」)だけのため
  3. レシーバスキャン「* .xmlの」
+1

1)これは、ファイルの作成を制御している場合にのみ機能し、必要に応じて名前を変更して名前を変更できます。 2)スキャンはポーリングを伴い、非効率的である。 'WatchService'を使用してください。 –

関連する問題