0

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

请看代码片段:

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

此时文件已关闭(它是句柄)但映射到地址空间。我在记事本++中打开这个文件,修改它并尝试保存,但我看到消息:

“请检查此文件是否在另一个程序中打开。”

所以我不能从另一个进程重写它,好像它的写入权限被锁定了。

如果我未映射文件,例如:

UnmapViewOfFile(this->m_startAddress);

然后我无法再次重写文件。

我做错了什么?

4

1 回答 1

1

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

于 2013-07-18T02:59:01.910 回答