gpt4 book ai didi

c# - 无法并行读取同一个文件

转载 作者:行者123 更新时间:2023-11-28 00:55:12 24 4
gpt4 key购买 nike

我试图同时读取两个不同应用程序中的日志文件。但是使用共享模式 #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:

当使用第一修正案中的调用时,第一个读取器应用程序可以成功获取文件句柄,但第二个读取器应用程序将失败并返回 ERROR_SHARING_VIOLATION。

修正案 3:有人指出了解决方案!

问题是我对共享模式使用了逻辑或而不是按位或:FILE_SHARE_READ 或 FILE_SHARE_WRITE = 1 或 2 = 1,但应该是 FILE_SHARE_READ |文件共享写入 = 1 | 2 = 3。因此无法工作,因为 Writer-Application 需要 FILE_SHARE_WRITE。

最佳答案

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

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

其他进程必须指定 FILE_SHARE_WRITE。

关于c# - 无法并行读取同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com