创建文件映射对象
映射文件的第一步是通过调用 CreateFile 函数打开文件。 若要确保其他进程无法写入映射的文件部分,应以独占访问权限打开文件。 此外,文件句柄应保持打开状态,直到进程不再需要文件映射对象。 获取独占访问权限的一种简单方法是在 CreateFile 的 fdwShareMode 参数中指定零。 CreateFileMapping 函数使用 CreateFileMapping 返回的句柄来创建文件映射对象。
CreateFileMapping 函数返回文件映射对象的句柄。 创建文件视图时将使用此句柄,以便可以访问共享内存。 调用 CreateFileMapping 时,可以指定对象名称、要从文件映射的字节数,以及映射内存的读/写权限。 调用 CreateFileMapping 的第一个进程创建文件映射对象。 为现有对象调用 CreateFileMapping 的进程会收到现有对象的句柄。 可以通过调用 GetLastError 函数来判断对 CreateFileMapping 的成功调用是否创建或打开了文件映射对象。 GetLastError 将 NO_ERROR 返回到创建进程, 并将ERROR_ALREADY_EXISTS 返回到后续进程。
如果访问标志与 CreateFile 函数打开文件时指定的标志冲突, CreateFileMapping 函数将失败。 例如,若要读取和写入文件,请执行以下操作:
- 在 CreateFile 的 fdwAccess 参数中指定GENERIC_READ和GENERIC_WRITE值。
- 在 CreateFileMapping 的 fdwProtect 参数中指定PAGE_READWRITE值。
创建文件映射对象不会提交物理内存,只保留它。
文件映射大小
文件映射对象的大小与所映射的文件的大小无关。 但是,如果文件映射对象大于文件,系统会在 CreateFileMapping 返回之前扩展该文件。 如果文件映射对象小于文件,则系统仅映射文件中的指定字节数。
CreateFileMapping 的 dwMaximumSizeHigh 和 dwMaximumSizeLow 参数允许您指定要从文件映射的字节数:
如果不希望文件大小更改 (例如,将只读文件映射) 时,请调用 CreateFileMapping 并为 dwMaximumSizeHigh 和 dwMaximumSizeLow 指定零。 执行此操作会创建与文件完全相同的文件映射对象。 否则,必须计算或估计完成文件的大小,因为文件映射对象的大小是静态的;创建后,无法增加或减少其大小。 尝试以这种方式映射长度为零的文件失败,错误代码 为 ERROR_FILE_INVALID。 程序应测试长度为零的文件,并拒绝此类文件。
由命名文件支持的文件映射对象的大小受磁盘空间限制。 文件视图的大小限制为未保留虚拟内存的最大可用连续块。 这最多为 2 GB 减去进程已保留的虚拟内存。
所选文件映射对象的大小控制了使用内存映射“查看”到文件的距离。 如果创建大小为 500 Kb 的文件映射对象,则无论文件大小如何,您都只能访问该文件的前 500 Kb。 由于创建更大的文件映射对象不会花费任何系统资源,因此创建文件映射对象的大小 (将 CreateFileMapping 的 dwMaximumSizeHigh 和 dwMaximumSizeLow 参数设置为零) 即使不希望查看整个文件。 系统资源的成本来自创建视图并访问它们。
可以查看未从文件开头开始的文件的一部分。 有关详细信息,请参阅 在文件中创建视图。
相关主题