【发布时间】:2010-12-10 09:38:45
【问题描述】:
当使用内存映射文件时,它看起来要么是只读的,要么是只写的。我的意思是你不能:
- 有一个可以写,后来决定不保存
- 已打开阅读,稍后决定保存
我们的应用程序使用一个可写的内存映射文件来保存数据文件,但由于用户可能想退出而不保存更改,我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此它具有最新的更改。这很麻烦,因为文件可能非常大 (>1GB),而且复制它们需要很长时间。
我尝试了许多用于创建文件映射的标志组合,但似乎没有一个允许灵活地按需保存。任何人都可以确认是这种情况吗?我们的应用程序是用 Delphi 编写的,但在我们的例子中它使用标准的 Windows API 来创建映射
FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
【问题讨论】:
-
这里的 memory-mapped 文件没有什么特别之处。如果你写一个文件——任何文件——那么你就真的写过了。保存文件正在写入。不想保存就别写了。
-
这并不完全正确 - 您可以写入内存映射文件,而不会将更改反映在基础文件中,具体取决于创建它的标志。
标签: windows delphi winapi memory memory-mapped-files