b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

文件绝对路径 winapi?c 文件绝对路径 api?文件内存映射CreateFileMapping和GlobalA

电脑杂谈  发布时间:2016-10-25 16:02:21  来源:网络整理

你是否正在寻找关于createfilemapping的内容?让我把最吸引人的东西奉献给你:

内存映射主要有两方面的作用,其一是对大文件的内存映射处理,其二是用于进程间共享。

(1)内存映射文件处理过程

首先,通过 CreateFile() 函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。

其次,通过 createfilemapping() 函数来为刚才创建的文件内核对象创建一个文件映射并告诉系统文件的尺寸以及访问文件的方式。

再次,通过 MapViewOfFile() 函数将文件内核映射对象添加到进程中。

接着,程序就可以通过指针进行常规的文件读取了,这里的操作就和文件操作一样,。

最后,用完之后还得回收,先用 UnmapViewOfFile() 将释放映射内核对象指针,然后通过 CloseHandle 关闭之前创建的文件映射内核对象句柄和文件内核对象句柄。

(2)函数说明

A,CreateFile

CreateFile()即使是在普通的文件操作时也经常用来创建、打开文件,在处理内存映射文件时,该函数来创建/打开一个文件内核对象,并将其句柄返回,在调用该函数时需要根据是否需要数据读写和文件的共享方式来设置参数dwDesiredAccess和dwShareMode,错误的参数设置将会导致相应操作时的失败。
B,createfilemapping

HANDLE createfilemapping(HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName);
createfilemapping()函数创建一个文件映射内核对象,通过参数hFile指定待映射到进程地址空间的文件句柄(该句柄由CreateFile()函数的返回值获取)。为了让系统能够确定对页面采取何种保护属性,需要通过参数flProtect来设定,保护属性PAGE_READONLY、PAGE_READWRITE和PAGE_WRITECOPY分别表示文件映射对象被映射后,可以读取、读写文件数据。在使用PAGE_READONLY时,必须确保CreateFile()采用的是GENERIC_READ参数;PAGE_READWRITE则要求CreateFile()采用的是GENERIC_READ|GENERIC_WRITE参数;至于属性PAGE_WRITECOPY则只需要确保CreateFile()采用了GENERIC_READ和GENERIC_WRITE其中之一即可。DWORD型的参数dwMaximumSizeHigh和dwMaximumSizeLow也是相当重要的,指定了文件的最大字节数,由于这两个参数共64位,因此所支持的最大文件长度为16EB,几乎可以满足任何大数据量文件处理场合的要求。

C,MapViewOfFile

LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
MapViewOfFile()函数负责把文件数据映射到进程的地址空间,参数hFileMappingObject为CreateFileMapping()返回的文件映像对象句柄。参数dwDesiredAccess则再次指定了对文件数据的访问方式,而且同样要与createfilemapping()函数所设置的保护属性相匹配。MapViewOfFile()函数允许全部或部分映射文件,在映射时,需要指定数据文件的偏移地址以及待映射的长度。其中,文件的偏移地址由DWORD型的参数dwFileOffsetHigh和dwFileOffsetLow组成的64位值来指定,而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB。参数dwNumberOfBytesToMap指定了数据文件的映射长度。
D,UnmapViewOfFile

BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
在完成对映射到进程地址空间区域的文件处理后,需要通过函数UnmapViewOfFile()完成对文件数据映像的释放。唯一的参数lpBaseAddress指定了返回区域的基地址,必须将其设定为MapViewOfFile()的返回值。在使用了函数MapViewOfFile()之后,必须要有对应的UnmapViewOfFile()调用,否则在进程终止之前,保留的区域将无法释放。除此之外,前面还曾由CreateFile()和createfilemapping()函数创建过文件内核对象和文件映射内核对象,在进程终止之前有必要通过CloseHandle()将其释放,否则将会出现资源泄漏的问题。

E,除了前面这些必须的API函数之外,在使用内存映射文件时还要根据情况选用其他一些辅助函数。例如,在使用内存映射文件时,为了提高速度,系统将文件的数据页面进行高速缓存,而且在处理文件映射视图时不立即更新文件的磁盘映像。为解决这个问题可以考虑使用FlushViewOfFile()函数,该函数强制系统将修改过的数据部分或全部重新写入磁盘映像,从而可以确保所有的数据更新能及时保存到磁盘。
(3)大文件实例

HANDLE hFile = CreateFile("Recv1.zip",GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ,
NULL,CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); // 创建文件内核对象

HANDLE hFileMapping = createfilemapping(hFile,NULL,PAGE_READWRITE, 0, 0x4000000, NULL);// 创建文件映射内核对象
CloseHandle(hFile);// 释放文件内核对象


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-19414-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 刘朝云
      刘朝云

      中国的实体经济说到底就是你马云搞垮的

    • 王思睿
      王思睿

      就是以鬼城为平台

    热点图片
    拼命载入中...