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 に答える