我有一个 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()?