⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file_overlap.cpp

📁 从学案例入手
💻 CPP
字号:
// file_overlap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

/*

注意请保证存在文件c:\temp\large_file.dat,并且保证文件有130MB以上
如果不存在该文件可以使用
 copy a.dat /B + b.dat /B c.dat /B 
来将a.dat和b.dat合并为c.dat

*/



void DoDataDeal(BYTE *pbData,int iLen)
{//对字节进行操作
	Sleep(3*1000);//假设每次计算需要2秒钟
}
//下面是使用异步读的示范代码,假设c:\temp\large_file.dat文件有130MB大小()
//每次读入10MB字节,并且对文件中每个字节进行操作,由于可以使用异步操作所以可以在下一次读入数据的同时进行计算
void ReadM1(void)
{
	HANDLE hFile = CreateFile("c:\\temp\\large_file.dat",GENERIC_READ,0,
				NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,NULL);
	if( INVALID_HANDLE_VALUE != hFile )
	{
		HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"read_event");
		BYTE *pbRead = new BYTE[1024*1024*10];//10MB字节
		BYTE *pbBuf = new BYTE[1024*1024*10];
		DWORD dwRead,dwCount=0;
		OVERLAPPED overlap;
		overlap.Offset = 0;
		overlap.OffsetHigh =0;
		overlap.hEvent = hEvent;
		
		DWORD dwBegin= GetTickCount();//记录开始时间
		ReadFile(hFile,pbRead,1024*1024*10,&dwRead,&overlap);
		{//开始计算
			for(int i=1;i<13;i++)
			{
				printf("M1 i=%d\n",i);
				WaitForSingleObject(hEvent,INFINITE);//等待上一次完成
				memcpy(pbBuf,pbRead,1024*1024*10);
				overlap.Offset = i * (1024*1024*10);
				overlap.OffsetHigh =0;
				overlap.hEvent = hEvent;
				ReadFile(hFile,pbRead,1024*1024*10,&dwRead,&overlap);
				//在文件进行读的同时进行计算
				DoDataDeal(pbBuf,1024*1024*10);
			}
			WaitForSingleObject(hEvent,INFINITE);//等待最后一次完成
			memcpy(pbBuf,pbRead,1024*1024*10);
			//数据处理
			DoDataDeal(pbBuf,1024*1024*10);
		}//结束计算
		printf("耗时 %d\n",GetTickCount()-dwBegin);
		printf("result %d\n",dwCount);
		//操作完成
		CloseHandle(hEvent);
		CloseHandle(hFile);
		delete pbRead;
		delete pbBuf;
	}
}
//下面是上面功能的文件同步读版本
void ReadM2(void)
{
	HANDLE hFile = CreateFile("c:\\temp\\large_file.dat",GENERIC_READ,0,
				NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if( INVALID_HANDLE_VALUE != hFile )
	{
		DWORD dwRead,dwCount=0;
		BYTE *pbRead = new BYTE[1024*1024*10];//10MB字节
		BYTE *pbBuf = new BYTE[1024*1024*10];//10MB字节
		
		DWORD dwBegin= GetTickCount();//记录开始时间
		for(int i=0;i<13;i++)
		{
			printf("M2 i=%d\n",i);
			if(!ReadFile(hFile,pbRead,1024*1024*10,&dwRead,NULL))
			{
				printf("error read");
				break;
			}
			memcpy(pbBuf,pbRead,1024*1024*10);
			//计算
			DoDataDeal(pbBuf,1024*1024*10);
		}
		printf("耗时 %d\n",GetTickCount()-dwBegin);
		printf("result %d\n",dwCount);
		//操作完成
		CloseHandle(hFile);
		delete pbRead;
		delete pbBuf;
	}
}

int main(int argc, char* argv[])
{
	ReadM2();
	ReadM1();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -