OnT*_*Fly 1 c# c++ windows winapi createfile
我试图同时读取两个不同应用程序中的日志文件。但是使用共享模式 #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_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 | 文件共享写入 = 1 | 2 = 3。因此无法工作,因为写入应用程序需要 FILE_SHARE_WRITE。
这并不奇怪,但逻辑颠倒确实永远困扰着程序员。当程序创建日志文件时,它只需指定 FILE_SHARE_READ 即可允许另一个进程读取该文件。然而,这样做时它获得了另一种功能,它要求 GENERIC_WRITE 以便可以写入文件。操作系统不会反对,它将永远保留该功能,直到关闭文件为止。
然后出现的问题是另一个进程试图打开该文件但拒绝写入该文件的权限。换句话说,仅指定 FILE_SHARE_READ 而不是FILE_SHARE_WRITE。这是行不通的,第一个进程已经获得了写入权,你不能猛拉地板垫并说它不应该写入文件。这将是一次令人讨厌的拒绝服务攻击。因此操作系统拒绝并导致 CreateFile() 调用失败。
其他进程必须指定 FILE_SHARE_WRITE。
| 归档时间: | 
 | 
| 查看次数: | 1827 次 | 
| 最近记录: |