我正在尝试同时读取两个不同应用程序中的日志文件。但是,带有共享模式#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用于编写器应用程序时,两个应用程序中的任何一个都无法读取该文件,然后只有当阅读器应用程序使用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:
当使用第一个修正案中的调用时,第一个Reader-Application可以成功获取文件句柄,但第二个Reader-Application将失败并显示ERROR_SHARING_VIOLATION。
修正案3:有人向我指出了解决方案!
问题是我使用逻辑Or而不是按位或用于共享模式: FILE_SHARE_READ或FILE_SHARE_WRITE = 1或2 = 1,但它应该是FILE_SHARE_READ | FILE_SHARE_WRITE = 1 | 2 = 3.因此无法工作,因为Writer-Application需要FILE_SHARE_WRITE。
答案 0 :(得分:4)
这并不奇怪,但它确实让程序员感到厌恶逻辑被颠倒了。当程序创建日志文件时,它只需指定FILE_SHARE_READ以允许另一个进程读取该文件。然而,当它这样做时它获得了另一种能力,它要求GENERIC_WRITE以便它可以写入文件。没有来自操作系统的异议,它将永远保持该功能,直到它关闭文件。
出现问题的是另一个尝试打开文件的进程,但是拒绝编写文件的权利。换句话说,只指定FILE_SHARE_READ和不 FILE_SHARE_WRITE。那是行不通的,第一个过程已经获得了写作权,你不能扯下地板并说它不应该写入文件。这将是一次令人讨厌的拒绝服务攻击。因此操作系统说不,并且CreateFile()调用失败。
其他进程必须指定FILE_SHARE_WRITE。
答案 1 :(得分:0)
您无法为WRITE_TO
或READ_FROM
这两种不同的操作访问同一文件。相反,您可以为两个不同的操作克隆它。
答案 2 :(得分:0)
您不能同时执行多个操作,即读/写操作。如果文件不是太大,你可能不得不在内存中复制它。
答案 3 :(得分:-1)
是的,我使用内存映射文件打到同一个墙 - 我想创建一个mmap文件,通过多个进程读/写...在Linux / MacOS上作为魅力。
似乎只能在Unix操作系统中执行此操作,我根本无法在Windows中重新创建此行为。