如何扩展内存映射文件的长度?

5
在Delphi 7中,我使用CreateFileMapping打开一个文件,然后通过使用MapViewOfFile获取指针。
如何扩展内存并向其中添加一些字符,并将其保存到该文件中?
我已经以适当的模式(fmOpenReadWrite、PAGE_READWRITE)打开了文件,如果我覆盖字符,则会将其保存到文件中,但我需要在文件中间添加额外的值。
2个回答

9
如果文件映射是由实际文件而不是一块内存支持的,那么您可以通过以下两种方式之一来调整文件大小:
1. 使用一个超过当前文件大小的大小调用CreateFileMapping()。 文件将被调整大小以匹配新的映射。
2. 直接使用SetFilePointer()和SetEndOfFile()调整文件大小,然后使用新的大小调用CreateFileMapping()。
这两种条件在CreateFileMapping()的文档中都有描述。

3

当文件映射已经创建时,您无法调整使用CreateFileMapping创建的文件映射的大小。请参见此主题的早期讨论:Windows:调整共享内存大小


好的,我假设我可以从打开的视图中创建一个新文件。还有一个问题,如何检查进程地址空间的长度,以确保我可以映射整个文件? - John
这并不是关于文件本身,而是关于文件映射,它基本上是可映射到进程地址空间的共享内存。你有两个选择:关闭/销毁现有的文件映射并创建一个新的替代映射,或者创建一个附加的文件映射并以某种方式将两者链接起来。有一种选项可以使用MapViewOfFileEx将两个映射映射到连续的地址空间中,但这并不推荐。 - Roman R.
如果我有一个完整文件内容的视图存在内存中,我可以使用该指针将其写入常规的Delphi流以保存带有一些更改的文件,对吧?你能否回答我的第二个问题?如何确定进程地址空间的长度?谢谢。 - John
您无法调整/扩展此内存区域的大小。您无法直接获取其长度。如果您打算稍后使用它们,则必须自创建文件映射对象以来保留这些值。如果您更改内存中的数据,您只能在常规RAM中覆盖它。 - Roman R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接