我尝试写入文件,当它作为从另一个进程映射的文件打开时,它会失败。
请查看代码片段:
access = GENERIC_READ | GENERIC_WRITE;
share = FILE_SHARE_READ | FILE_SHARE_WRITE;
disposition = OPEN_EXISTING;
HANDLE fileHandle = CreateFileA(fileName.c_str(), access, share, 0, disposition, 0);
//...
unsigned long valProtect = 0;
//...
valProtect = PAGE_READWRITE;
//...
const HANDLE mappingHandle = CreateFileMapping(fileHandle, 0, valProtect, 0, 0, 0);
//...
this->m_access = FILE_MAP_ALL_ACCESS;
//...
this->m_startAddress = (uint8_t*)MapViewOfFile(mappingHandle, this->m_access, 0, 0, 0);
//...
CloseHandle(fileHandle);
此时文件已关闭(它是句柄)但映射到地址空间。 我在notepad ++中打开这个文件,修改它并尝试保存,但是我看到了消息:
“请检查此文件是否在其他程序中打开。”
所以我无法从另一个进程重写它,似乎它的写入权限已被锁定。
如果我取消映射文件,如:
UnmapViewOfFile(this->m_startAddress);
然后我再也无法重写文件了。
我做错了什么?
答案 0 :(得分:1)
Notepad ++可能会在写入文件时尝试获取独占访问权限,但在映射(或使用该文件的任何其他内容)仍处于打开状态时,该文件将失败。许多应用程序在写入文件时获得独占访问权限,以避免其他进程在完成写入之前读取数据。您正在共享您的文件,但Notepad ++只是要求太多权限。在代码中没有什么可以做的。