2013-07-17 62 views
0

我嘗試寫入文件,而將文件從另一個進程映射爲文件時打開,並且失敗。FileMapped寫入訪問

請看看代碼片段:

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

然後,我不能再重寫文件。

我做錯了什麼?

回答

1

記事本++可能試圖獲得獨佔訪問該文件時寫入它,這將失敗,而映射(或其他任何使用該文件)仍然打開時。許多應用程序在寫入文件時會獲得獨佔訪問權限,以避免其他進程在完成寫入之前讀取數據。你正在分享你的文件,但Notepad ++只是要求太多的權利。在你的代碼中你無能爲力。