9

Java 7 WatchService API に基づいて、ディレクトリ内のファイルの内容を追跡するアプリケーションで、繰り返し発生する問題に遭遇しています。基盤となるファイル システムがファイルに対して変更イベントを発生させた場合、すぐにその SHA-256 を計算したいと考えています。

しかし、別のプロセスがファイル (Word など) を開いていることがよくあります。そのため、排他ロックが保持され、アプリで読み取り/書き込み操作ができなくなります。開いたファイルに対してストリーム/チャネルが作成された場合、nio API の FileNotFoundException または FileSystemException が次のようなメッセージとともにスローされます。

ファイルが別のプロセスによって使用されているため、プロセスはファイルにアクセスできません

ファイルが実際にfsに存在しない場合、「実際の」FileNotFoundExceptionをマスクせずにそのようなケースを検出するソリューションを見つけることができませんでした。

File.exists を介して存在を確認し、ストリームを開いたときに FileNotFoundException がスローされた場合、ファイルがロックされていると推測できるというアイデアを思いつきました。私はこれに関するあらゆる意見を受け入れます!

ありがとう!

4

2 に答える 2

1

自分でファイルをロックしようとしましたか? ロックされておらず、存在する場合にのみロックを取得できると思います。

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

于 2012-01-10T11:25:10.007 に答える
0

プロセス間でドキュメントを共有することは、特に専用のファイル システム (GFS のようなもの) を使用していない場合は注意が必要です。Java ロック API があまり役に立たないと思います。 /fail 戦略 ... Java 7 を使用すると、WatchService を使用してファイルの変更を監視し、ビジネス要件に従って動作させることができます... どのようなシステムを使用していますか? Windows は永遠にファイルのハンドルを保持します...

HTH ジェローム

于 2012-01-10T12:16:38.897 に答える