内存映射文件并不是简单的文件I/O *** 作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows *** 作系统的内存管理机制有清楚的认识,下面给出使用内存映射文件的一般方法:
首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。在用CreateFile()将文件映像在物理存储器的位置通告给 *** 作系统后,只指定了映像文件的路径,映像的长度还没有指定。为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样,在完成了对内存映射文件的使用时,还要通过一系列的 *** 作完成对其的清除和使用过资源的释放。这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。
如果没有特殊需求,你不需要作其它事情,MapViewOfFile之后, 就按照内存数组或指针的方式访问文件, 修改也是数组或指针方式的; 之后,只需UnmapViewOfFile,所有的变化都自动写回硬盘如果你等不及,也可以直接调用FlushViewOfFile。 其实UnmapViewOfFile的时候,所以已dirty的页面都会被用FlushViewOfFile的方式,写回硬盘文件。
比如:
char *x = (char *) MapViewOfFile(...)
if( x == NULL ) {
.... /* 错误处理*/
}
x[0] = '*'
x[1] = '*'
...
FlushViewOfFile(....)
/* 或者干脆*/
UnmapViewOfFile (...)
...
CloseHandle(hMaoFile)
CloseHandle(hFile)
...
1
很多用户电脑可能不是使用管理员帐号登陆的,而是采用贵宾用户账号登陆,如此一来可能某些系统重要文件就会没有访问权限,因此遇到这类问题要检查下,另外也可能是管理用户没有为这个文件夹添加权限,解决办法可以参考如下设置:
首先确保你是以管理员账户登录的,并且排除了是病毒的干扰,下面以wiundows7系统为例,介绍如何给文件夹加权限,windows xp系统设置方法于此类似。
①首先找到拒绝访问的文件夹,在其上鼠标右键,选择属性,之后切换到“安全”选项下,之后在底部可以看到有“高级”设置入后,如下图:
2
②如上图我们首先点击底部的“高级”选项,之后会d出文件夹的高级设置框属性,之后我们切换到“所有者”选项卡下,在其底部可以找到“编辑” *** 作选项,如下图:
3
③如上图,点击编辑选项后,在新d出的窗口中双击用户账号“Achai”,注意一定要选择下面的“替换子容器和对象的所有者”,如果不选择此项,我们打开此文件夹后,下面的子文件夹我们还是无法打开,选择后点“应用”, *** 作如下图:
4
以上完成之后,我们点击下面的确定来完成 *** 作,这个时候会提示:大致意思是即将给某个没有权限的文件加权限,我们点击“是”确认即可,如下图:
5
到这里给管理员添加文件访问与编辑权限就结束了,之后我们发现原来文件夹拒绝访问的文件夹可以正常打开了,如下图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)