メモリ マッピングを使用してファイルを開く予定です。
ファイルは同じ方法で別のプロセスによって既に開かれています。つまり、独自のメモリ マップ ビューが開かれており、時々ファイルが編集されます。
同じファイルを自分で編集し、他のプロセスが行った変更を上書きして競合することなく、他のプロセスとできるだけ効果的にアクセスを共有したいと考えています。
まず、ファイルを直接開くことができます。
IntPtr f_ptr = CreateFile(
path,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_ALWAYS,
FILE_FLAG_RANDOM_ACCESS,
IntPtr.Zero);
ただし、ファイル バイナリを直接編集することは、他のプロセスのメモリ マッピング オブジェクトが私の変更を上書きする可能性があるという点で効果的ではありません。
以下のように、独自のファイル マッピングと独自のビューを開くと、他のプロセスが自動的に更新され、編集内容が上書きされないように見えます。
ここで起こっているシンクロニシティは何ですか?
他のプロセスのファイル マッピングにマップされた独自のビューを開いているわけではありません。同じファイルにまったく新しい FileMapping を作成しました。
ファイルシステムまたは FileMapping システムは、これを何らかの形で理解しているようです。なんで?
// file map pointer
IntPtr m_ptr = CreateFileMapping(f_ptr, IntPtr.Zero, PAGE_READWRITE, 0, 0, "MyMapping");
// map view pointer
IntPtr view_ptr = MapViewOfFileEx(m_ptr, FILE_MAP_WRITE, 0, 0, 0, IntPtr.Zero);
// EDIT FILE CONTENTS
FlushViewOfFile(view_ptr, 0);
UnmapViewOfFile(view_ptr);
CloseHandle(m_ptr);