创建一个文件映射对象

映射一个文件的第一步是通过调用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. linux多进/线程编程(2)—— fork函数和进程间“共享”数据

    参考: 1.博客1:https://www.pianshen.com/article/4305691855/ fork:在原进程的基础上"分叉"出一个子进程,即创建一个子进程. N ...

  2. RENIX软件连接机箱测试RTSM基本操作——网络测试仪实操

    本文主要介绍了RENIX软件RTSM功能连接机箱测试的基本操作.文章分为三部分内容,第一部分为RTSM功能简介,第二部分为RTSM原理简介,第三部分为RTSM测试方案的具体介绍. 第一部分.RTSM功 ...

  3. 题目要求:传入数组 内容为[['lisi','男','27'],['wangwu','男',18],['zhaoliu','男','30']],将此二维数组转化为一维数组,创建自定义函数完成

    //自定义函数 function getOne($arr){ $str = ''; //定义空的字符串,用来接收值 foreach ($arr as $key=>$value){ //循环遍历数 ...

  4. 微信小程序结合原生JS实现电商模板(一)

    前几天遇到一个朋友求助,实现购物车的相关功能,一时心血来潮,想着抽空搭建一个小程序电商平台(虽然网上有很多,但还是自己撸一遍才是王道),所以在工作之余整了一个仓库,今天提交了第一次代码,已经满足了朋友 ...

  5. LGP6694题解

    第一眼似乎很困难,实际上非常简单( 好吧这题我做了一个小时( 首先期望具有线性性,我们转化为计算点对对答案的贡献. 发现相对位置一样的点对对答案的贡献是一样的.我们把相对位置一样的点对铃出来,乘了之后 ...

  6. c++ set与unordered set的区别

    c++ std中set与unordered_set区别和map与unordered_map区别类似,其底层的数据结构说明如下: 1.set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的 ...

  7. HIve的基本使用

    WHERE从表中筛选行: SELECT从表中查询指定的列: group by在列上做聚合. -- 假设数据文件的内容,字段之间以ASCII 001(ctrl-A)分隔,行之间以换行分隔. CREATE ...

  8. 基于python 信用卡评分系统 的数据分析

    基于python 信用卡评分系统 的数据分析 import pandas as pd import matplotlib.pyplot as plt #导入图像库 from sklearn.ensem ...

  9. Linux-centos7安装mysql步骤

    原文地址:https://blog.csdn.net/qq_42467339/article/details/89471395 Centos7.3 yum安装MySQL5.7.25 扩展:在CentO ...

  10. php——字符串的""和null,empty的关系

    public function test(){ $test = ""; if($test==null){ echo "test==null <hr>" ...