创建文件映射对象

映射文件的第一步是通过调用 CreateFile 函数打开文件。 若要确保其他进程无法写入映射的文件部分,应以独占访问权限打开文件。 此外,文件句柄应保持打开状态,直到进程不再需要文件映射对象。 获取独占访问权限的一种简单方法是在 CreateFilefdwShareMode 参数中指定零。 CreateFileMapping 函数使用 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。 程序应测试长度为零的文件,并拒绝此类文件。

  • 由命名文件支持的文件映射对象的大小受磁盘空间限制。 文件视图的大小限制为未保留虚拟内存的最大可用连续块。 这最多为 2 GB 减去进程已保留的虚拟内存。

所选文件映射对象的大小控制了使用内存映射“查看”到文件的距离。 如果创建大小为 500 Kb 的文件映射对象,则无论文件大小如何,您都只能访问该文件的前 500 Kb。 由于创建更大的文件映射对象不会花费任何系统资源,因此创建文件映射对象的大小 (将 CreateFileMappingdwMaximumSizeHighdwMaximumSizeLow 参数设置为零) 即使不希望查看整个文件。 系统资源的成本来自创建视图并访问它们。

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

创建文件视图

在文件中创建视图