ディレクトリツリーの変更を監視する必要のあるJavaプログラムがあります。を使用するJNIコードがありますReadDirectoryChangesW()
。ディレクトリは次のように開かれます。
HANDLE dirHandle = CreateFile(
path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL
);
そして、私はに渡しdirHandle
ますReadDirectoryChangesW()
。それはすべてうまく機能します。
問題は、コードの他の部分(Java側)がFile.setLastModified()
ファイルまたはディレクトリに「タッチ」するために使用することです(タイムスタンプを「今」に更新します)。これは一般的に機能します。ただし、を使用して開いたディレクトリに「タッチ」しようとすると失敗しますCreateFile()
。
実際に発生しているWindowsエラーを確認するために、JDKソースを調べて、File.setLastModified()
エラーを出力することを追加して、独自のコードで再実装しましたGetLastError()
。エラーは次のとおりです。
ERROR_SHARING_VIOLATION (error 32)
"The process cannot access the file because it is being used by another process."
WTF?同じプロセスです。私も合格FILE_SHARE_READ
しFILE_SHARE_WRITE
ましたCreateFile()
。
これを機能させる方法はありますか?
より詳しい情報
File.setLastModified()
JDKでのネイティブコードの実装は次のことを行います。
h = CreateFileW(pathbuf, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0);
0
最初のをに変更するとFILE_SHARE_READ | FILE_SHARE_WRITE
、すべて機能します。したがって、JDKの実装は少し壊れているようです。:(
したがって、私の質問は次のようになります。私自身の(再)実装を使用せずにこの作業を行う方法はありFile.setLastModified()
ますか?