- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当使用内存映射文件时,它似乎要么是只读的,要么是只写的。我的意思是你不能:
我们的应用程序使用可写的内存映射文件来保存数据文件,但由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此它具有最新的更改。这很麻烦,因为文件可能非常大 (>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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!