我有一个 Java 程序,它需要监视目录树的变化。我有使用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."
怎么回事?这是相同的过程。我什至通过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()
?