内存映射文件
来源:互联网 发布:魔域副本源码 编辑:程序博客网 时间:2024/06/05 16:14
内存映射文件主要能解决两个问题:应用程序对大文件的高速访问和进程间的文件共享(作为一种通信方式)。
下面是摘自百度百科的解释:
内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
记录一下使用内存映射文件实现对磁盘文件的读写:
// FileCopy.cpp : 定义控制台应用程序的入口点。//#include<stdio.h> #include<windows.h>#include<winioctl.h>#include<tchar.h>#include<Shlwapi.h>#include<math.h>#include<time.h>#include<string>using namespace std;//#pragma comment(lib,"Shlwapi.lib")//#pragma comment(lib,"Kernel32.lib")bool createFileWithSize(TCHAR* filename, LARGE_INTEGER filesize, bool initwithchar) {HANDLE hFile = INVALID_HANDLE_VALUE;HANDLE hFileMap = NULL;LARGE_INTEGER realSize;filesize.QuadPart = filesize.QuadPart * 1024 * 1024;//得到文件句柄hFile = CreateFile(filename, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);if (INVALID_HANDLE_VALUE == hFile) {printf("CreateFile Error : %d\n", GetLastError());CloseHandle(hFile);return FALSE;}//创建文件内存映射hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, filesize.HighPart, filesize.LowPart, NULL);if (NULL == hFileMap) {printf("CreateFileMapping Error : %d\n", GetLastError());CloseHandle(hFile);CloseHandle(hFileMap);return FALSE;}if (initwithchar) {//将文件映射对象映射到当前应用程序的地址空间,获取文件内存映射指针char* lpMapAddr = (char*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);ULONGLONG tempSize = filesize.QuadPart;if (!GetFileSizeEx(hFile, &realSize)) { printf("Get File Size error\n"); }else { printf("realSize is : %lldByte\n", realSize.QuadPart); tempSize = realSize.QuadPart; }srand((UINT)time(NULL));char *buf = (char*)malloc(sizeof(char) * 10);UINT blockSize = sizeof(char) * 10;for (; tempSize > 1; tempSize-=blockSize) {itoa(rand(), buf, 10);blockSize = tempSize < sizeof(char)*strlen(buf) ? tempSize : sizeof(char)*strlen(buf);memcpy(lpMapAddr, buf, blockSize);lpMapAddr += blockSize;}printf("initFile Success\n");UnmapViewOfFile(hFileMap);}printf("createFileWithSize Success\n");CloseHandle(hFileMap);CloseHandle(hFile);return TRUE;}int main(int argc, char *argv[]) {LARGE_INTEGER size;size.QuadPart = 50;wchar_t filename[] = L"F://rsfile.txt";createFileWithSize(filename, size, TRUE);return 0;}
阅读全文
0 0
- 内存映射:内存映射文件
- 内存映射:内存映射文件
- 内存映射文件
- 内存映射文件 续
- 内存映射文件 尾
- 内存映射文件
- 使用内存映射文件
- 内存映射文件
- 内存映射文件
- 内存映射文件技术
- 内存映射文件
- 内存映射文件
- 内存映射文件
- 内存映射文件
- 使用内存映射文件
- 内存映射文件技术
- 内存映射文件
- 内存映射文件
- UCGUI学习之路(2)移植
- Unity_ GetComponentsInChildren<T>(Bool includeInactive) 获取自己和它的孩子有同样的组件
- Effect(十五)—— EffectScript
- Android集成腾讯TIM-SDK登录超时的问题
- 在编写动态插入删除DOM元素时,Easyui控件渲染效果失败的问题
- 内存映射文件
- jmeter插件的使用-线程组
- QT之RAW转jpg
- leetcode题解-48. Rotate Image
- 表格新增行删除行以及复选框未勾选禁用表格行,以及省市区联动
- mybatis报错:There is no getter for property named 'logId' in 'class java.lang.String'
- jdbc、hibernate、MyBatis各自的优缺点以及区别
- Hadoop2.7.3+Hbase-1.2.6完全分布式安装部署
- matlab笔记