文档章节

内存映射文件处理大文件

我爱睡觉
 我爱睡觉
发布于 2017/06/24 17:37
字数 276
阅读 5
收藏 0
bool DisposeBigFile( const string& strFilePath )
{
	// 创建文件对象
	bool bRet = false;
	HANDLE hFile = INVALID_HANDLE_VALUE;
	HANDLE hFileMap = NULL;
	do 
	{
		hFile = CreateFile(strFilePath.c_str(), GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (INVALID_HANDLE_VALUE == hFile)
		{
			TRACE("创建文件对象失败,错误代码:%d\r\n", GetLastError());
			break;
		}

		// 得到系统分配粒度
		SYSTEM_INFO stSysInfo;
		GetSystemInfo(&stSysInfo);
		DWORD dwGran = stSysInfo.dwAllocationGranularity;
		// 得到文件尺寸
		DWORD dwFileSizeHigh;
		__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
		qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
		if(0 == qwFileSize)
		{
			bRet = true;
			break;
		}

		// 创建文件映射对象
		hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
		if (NULL == hFileMap)
		{
			TRACE("创建文件映射对象失败,错误代码:%d\r\n", GetLastError());
			break;
		}

		// 偏移地址 
		__int64 qwFileOffset = 0;
		
		// 块大小
		DWORD dwBlockBytes = 1000 * dwGran;

		while (qwFileSize > 0)
		{
			if (qwFileSize < 1000 * dwGran)
			{
				dwBlockBytes = (DWORD)qwFileSize;
			}

			// 映射视图
			LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS, 
														(DWORD)(qwFileOffset >> 32),
														(DWORD)(qwFileOffset & 0xFFFFFFFF),
														dwBlockBytes);
			if (NULL == lpbMapAddress)
			{
				TRACE("映射文件映射失败,错误代码:%drn", GetLastError());
				break;
			}

			// 对映射的视图进行访问
			for(DWORD i = 0; i < dwBlockBytes; i++)
			{
				BYTE lpbytetemp = *(lpbMapAddress + i);
			}

			// 撤消文件映像
			UnmapViewOfFile(lpbMapAddress);

			// 修正参数
			qwFileOffset += dwBlockBytes;
			qwFileSize -= dwBlockBytes;
		}

		if(qwFileSize <= 0)
		{
			bRet = true;
		}
	} while (false);
	
	if(NULL != hFileMap)
	{
		// 关闭文件映射对象句柄
		CloseHandle(hFileMap);
		hFileMap = NULL;
	}

	if(INVALID_HANDLE_VALUE != hFile)
	{
		// 关闭文件对象
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
	}
	return bRet;
}


本文转载自:http://blog.csdn.net/zhangmiaoping23/article/details/8688159

我爱睡觉
粉丝 3
博文 2120
码字总数 0
作品 0
南昌
私信 提问
使用内存映射文件读写大文件  

  文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类。一般来说,这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几...

follitude
2016/09/21
63
0
C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫
2018/06/22
49
0
VC中用内存映射文件处理大文件

引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,...

鉴客
2011/08/22
4.4K
2
Java 中使用内存映射文件需要考虑的 10 个问题

java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只...

oschina
2013/11/18
11.8K
11
Thinking in java(内存映射文件)

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验。 package ...

soul_mate
2015/02/27
128
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部