我计划使用内存映射打开一个文件。
该文件已经被另一个进程以相同的方式打开,即它有自己的内存映射视图打开并且不时编辑该文件。
我希望自己编辑同一个文件,并尽可能有效地与另一个进程共享对它的访问,而不希望每个进程覆盖另一个进程所做的更改而发生冲突。
我可以首先直接打开文件:
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);