创建一个文件映射对象

映射一个文件的第一步是通过调用CreateFile函数来打开一个文件。为了确保其他的进程不能对文件已经被映射的那一部分进行写操作,你应该以唯一访问(exclusive access)的方式来打开文件。另外,文件句柄应该被保留打开直到进程不在需要文件映射对象。一个获取唯一访问的简单方式把CreateFile的fdwShareMode参数设为0.CreateFile所返回的文件句柄,被CreateFileMapping函数用于创建文件映射对象。

CreateFileMapping函数返回文件映射对象的句柄。当创建文件视图时这个句柄会被使用,以便你可以访问共享内存。但你调用CreateFileMapping时,你明确了对象的名字、映射到文件的字节数、以及对映射内存的读写权限。第一个调用CreateFileMapping函数的进程创建文件映射对象。为已经存在的对象调用CreateFileMapping的进程会接受一个已经存在对象的句柄。你可以通过GetLastError函数,了解CreateFileMapping是否成功调用或打开文件映射对象。GetLastError对于创建对象的进程返回NO_ERROR,对于随后的进程返回ERROR_ALREADY_EXITS.

CreateFileMapping函数会失败,如果访问标志(access flag)与CreateFile中所声明的相矛盾。比如读写文件:

  • CreateFile中fdwAccess设为GENERIC_READGENERIC_WRITE
  • CreateFileMapping中fdwProtect设为AGE_READWRITE

创建内存映射对象并不会占用物理内存,它只是保留该块内存。

文件映射的大小

文件映射对象的大小和被映射的文件的大小是独立的。然而,如果文件映射对象比文件大,系统在CreateFileMapping返回时扩大原始文件。如果文件映射对象的大小小于文件,系统只会映射文件申明的字节数。

CreateFileMapping的dwMaximum和dwMaximum参数允许你申明映射到文件的字节数:

  • 当你不希望文件的大小被改变时(比如,映射一个只读文件),调用CreateFileMapping并dwMaximumSizeHigh和dwmaximumSizeLow都置为0.这样做可以创建一个和文件一模一样大小的文件映射对象。否则,你必须计算预估最终文件的大小,因为文件映射对象大小是恒定的,一旦被创建,尺寸就不能增加或减少。尝试映射长度为0的文件会失败并返回失败码ERROR_FILE_INVALID。程序应该测试文件的长度是否为0并拒绝这样的文件。
  • 被一个有名字的文件所支持的文件映射对象的大小被磁盘空间所限制。一个文件视图的大小被限制在未被预留的虚拟内存最大可用连续块的大小。也就是说,最多是2GB除去虚拟内存已经为进程预留的大小空间。

你所选择的文件映射对象的大小控制着在内存映射中,你能看到文件多远的部分。如果你创建了一个500KB的文件映射对象,你只能访问文件前500KB的内容,不管文件有多大。既然创建一个更大的文件映射对象不会花费你任何系统资源,即使你不希望看到整个文件,也可以创建一个和文件一样大的文件映射对象。系统资源的开销来自于创建视图和访问它们。

如果你想要看到的那一部分并不从文件的开头开始,你必须创建一个文件映射对象。这个对象的尺寸是你想要看到的文件部分的大小加上文件的偏移。

Creating a File Mapping Object的更多相关文章

  1. Unity3d导入工程出现错误“Creating unique file”的解决方法

    Unity3d导入工程出现错误“Creating unique file:creating file Temp/tempFile failed.Please ensure there is enoug ...

  2. File mapping

    文件映射的三个功能: 1.File mapping allows the process to use both random input and output (I/O) and sequentia ...

  3. POJ1057 FILE MAPPING

    题目来源:http://poj.org/problem?id=1057 题目大意:计算机的用户通常希望能够看到计算机存储的文件的层次结构的图形化表示.Microsoft Windows的 " ...

  4. useradd 报Creating mailbox file: File exists

    问题描述:增加一个用户时,报下面的错误:[root@master ~]# useradd hadoopuseradd: warning: the home directory already exis ...

  5. POJ 1057 File Mapping 最详细的解题报告

    题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘ ...

  6. Creating Excel File in Oracle Forms

    Below is the example to create an excel file in Oracle Forms.Pass the Sql query string to the below ...

  7. Building Xcode iOS projects and creating *.ipa file from the command line

    For our development process of iOS applications, we are using Jenkins set up on the Mac Mini Server, ...

  8. File System Object(FSO对象)B

    一.实例FSO获取当前路径下的文件 Sub Fsotest() Dim Fso As New FileSystemObject, Path As String, File Path = ThisWor ...

  9. File System Object(FSO对象)A

    FSO对象模型包含在Scripting 类型库 (Scrrun.Dll)中,它同时包含了Drive.Folder.File.FileSystemObject和TextStream五个对象: 1.Dri ...

随机推荐

  1. 洛谷P3267.侦察守卫

    题目大意 一颗 \(n(1\leq n\leq 5\times 10^5)\) 个节点的树,在某一点 \(i\) 花费 \(w_{i}(w_{i}\leq 1000)\) 放置一个侦察守卫后可以监视到 ...

  2. Python:datetime

    学习自:datetime - Basic date and time types - Python 3.10.0b2 documentation datetime模块用于操作date和time. da ...

  3. 基于Lumisoft.NET组件,使用IMAP协议收取邮件

    在早期一直使用Lumisoft.NET组件来进行邮件的处理查找,对于邮件的处理非常方便,之前在随笔<基于Lumisoft.NET组件的POP3邮件接收和删除操作>中也介绍过基于POP3和S ...

  4. java上传图片时压缩图片

    /** * 函数:调整图片尺寸或生成缩略图 v 1.1 * @param $Image 需要调整的图片(含路径) * @param $Dw 调整时最大宽度;缩略图时的绝对宽度 * @param $Dh ...

  5. LGCF235B题解

    简单期望/fad 题意明确,不说了. 对于高次期望,一个套路的方法是维护低次期望(?) 考虑 dp,设 \(dp1[i]\) 为前 \(i\) 次点击中 所有连续的 \(O\) 的长度之和,\(dp2 ...

  6. 微信小程序刚注册快速达到1000uv

    一.什么是微信小程序uv ​ UV:是累计独立访问,1个微信号就是一个uv,多次访问不算 ​ 大家想提升微信小程序uv都是为了开通流量主 二.流量主开通标准 ​ 达到1000uv就可以开通:严重违纪不 ...

  7. Rafy 框架:领域控制器

    本文简要说明如何使用 Rafy 框架中的领域控制器. 简介 领域控制器是 Rafy 框架中用于封装领域逻辑的主要方式. 在控制器中,开发者可以封装大量的业务逻辑,并向外暴露业务接口.内部的逻辑在实现时 ...

  8. linux内存(三)内核与用户空间交互

    来自网址http://www.kerneltravel.net/jiaoliu/005.htm 用户程序和内核的信息交换是双向的,也就是说既可以主动从用户空间向内核空间发送信息,也可以从内核空间向用户 ...

  9. bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)

    bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...

  10. 还在担心CC攻击? 让我们来了解它, 并尽可能将其拒之服务之外.

    还在担心CC攻击? 让我们来了解它, 并尽可能将其拒之服务之外. CC攻击是什么? 基本原理 CC原名为ChallengeCollapsar, 这种攻击通常是攻击者通过大量的代理机或者肉鸡给目标服务器 ...