VC 中使用内存映射文件处理大文件(3)
时间:2026-01-16
时间:2026-01-16
高中物理教学艺术
estomap);
mapviewoffile()函数负责把文件数据映射到进程的地址空间,参数hfilemappingobject为createfilemapping()返回的文件映像对象句柄。参数dwdesiredaccess则再次指定了对文件数据的访问方式,而且同样要与createfilemapping()函数所设置的保护属性相匹配。虽然这里一再对保护属性进行重复设置看似多余,但却可以使应用程序能更多的对数据的保护属性实行有效控制。mapviewoffile()函数允许全部或部分映射文件,在映射时,需要指定数据文件的偏移地址以及待映射的长度。其中,文件的偏移地址由dword型的参数dwfileoffsethigh和dwfileoffsetlow组成的64位值来指定,而且必须是操作系统的分配粒度的整数倍,对于windows操作系统,分配粒度固定为64kb。当然,也可以通过如下代码来动态获取当前操作系统的分配粒度:
system_info sinf;
getsysteminfo(&sinf);
dword dwallocationgranularity = sinf.dwallocationgranularity;
参数dwnumberofbytestomap指定了数据文件的映射长度,这里需要特别指出的是,对于windows 9x操作系统,如果mapviewoffile()无法找到足够大的区域来存放整个文件映射对象,将返回空值(null);但是在windows 2000下,mapviewoffile()只需要为必要的视图找到足够大的一个区域即可,而无须考虑整个文件映射对象的大小。
在完成对映射到进程地址空间区域的文件处理后,需要通过函数unmapviewoffile()完成对文件数据映像的释放,该函数原型声明如下:
bool unmapviewoffile(lpcvoid lpbaseaddress);
唯一的参数lpbaseaddress指定了返回区域的基地址,必须将其设定为mapviewoffile()的返回值。在使用了函数mapviewoffile()之后,必须要有对应的unmapviewoffile()调用,否则在进程终止之前,保留的区域将无法释放。除此之外,前面还曾由createfile()和createfilemapping()函数创建过文件内核对象和文件映射内核对象,在进程终止之前有必要通过closehandle()将其释放,否则将会出现资源泄漏的问题。
除了前面这些必须的api函数之外,在使用内存映射文件时还要根据情况来选用其他一些辅助函数。例如,在使用内存映射文件时,为了提高速度,系统将文件的数据页面进行高速缓存,而且在处理文件映射视图时不立即更新文件的磁盘映像。为解决这个问题可以考虑使用flushviewoffile
()函数,该函数强制系统将修改过的数据部分或全部重新写入磁盘映像,从而可以确保所有的数据更新能及时保存到磁盘。
使用内存映射文件处理大文件应用示例
下面结合一个具体的实例来进一步讲述内存映射文件的使用方法。该实例从端口接收数据,并实时将其存放于磁盘,由于数据量大(几十gb),在此
上一篇:美容院顾客档案管理
下一篇:申报五四特色红旗团支部布点课题