我哈瓦需要监视更改目录树中的Java程序。我有一个使用JNI ReadDirectoryChangesW()代码。目录被打开,如:

HANDLE dirHandle = CreateFile(
    path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL
);

和然后我通过dirHandleReadDirectoryChangesW()。所有这一切都工作得很好。

的问题是,该代码(在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_READFILE_SHARE_WRITECreateFile()

有没有一种方法,使这项工作?

更多信息

在JDK的本机代码实现File.setLastModified()的做了:

h = CreateFileW(pathbuf, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0);

如果我改变第一0FILE_SHARE_READ | FILE_SHARE_WRITE,它所有的作品。如此看来,JDK实现是一个小破。 :(

所以,现在我的问题是:有没有一种方法,使这项工作,而不必使用我自己的(再)执行File.setLastModified()

有帮助吗?

解决方案

虽然该错误信息是有点在这种情况下误导,你看到的是正常的行为。

通过打开与dwShareMode集目录零,JDK是,实际上,要求独占访问,这将导致任何其他接入尝试失败,并共享冲突错误。这同样适用于访问 从其他进程,并从自己的过程中。

CreateFile 描述dwShareMode参数文件:

  

如果该参数是零和的CreateFile成功,该文件或装置不能共享并且不能被再次打开,直到手柄到文件或设备被关闭。

     

您不能请求与在具有打开手柄现有请求指定的访问模式相冲突的共享模式。 CreateFile将失败,并且GetLastError函数将返回ERROR_SHARING_VIOLATION

所以,看来你已经回答了自己的问题:你需要一个定制setLastModified功能访问目录时,指定FILE_SHARE_READ | FILE_SHARE_WRITE

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top