gpt4 book ai didi

c - 如果(理论上)我应该被允许,为什么我不能打开文件进行阅读?

转载 作者:行者123 更新时间:2023-12-04 12:16:35 26 4
gpt4 key购买 nike

我在 C 中有两个项目:

第一个:

include windows.h
include stdio.h
include tchar.h

int main()
{
HANDLE hFile = CreateFile("D:\\f.txt",
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hFile == INVALID_HANDLE_VALUE)
_tprintf("Error: CreateFile %d\n",GetLastError());

Sleep(5000);

return 0;
}

第二个:

include windows.h
include stdio.h
include tchar.h

int main()
{
HANDLE hFile = CreateFile("D:\\f.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hFile == INVALID_HANDLE_VALUE)
_tprintf("Error: CreateFile %d\n",GetLastError());

return 0;
}

第一个程序应该打开文件进行读取,同时允许其他程序从中读取。第二个应该打开文件进行阅读。

当我运行该程序时,第二个给我错误 32 (ERROR_SHARING_VIOLATION)。

我认为 FILE_SHARE_READ 的全部意义在于允许其他线程/进程打开文件只是为了读取,而不管它是否已经打开。

谁能帮我解决这个问题?

附言如果该文件是邮槽,那会有什么不同吗?

最佳答案

您的 CreateFile() 调用明确拒绝写入共享,您指定了 FILE_SHARE_READ。这行不通,第一个程序已经获得了写访问权,因为它使用了 GENERIC_WRITE。您不能拒绝已获得的权利,因此调用将因共享违规错误而失败。

要使其正常工作,第二次调用必须改为指定 FILE_SHARE_WRITE。并处理尝试读取在不可预测的时间和地点写入的文件的麻烦。这通常只有在第一个进程仅附加到文件而不查找时才会有好的结果。而且您有时只能正确处理一部分附加数据,因为其中一些数据仍停留在缓冲区中或正在写入过程中。棘手的事情。如果这是一个问题,请考虑使用消息模式的管道。

从评论中重申,共享标志不控制可以做什么,它们控制另一个进程可以对文件做什么。你想做什么在第二个参数中指定。所以缺少的 FILE_SHARE_WRITE 是问题所在,因为它阻止了另一个进程写入文件。但它已经做到了。

关于c - 如果(理论上)我应该被允许,为什么我不能打开文件进行阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473442/

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