社区
硬件/系统
帖子详情
文件映射问题
wangfeng66
2003-06-26 02:51:58
★★★★★★怎摸将文件映射到内存,然后再把内存文件写回磁盘??
...全文
235
3
打赏
收藏
文件映射问题
★★★★★★怎摸将文件映射到内存,然后再把内存文件写回磁盘??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
o_racle
2003-06-26
打赏
举报
回复
来晚了...
TyraelTiger
2003-06-26
打赏
举报
回复
内存映射文件相关函数
在使用内存映射文件时,所使用的API函数主要就是前面提到过的那几个函数,下面分别对其进行介绍:
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
函数CreateFile()即使是在普通的文件操作时也经常用来创建、打开文件,在处理内存映射文件时,该函数来创建/打开一个文件内核对象,并将其句柄返回,在调用该函数时需要根据是否需要数据读写和文件的共享方式来设置参数dwDesiredAccess和dwShareMode,错误的参数设置将会导致相应操作时的失败。
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,几乎可以满足任何大数据量文件处理场合的要求。
LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
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()函数,该函数强制系统将修改过的数据部分或全部重新写入磁盘映像,从而可以确保所有的数据更新能及时保存到磁盘。
TyraelTiger
2003-06-26
打赏
举报
回复
内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。下面给出使用内存映射文件的一般方法:
首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样,在完成了对内存映射文件的使用时,还要通过一系列的操作完成对其的清除和使用过资源的释放。这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。
模块化开发SpringBoot整合MyBatis时Mapper.xml
映射
问题
一、Mapper
文件
映射
问题
问题
:SpringBoot整合Mybatis时,一直无法
映射
Mapper接口与Mapper.xml
文件
一直报错 Invalid bound statement not found xxxx.xxMapper.selectByxxx()说明Mapper接口是可以调用到的,
问题
就出在无法
映射
到Mapper.xml
文件
排查后发现还是路径的
问题
,在application.pr...
Spring boot资源
文件
映射
问题
版本 1.5.7 资源
文件
在自己的自定义目录 spring boot默认把资源
文件
存放的地址是: 默认配置的 /**
映射
到 /static (或/public、/resources、/META-INF/resources) 默认配置的 /webjars/**
映射
到 classpath:/META-INF/resources/webjars/ 我的项目结构POM
Linux 内存
映射
之
文件
映射
Linux 内存
映射
之
文件
映射
文章目录Linux 内存
映射
之
文件
映射
文件
映射
匿名
映射
文件
的私有
映射
与共享
映射
创建
映射
mmap()
文件
映射
的边界情况正常
文件
范围的内存
映射
超出
文件
范围的内存
映射
同步
映射
区域到
文件
msync()解除
映射
区域 munmap()
文件
映射
程序实例
文件
映射
匿名
映射
在Linux的内存
映射
中,主要分为
文件
映射
和匿名
映射
,其中
映射
又具有私有
映射
和共享
映射
两种方式,本文中...
QT 进程间通信——
文件
映射
简述 在Windows中,在同一台机器上数据共享的最底层机制就是内存
映射
文件
。在我们处理较大
文件
的时候,通常需要使用
文件
映射
,即将物理地址中的
文件
数据
映射
到进程的虚拟地址中。通过
文件
映射
之后,可以像操作内存一样去直接操作
文件
,而不需要再调用
文件
读写方法了。内存
映射
文件
可以用于这几个不同的目的: 系统使用内存
映射
文件
,以便加载和执行. exe和DLL
文件
。这可以大大节省页
文件
空间和应用程序...
文件
对象和
文件
映射
对象
1.内存
映射
文件
内存
映射
文件
与虚拟内存有些类似,通过内存
映射
文件
可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存
文件
映射
的物理存储器来自一个已经存在于磁盘上的
文件
,而非系统的页
文件
,而且在对该
文件
进行操作之前必须首先对
文件
进行
映射
,就如同将整个
文件
从磁盘加载到内存。由此可以看出,使用内存
映射
文件
处理存储于磁盘上的
文件
时,将不必再对
文件
执行I/O操作,这意味着
硬件/系统
2,640
社区成员
17,239
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章