VC 6.0内存文件映射
来源:百度文库 编辑:神马文学网 时间:2024/04/25 00:28:14
VC++6.0内存文件映射
由于某种需要,很多时候可能需要对文件进行随机偏移读取和修改。一般情况下,可以先fseek到文件中制定的位置,再将文件块读入内存-修改-写回。 对于大文件(GB量级),或者频繁的随机文件读写,这样的方式会非常耗费时间。
这类操作一般是以内存映射文件(即将文件映射到进程的某一块空间)的方式来加以处理的。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行 I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,所以效率大大提高。
下面试总结的内存文件映射使用方式:
//开始
//获得文件句柄
HANDLE hFile=CreateFile(
"data.dat", //文件名
GENERIC_READ|GENERIC_WRITE, //对文件进行读写操作
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING, //打开已存在文件
FILE_ATTRIBUTE_NORMAL,
0);
//返回值size_high,size_low分别表示文件大小的高32位/低32位
DWORD size_low,size_high;
size_low= GetFileSize(hFile,&size_high);
//创建文件的内存映射文件。
HANDLE hMapFile=CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE, //对映射文件进行读写
size_high,
size_low, //这两个参数共64位,所以支持的最大文件长度为16EB
NULL);
if(hMapFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Can't create file mapping.Error%d:\n", GetLastError());
CloseHandle(hFile);
return;
}
//把文件数据映射到进程的地址空间
void* pvFile=MapViewOfFile(
hMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,
0,
0,
0);
unsigned char *p=(unsigned char*)pvFile;
//至此,就获得了外部文件data.dat在内存地址空间的映射,
//下面就可以用指针p"折磨"这个文件了
CString s;
p[size_low-1]=0x1f;
p[size_low-2]=0x2f; //修改该文件的最后两个字节(文件大小<4GB高32位为0)
s.Format("%#x,%#x,%#x",p[size_low-3],p[size_low-2],p[size_low-1]);
//读文件的最后3个字节
AfxMessageBox(s);
//结束
UnmapViewOfFile(pvFile); //撤销映射
CloseHandle(hFile); //关闭文件
由于某种需要,很多时候可能需要对文件进行随机偏移读取和修改。一般情况下,可以先fseek到文件中制定的位置,再将文件块读入内存-修改-写回。 对于大文件(GB量级),或者频繁的随机文件读写,这样的方式会非常耗费时间。
这类操作一般是以内存映射文件(即将文件映射到进程的某一块空间)的方式来加以处理的。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行 I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,所以效率大大提高。
下面试总结的内存文件映射使用方式:
//开始
//获得文件句柄
HANDLE hFile=CreateFile(
"data.dat", //文件名
GENERIC_READ|GENERIC_WRITE, //对文件进行读写操作
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING, //打开已存在文件
FILE_ATTRIBUTE_NORMAL,
0);
//返回值size_high,size_low分别表示文件大小的高32位/低32位
DWORD size_low,size_high;
size_low= GetFileSize(hFile,&size_high);
//创建文件的内存映射文件。
HANDLE hMapFile=CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE, //对映射文件进行读写
size_high,
size_low, //这两个参数共64位,所以支持的最大文件长度为16EB
NULL);
if(hMapFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Can't create file mapping.Error%d:\n", GetLastError());
CloseHandle(hFile);
return;
}
//把文件数据映射到进程的地址空间
void* pvFile=MapViewOfFile(
hMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,
0,
0,
0);
unsigned char *p=(unsigned char*)pvFile;
//至此,就获得了外部文件data.dat在内存地址空间的映射,
//下面就可以用指针p"折磨"这个文件了
CString s;
p[size_low-1]=0x1f;
p[size_low-2]=0x2f; //修改该文件的最后两个字节(文件大小<4GB高32位为0)
s.Format("%#x,%#x,%#x",p[size_low-3],p[size_low-2],p[size_low-1]);
//读文件的最后3个字节
AfxMessageBox(s);
//结束
UnmapViewOfFile(pvFile); //撤销映射
CloseHandle(hFile); //关闭文件
VC 6.0内存文件映射
vc文件操作,内存映射- vc学习
vc文件操作,内存映??- vc学习
vc文件操作,内存映??- vc学习??
vc文件操作,内存映??- vc学习(非常好)
文件映射mapviewoffile
VC项目文件说明
VC的文件扩展名
VC项目文件说明
VC++中(.def) 文件
通过XDoclet(ant)生成Hibernate映射文件
VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏
VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏
VC++内存泄漏定位(依赖MFC)
VC中生成汇编文件
VC 的工程文件说明
Eclipse快速上手Hibernate--2.利用Hbm映射文件开发
Eclipse快速上手Hibernate--2. 利用Hbm映射文件开发
使用MiddleGen产生hibernate的数据库表映射文件
用MiddleGen 产生hibernate的数据库表映射文件
ANT+Xdoclet自动生成Hibernate配置文件\映射文件(正确)
hibernate 映射文件 schema catalog 参数 导致的问题 - Java...
如何用VC编写dll文件
vc中常用文件操作(转载)