📄 file_overlap.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 + -