首页 > 解决方案 > 我可以内存映射一个文件并仍然允许其他进程写入它吗?

问题描述

我正在使用以下代码对文件进行内存映射以在 Windows(Windows 10)中读取:

HANDLE windowsFileHdl = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (windowsFileHdl == INVALID_HANDLE_VALUE)
{
  return false;
}

HANDLE fileMappedHdl = CreateFileMappingA(windowsFileHdl, 0, PAGE_READONLY, 0, 0, nullptr);
char* baseFileData = (char*)MapViewOfFile(fileMapedHdl, FILE_MAP_READ, 0, 0, 0);

我仍然希望其他人在我阅读该文件时写入该文件。这可能吗?

目前,我收到这样的错误:

该进程无法访问该文件,因为它正被另一个进程使用。

通过尝试在单独的程序(记事本)中打开文件而收到上述错误,同时我对其进行了内存映射。

这是操作系统如何将文件映射到内存的限制,还是我缺少一些标志?

编辑:@zett42 指出我缺少 FILE_SHARE_READ 添加这使得代码:

HANDLE windowsFileHdl = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (windowsFileHdl == INVALID_HANDLE_VALUE)
{
  return false;
}

HANDLE fileMappedHdl = CreateFileMappingA(windowsFileHdl, 0, PAGE_READONLY, 0, 0, nullptr);
char* baseFileData = (char*)MapViewOfFile(fileMapedHdl, FILE_MAP_READ, 0, 0, 0);

现在,记事本可以打开并写入文件了!

然而,像 Visual Studio、Notepad++ 或 Emacs 等其他程序在写入文件时仍然会出现错误。

视觉工作室错误:

该进程无法访问该文件,因为它正被另一个进程使用。

记事本++错误:

该文件无法保存,可能受到保护。您想在管理员模式下启动 Notepad++ 吗?

标签: windowswinapimemoryfile-io

解决方案


推荐阅读