gpt4 book ai didi

windows - 内存映射文件可选写入可能吗?

转载 作者:可可西里 更新时间:2023-11-01 09:43:59 25 4
gpt4 key购买 nike

当使用内存映射文件时,它似乎要么是只读的,要么是只写的。我的意思是你不能:

  • 打开一个用于写入,然后决定不保存它
  • 已打开打开阅读,稍后决定保存它

我们的应用程序使用可写的内存映射文件来保存数据文件,但由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此它具有最新的更改。这很麻烦,因为文件可能非常大 (>1GB),并且复制它们需要很长时间。

我已经尝试了多种用于创建文件映射的标志组合,但似乎没有一种允许灵活地按需保存。任何人都可以确认是这种情况吗?我们的应用程序是用 Delphi 编写的,但它使用标准的 Windows API 来创建映射,在我们的例子中

FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);

最佳答案

我认为你做不到。我的意思是你可能能够,但这对我来说没有任何意义:-)

内存映射文件的全部意义在于它是实际文件的一个窗口。如果您不想在文件中反射(reflect)更改,您可能必须执行一些操作,例如对数据结构中的更改进行批处理(例如,基地址、大小和数据的数组)并在保存时应用它们。

在这种情况下,您实际上不需要内存映射文件,只需读入并维护您要更改的 block (如果有机会进行多用户访问,请先锁定文件).

更新:

有没有想过在保存的时候,把原来的文件删除,把临时文件重命名为原来的文件名?这可能比将 1G 数据从临时数据复制到原始数据要快得多。这样,如果您不想保存它,只需删除临时文件并保留原始文件即可。

加载时您仍然需要将原始数据复制到临时文件,但您不必将临时数据复制回来(无论您保存与否)- 这将使花费的时间减半。

关于windows - 内存映射文件可选写入可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1629317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com