【发布时间】:2012-08-07 22:50:57
【问题描述】:
我正在尝试同时在两个不同的应用程序中读取日志文件。但 CreateFile (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) 使用共享模式 #FILE_SHARE_READ 在第二次调用时总是失败,错误代码为 32:ERROR_SHARING_VIOLATION: - 进程无法访问该文件,因为它正被另一个进程。
当日志文件以 FILE_SHARE_WRITE 或 FILE_SHARE_READ 模式写入时 | FILE_SHARE_WRITE 只有当 FILE_SHARE_READ 用于 writer-application 时,两个应用程序中的任何一个都无法读取文件,然后它仅在 reader-applications 使用 FILE_SHARE_WRITE 或 FILE_SHARE_READ | 时才有效。 #FILE_SHARE_WRITE,而不是在使用 #FILE_SHARE_READ 时。奇怪....有什么建议吗?
非常感谢。
修改:
Writer-Application: CreateFile(file,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
Reader-Applications: CreateFile(file,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
修正 2:
当使用来自第一修正案的调用时,第一个阅读器应用程序可以成功获取文件句柄,但第二个阅读器应用程序将失败并出现 ERROR_SHARING_VIOLATION。
修正 3:有人指出我的解决方案!
问题是我使用逻辑或而不是按位或作为共享模式: FILE_SHARE_READ 或 FILE_SHARE_WRITE = 1 或 2 = 1,但应该是 FILE_SHARE_READ | FILE_SHARE_WRITE = 1 | 2 = 3。因此无法作为 Writer-Application 所需的 FILE_SHARE_WRITE 工作。
【问题讨论】:
-
您正在使用 OPEN_EXISTING 创建它,对吗?我问是因为大多数其他选项似乎有时会尝试写入文件。
-
你没有说你打开的是什么访问模式。共享模式必须与访问模式兼容。例如如果你说
FILE_SHARE_READ,但有人打开了GENERIC_WRITE的文件,那么打开将失败,因为你没有指定FILE_SHARE_WRITE。 -
您为 dwDesiredAccess 参数指定了什么?
-
谢谢,我添加了调用参数。
-
也许您想要named pipe?听起来比你想做的更合适。
标签: c# c++ windows winapi createfile