1

我正在尝试同时在两个不同的应用程序中读取日志文件。但是使用共享模式#FILE_SHARE_READ 的CreateFile ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx ) 在第二次调用时总是失败并出现错误-代码 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 工作。

4

4 回答 4

5

这并不奇怪,但它确实永远让程序员感到逻辑被颠倒。当一个程序创建一个日志文件时,它只需要指定 FILE_SHARE_READ 来允许另一个进程读取该文件。然而,它在这样做时获得了另一种能力,它要求 GENERIC_WRITE 以便它可以写入文件。操作系统不反对,它将永远保留该功能,直到它关闭文件。

然后出错的是另一个进程试图打开文件但拒绝写入文件的权利。换句话说,只指定 FILE_SHARE_READ 而不是FILE_SHARE_WRITE。那是行不通的,第一个进程已经获得了写入权,您不能猛拉地板垫并说它不应该写入文件。那将是令人讨厌的拒绝服务攻击。所以操作系统说不,并且 CreateFile() 调用失败。

其他进程必须指定 FILE_SHARE_WRITE。

于 2012-08-08T00:05:13.427 回答
0

您不能为两个不同的操作访问同一个文件,例如WRITE_TOREAD_FROM。相反,您可以为两个不同的操作克隆它。

于 2012-08-07T23:15:26.160 回答
0

您不能同时进行多项操作,即读/写操作。如果文件不是太大,您可能必须在内存中复制它。

于 2012-08-07T23:22:07.157 回答
-1

是的,我在内存映射文件中遇到了同样的问题 - 我想创建一个 mmap 文件以供多个进程读取/写入......在 Linux/MacOS 上作为一个魅力。

看来您只能在 Unix 操作系统中执行此操作,我根本无法在 Windows 中重新创建此行为。

于 2016-06-20T18:41:42.547 回答