创建文件映射对象

在 Windows 中创建文件映射对象涉及使用 CreateFile 函数打开文件。 此过程允许您将文件内容直接映射到内存中,以便高效访问和操作。 为了确保其他进程无法写入映射的文件部分,应打开具有独占访问权限的文件。 此外,文件句柄应保持打开状态,直到进程不再需要文件映射对象。 获取独占访问的一种简单方法是在 CreateFilefdwShareMode 参数中指定零。 CreateFile 返回的句柄被 CreateFileMapping 函数用于创建文件映射对象。

CreateFileMapping 函数返回文件映射对象的句柄。 创建文件视图时,将使用此句柄,以便可以访问共享内存。 调用 CreateFileMapping 时,可以指定对象名称、要从文件映射的字节数以及映射内存的读/写权限。 调用 CreateFileMapping 的第一个进程将创建文件映射对象。 为现有对象调用 CreateFileMapping 的进程接收对现有对象的句柄。 可以通过调用 GetLastError 函数来判断成功调用 CreateFileMapping 还是打开了文件映射对象。 GetLastErrorNO_ERROR 返回到创建过程,并将 ERROR_ALREADY_EXISTS 返回到后续进程。

如果访问标志与 CreateFile 函数打开文件时指定的标志冲突,则 CreateFileMapping 函数将失败。 例如,若要读取和写入文件,请执行以下作:

  • CreateFilefdwAccess 参数中指定GENERIC_READGENERIC_WRITE值。
  • CreateFileMappingfdwProtect 参数中指定PAGE_READWRITE值。

创建文件映射对象不会提交物理内存,它只保留它。

文件映射大小

文件映射对象的大小与所映射的文件的大小无关。 但是,如果文件映射对象大于文件,则系统会在 CreateFileMapping 返回之前展开该文件。 如果文件映射对象小于文件,则系统仅映射文件中的指定字节数。

CreateFileMappingdwMaximumSizeHighdwMaximumSizeLow 参数允许您指定要从文件映射的字节数:

  • 如果不希望文件大小更改(例如映射只读文件时),请调用 CreateFileMapping 并为 dwMaximumSizeHighdwMaximumSizeLow 指定零。 这样做将创建一个与文件大小完全相同的文件映射对象。 否则,必须计算或估计完成文件的大小,因为文件映射对象的大小是静态的;创建后,无法增加或减少其大小。 尝试以这种方式映射长度为零的文件会失败,并返回错误代码 ERROR_FILE_INVALID。 程序应测试长度为零的文件,并拒绝此类文件。

  • 由命名文件支持的文件映射对象的大小受磁盘空间限制。 文件视图的大小限制为最大可用连续的无保留虚拟内存块。

您选择的文件映射对象的大小决定了通过内存映射可以访问文件内容的范围。 如果创建大小为 500 Kb 的文件映射对象,则无论文件的大小如何,都只能访问文件的前 500 Kb。 由于创建较大的文件映射对象不会消耗系统资源,因此请创建与文件大小相同的文件映射对象(将 dwMaximumSizeHighdwMaximumSizeLow 参数在 CreateFileMapping 中设置为零),即使您不希望查看整个文件。 系统资源的消耗体现在创建视图和访问它们的过程中。

可以查看未从文件开头开始的文件的一部分。 有关详细信息,请参阅在 文件中创建视图

创建文件视图

在文件中创建视图