Ala*_*ark 2 memory windows delphi winapi memory-mapped-files
使用内存映射文件时,它似乎是只读的或只写的。我的意思是,您不能:
我们的应用程序使用可写的内存映射文件来保存数据文件,但是由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此具有最新更改。这很麻烦,因为文件可能很大(> 1GB),并且复制它们需要很长时间。
我已经尝试了用于创建文件映射的标志的多种组合,但是似乎没有一种组合可以灵活地按需保存。任何人都可以确认这种情况吗?我们的应用程序是用Delphi编写的,但在本例中,它使用标准的Windows API创建映射。
FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
Run Code Online (Sandbox Code Playgroud)
我认为你不能。我的意思是您也许可以,但是对我来说没有任何意义:-)
内存映射文件的全部要点是它是实际文件的窗口。如果您不想减弱文件中反映的更改,则可能必须做一些类似的事情,例如将数据结构中的更改(例如基地址,大小和数据的数组)批量添加并保存时再应用。
在这种情况下,您实际上并不需要内存映射文件,只需读入并维护要更改的块即可(如果有多用户访问的机会,请首先锁定文件)。
更新:
您是否考虑过在保存时删除原始文件并只是将临时文件重命名为原始文件名的可能性?这可能比将1G数据从临时复制到原始要快得多。这样,如果您不想保存它,只需删除临时文件并保留原始文件即可。
加载时,您仍然必须将原始数据复制到临时文件,但是不必将临时数据复制回(无论是否保存),这将节省一半的时间。