windows - 我可以内存映射一个文件并仍然允许其他进程写入它吗?
问题描述
我正在使用以下代码对文件进行内存映射以在 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++ 吗?
解决方案
推荐阅读
- laravel - PhpStorm 它无法解析根方法,对于 vue.js
- c# - Unity - 构建 .apk 时如何保存 .csv 文件
- knp-snappy - 生成pdf时的knp_snappy空格
- javascript - JavaScript:无法禁用/启用输入按钮
- flutter - 在颤动中创建短字符串的动态列表
- amazon-web-services - AWS - 批处理与 Fargate
- intellij-idea - 当我转到声明/实施时,IntelliJ Rider 总是有两个相同的目标
- java - 如何使用 AssertJ 检查是否至少一个字符串包含在另一个字符串中?
- openmdao - 如何获取 Auto-IVC 组件输出名称列表
- sql - BigQuery:子查询 SELECT A WHERE B MAX AND C = Parent Alias