Я планирую открыть файл, используя отображение памяти.
Файл уже открыт другим процессом таким же образом, т. Е. У него открыто собственное представление карты памяти и время от времени редактируется файл.
Я хочу отредактировать тот же файл сам и поделиться доступом к нему с другим процессом настолько эффективно, насколько это возможно, без надежды на конфликт между каждым процессом, перезаписывая изменения, сделанные другим.
Прежде всего, я могу открыть файл напрямую:
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);