Эквивалент Windows для сброса всех файловых карт
void FlushToHardDrive(LPVOID fileMapAddress,HANDLE hFile)
{
FlushViewOfFile(fileMappAddress,0); //Async flush of dirty pages
FlushFileBuffers(hFiles); // flush metadata and wait
}
и для очистки части картографии
void FlushToHardDrive(LPVOID address,DWORD size, HANDLE hFile)
{
FlushViewOfFile(address,size); //Async flush of region
FlushFileBuffers(hFiles); // flush metadata and wait
}
Это описано в MSDN здесь
Флаг FILE_FLAG_NO_BUFFERING
фактически ничего не делает для файлов с отображенной памятью (описано здесь ), также даже дескриптор файла создается с этими флагами, метаданные файла могут кэшироваться и не сбрасываться , поэтому FlushFileBuffers всегда требуется для ввода-вывода и MM, если вы хотите быть полностью уверены, что все данные (включая время доступа к файлу) сохранены. Это поведение описано здесь
P.S. Пример из реальной жизни: SQLite использует MM-файлы почти только для чтения , поэтому, когда вы используете MM-файлы для записи / обновления, вам необходимо понимать все побочные эффекты для этого сценария