Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么可以';如果(理论上)我应该被允许的话,我不能打开一个文件阅读吗?_C_Winapi_File Io - Fatal编程技术网

C 为什么可以';如果(理论上)我应该被允许的话,我不能打开一个文件阅读吗?

C 为什么可以';如果(理论上)我应该被允许的话,我不能打开一个文件阅读吗?,c,winapi,file-io,C,Winapi,File Io,我有两个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 == INV

我有两个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(错误共享违反)

我认为文件共享读取的全部意义在于允许其他线程/进程打开一个文件进行读取,而不管它是否已经打开

有人能帮我解决这个问题吗

另外,如果文件是一个邮箱,那会有什么不同吗?

我认为文档中的答案是:

您不能请求与访问模式冲突的共享模式 在具有打开句柄的现有请求中指定的。 CreateFile将失败,GetLastError函数将返回 错误\u共享\u冲突

i、 e.您打开了要写入的文件,但未指明此写入可以共享。

您的CreateFile()调用明确拒绝写入共享,您指定了file\u SHARE\u READ。这无法工作,因为第一个程序已经获得了写入权限,因为它使用了泛型_write。您不能拒绝已获取的权限,因此调用将失败并出现共享冲突错误

要使其工作,第二个调用必须指定FILE\u SHARE\u WRITE。还要解决在不可预知的时间和地点试图读取正在写入的文件的头痛问题。通常,只有当第一个进程只附加到文件而不查找时,才会有好的结果。您可以正确地处理有时只获取附加数据的一部分,因为其中一些数据仍然卡在缓冲区中或在写入过程中。棘手的事情。如果这是个问题,在消息模式中考虑管道。< /P> 从注释中重申,共享标志不控制您可以做什么,它们控制另一个进程可以对文件做什么。您要做的事情在第二个参数中指定。因此,缺少文件共享写入是问题所在,因为它会阻止另一个进程写入该文件。但它已经做到了

您不能请求与指定的访问模式冲突的共享模式 在具有打开句柄的现有请求中。CreateFile将失败,并且 GetLastError函数将返回错误\u共享\u冲突

在第一个程序中,您将第三个参数(dwShareMode)指定为向其他进程授予“读取”权限,并在第二个参数(dwDesiredAccess)中为自己请求“写入”访问权限

然后在第二个程序中,您在第二个参数中请求“读取”访问(这很好),并在第三个参数中仅向其他进程授予“读取”权限,这与第一个程序中指定的访问模式(“写入”)冲突。第一个程序打开文件是“具有打开句柄的现有请求”

在第一个程序中,你说“我可以写“f.txt”,其他人只能读它。”而在第二个程序中,你说“我可以读“f.txt”,其他人只能读它”。这是一个矛盾,因为第一个程序已经在写“f.txt”


如前所述,通过两个不同的进程同时读取和写入文件会导致数据损坏

对不起。。。我没听懂。我不希望写的内容被共享,我希望读的内容被共享。或者我不明白你在说什么。对不起,我没有听你的。我认为FILE_SHARE_READ的意思是“与其他人共享此文件,因为他们只能读取它”。我不希望其他线程写入它,只是读取它。问题不在于文件共享读取。这是缺少的文件\u共享\u写入。共享标志不控制您可以做什么,它控制其他进程可以对文件做什么。您不能拒绝另一个进程写入文件,它已经这样做了。