【问题标题】:How can I extend the length of a memory-mapped file?如何扩展内存映射文件的长度?
【发布时间】:2011-10-13 10:13:14
【问题描述】:

在 Delphi 7 中,我使用 CreateFileMapping 打开一个文件,然后使用 MapViewOfFile 获取一个指针。

如何扩展内存并在内存中添加一些字符并将其保存到该文件中?

我已经用适当的模式(fmOpenReadWrite、PAGE_READWRITE)打开了文件, 如果我覆盖字符,它会保存到文件中,但我需要在文件中间添加额外的值。

【问题讨论】:

    标签: delphi winapi memory-mapped-files


    【解决方案1】:

    如果文件映射由实际文件而不是内存块支持,则可以通过以下两种方式之一调整文件大小:

    1. 使用超过当前文件大小的大小调用CreateFileMapping()。该文件将调整大小以匹配新映射。

    2. 使用SetFilePointer()SetEndOfFile()直接调整文件大小,然后用新的大小调用CreateFileMapping()

    CreateFileMapping() 的文档中描述了这两种情况。

    【讨论】:

      【解决方案2】:

      当使用CreateFileMapping 创建的文件映射已经创建时,您无法调整其大小。请参阅之前关于该主题的讨论:Windows: Resize shared memory

      【讨论】:

      • 好的,所以我假设我可以从打开的视图中创建一个新文件。还有一个问题,如何检查进程地址空间的长度,以确保可以映射整个文件?
      • 不完全是文件,它是file mapping,它基本上是可映射到进程地址空间的共享内存。您的选择是关闭/销毁现有文件映射并创建一个新的替换文件,或者创建一个额外的文件映射并以某种方式链接两者。可以选择使用MapViewOfFileEx 映射这两个映射以产生连续的地址空间,但不建议这样做。
      • 好吧,如果我可以查看内存中文件的完整内容,我可以使用该指针将其写入普通的 delphi Stream 以保存文件并进行一些更改,对吧?你也能回答我的秒问题吗?如何确定进程地址空间的长度?谢谢
      • 您无法调整/扩展此内存区域。您无法直接获取其长度。如果您以后要使用这些值,则必须从创建文件映射对象后保留这些值。如果您更改内存中的数据,您只需将其覆盖在常规 RAM 中即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多