FileMapped写访问权限

时间:2013-07-17 17:37:04

标签: winapi file-permissions file-mapping

我尝试写入文件,当它作为从另一个进程映射的文件打开时,它会失败。

请查看代码片段:

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);

然后我再也无法重写文件了。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

Notepad ++可能会在写入文件时尝试获取独占访问权限,但在映射(或使用该文件的任何其他内容)仍处于打开状态时,该文件将失败。许多应用程序在写入文件时获得独占访问权限,以避免其他进程在完成写入之前读取数据。您正在共享您的文件,但Notepad ++只是要求太多权限。在代码中没有什么可以做的。