为什么fopen在CreateFile失败的地方成功?

时间:2018-05-28 14:52:33

标签: winapi

在我的Win7 64bit系统中,我使用自己的程序创建了许多文本文件:

hLogFile = CreateFile (LogFileSpec,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,
                     CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);

当其中一个文件打开(显示在屏幕上)时,我无法使用以下命令在另一个程序中再次打开它(文件共享冲突):

hSrcFile = CreateFile (SrcSpec,GENERIC_READ,FILE_SHARE_READ,NULL,
                     OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

但是,当其中一个文件打开(显示在屏幕上)时,我可以使用以下命令在另一个程序中再次打开它:

hFile = fopen(FileSpec,"rb"); 

有谁知道这里发生了什么?为什么BOTH方法不能以读共享模式打开当前显示的文件?

我真的不想去 回到过去,并使用C运行时库中的fopen()内容,但是我 在Win32 API中找不到任何可以完成这项工作的东西。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

The first CreateFile() is creating the file for reading AND writing, and is sharing read-only access.

The second CreateFile() is opening the file for reading only (OK), but is sharing read-only access (sharing violation).

Since the file is opened for writing, and the second call does not include write sharing, the second call fails.

You need to add FILE_SHARE_WRITE to the second call:

hSrcFile = CreateFile (SrcSpec, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);