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

con*_*ist 2 c file-io winapi

我在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;
}
Run Code Online (Sandbox Code Playgroud)

第二:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我认为FILE_SHARE_READ的重点是允许其他线程/进程打开一个文件,只是为了读取而不管它是否已经打开.

任何人都可以帮我解决这个问题吗?

PS如果文件是邮件,那会有什么不同吗?

Han*_*ant 7

您的CreateFile()调用显式拒绝写共享,您指定了FILE_SHARE_READ.这不起作用,第一个程序已经获得了写访问权,因为它使用了GENERIC_WRITE.您无法拒绝已获得的权利,因此呼叫将因共享冲突错误而失败.

要使其工作,第二个调用必须指定FILE_SHARE_WRITE.并且处理尝试从不可预测的时间和地点写入的文件中读取的头痛问题.当第一个进程仅附加到文件而不寻求时,这通常只会达到一个好的结果.并且你正确处理有时只获得附加数据的一部分,因为其中一些仍然停留在缓冲区或正在写入的过程中.棘手的东西.如果这是一个问题,请考虑消息模式中的管道.

从注释中重申,共享标志不控制可以执行的操作,它们控制另一个进程可以对该文件执行的操作.您想要做的是在第二个参数中指定.所以缺少FILE_SHARE_WRITE是问题,因为它阻止了另一个进程写入文件.但它已经做到了.