创建一个文件映射对象

映射一个文件的第一步是通过调用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. Oracle数据库的一些常用命令

    转至:https://blog.csdn.net/qq_36843413/article/details/81409152?utm_medium=distribute.pc_relevant_t0.n ...

  2. Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream

    1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...

  3. Lua中如何实现类似gdb的断点调试--04优化钩子事件处理

    在第一篇的01最小实现中,我们实现了一个断点调试的最小实现,在设置钩子函数时只加了line事件,显然这会对性能有很大的影响.而后来两篇02通用变量打印和03通用变量修改及调用栈回溯则是提供了一些辅助的 ...

  4. [USACO20FEB]Equilateral Triangles P 题解

    优雅的暴力. 设三个点为 \((i,j,k)\),则有 \(6\) 个未知数即 \(x_i,x_j,x_k,y_i,y_j,y_k\).又因为有 \(2\) 条关于这 \(6\) 个未知数的方程 \( ...

  5. ElasticSearch 文档(document)内部机制详解

    1.数据路由 1.1 文档存储怎么路由到相应分片? 一个文档,最终会落在主分片的一个分片上,到底应该在哪一个分片?这就是数据路由. 1.2 路由算法 shard = hash(routing) % n ...

  6. 微信小程序搜索并高亮关键字

    更多解读可使用博客: https://www.jianshu.com/p/86d73745e01c 实现流程:1.在文本框中输入关键字key,如"比赛",检索出比赛相关的列表key ...

  7. php 生成唯一订单号5种方法

    第一种 private function doCreateOrderNumber($time){ $i=1; $dd = date('Ymd',$time); $aa = 'OH'.$dd; $res ...

  8. 『现学现忘』Docker常用命令 — 19、容器常用命令(一)

    目录 1.新建并启动容器 2.列出当前所有正在运行的容器 3.退出容器 4.启动容器 5.重启容器 6.停止容器 7.强制停止容器 8.删除已停止的容器 有镜像才能创建容器,这是根本前提. 我们下载一 ...

  9. 拉格朗日插值法--python

    数据插补 常见插补方法 插值法--拉格朗日插值法 根据数学知识可知,对于平面上已知的n个点(无两点在一条直线上可以找到n-1次多项式 ,使次多项式曲线过这n个点. 1)求已知过n个点的n-1次多项式: ...

  10. 13 数组 Java内存分析 三种初始化

    Java内存分析 三种初始化 静态初始化 //静态初始化 创建+赋值 int[] a = {1,2,3}; Man[] mans = {new Man(1,1),new Man(2,2)}; 动态初始 ...