1

ディレクトリへの変更を監視するために Java 7 の WatchService を使用したいと考えています。
フォルダーをロックしようとしているようで、失敗すると例外がスローされますが、事前にロックする方法や既にロックされているかどうかを確認する方法は提供されていないようです。

ディレクトリが現在別のプロセスによって使用されているかどうかを知る必要があります。私はそれをロックしたりストリームを開いたりすることができないので (ディレクトリであるため)、それを変更しようとして失敗した場合はスリープするか、スリープで try/catch するよりもインテリジェントなものを探しています。

理想的には、利用可能になるまでブロッキング コールが必要です。

編集:フォルダーで FileLock を取得できないようです。フォルダをロックしようとすると、「FileNotFoundException (アクセスが拒否されました)」が発生します。グーグルは、ディレクトリでそのオブジェクトを使用できないことを示唆しています。

登録コード:

WatchService watchService = path.getFileSystem().newWatchService()
path.register(watchService,
                    StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE)

失敗したシナリオ:新規作成のため
にフォルダーをリッスンしているとしましょう。 その中にサブフォルダーが作成されている場合は、 の変更を聞きたいです。ただし、(Windows で) 新しいフォルダーを作成すると、名前が指定されるまで Windows がフォルダーをロックするため、これは失敗します。f
ggf

ありがとう

4

2 に答える 2

2

ここから撮影

File file = new File(fileName);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
// Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
    lock = channel.tryLock();
    // Ok. You get the lock
} catch (OverlappingFileLockException e) {
    // File is open by someone else
} finally {
    lock.release();
}
于 2013-08-10T16:13:19.157 に答える
2

すべてのコメントの後、あなたの問題はウィンドウに特有のように見えるので、次のライブラリを提案したいと思いました:

http://jpathwatch.wordpress.com/

機能を読むと、次のことがわかります。

サブディレクトリの変更* (再帰的監視)

これが必要です。すべての新しいディレクトリを手動で登録しなくても、それが行われるようです。選択したプラットフォームに限定されます。それを確認すると、Windowsでのみ使用できるようです!!!! ここを参照してください: http://jpathwatch.wordpress.com/documentation/features/

非常に重要なことは、監視されているディレクトリが利用できなくなったときに無効にする可能性です。(Java 監視サービスを使用すると、ディレクトリが監視されて名前が変更されても、古いパスでイベントが取得されます!!)

このライブラリは最もエレガントで、この場合のコーディングを大幅に節約できると思います。

于 2013-08-10T17:24:19.890 に答える