📄 异步读写文件测试.cpp
字号:
//异步方式读写文件测试
//作者:马俊
#include<windows.h>
#include<iostream.h>
#define BUF_SIZE 1024*10 //缓冲区大小
//数据处理
void DoDataPro(BYTE *pbBuf,DWORD bufsize)
{
for(DWORD i;i<=bufsize;i++)
{
pbBuf[i]--;
pbBuf[i]++;
}
}
//普通方式,返回运行时间
long filter_normal(char *source,char *sink,int f)
{
HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
BYTE *pbBuf = new BYTE[BUF_SIZE];
BYTE *readBuf = new BYTE[BUF_SIZE];
BYTE *writeBuf = new BYTE[BUF_SIZE];
DWORD FileSize;
DWORD bufsize=BUF_SIZE;
FileSize=GetFileSize(hFileR,&FileSize);
DWORD tim=GetTickCount(); //计算时间
for(int i=0 ; (i*BUF_SIZE) < FileSize ; i++)
{
if((FileSize-i*100)<BUF_SIZE)
bufsize=FileSize-i*BUF_SIZE;
ReadFile(hFileR,readBuf,bufsize,&bufsize,NULL);
//处理数据
memcpy(pbBuf,readBuf,BUF_SIZE);
for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
memcpy(writeBuf,pbBuf,BUF_SIZE);
WriteFile(hFileW,writeBuf,bufsize,&bufsize,NULL);
}
tim = GetTickCount()-tim;
CloseHandle(hFileR);
CloseHandle(hFileW);
delete pbBuf;
return tim;
}
//高速缓存方式,返回运行时间
long filter_high(char *source,char *sink,int f)
{
HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
BYTE *pbBuf = new BYTE[BUF_SIZE];
BYTE *readBuf = new BYTE[BUF_SIZE];
BYTE *writeBuf = new BYTE[BUF_SIZE];
DWORD FileSize;
DWORD bufsize=BUF_SIZE;
FileSize=GetFileSize(hFileR,&FileSize);
DWORD tim=GetTickCount(); //计算时间
for(int i=0 ; (i*BUF_SIZE) < FileSize ; i++)
{
if((FileSize-i*100)<BUF_SIZE)
bufsize=FileSize-i*BUF_SIZE;
ReadFile(hFileR,readBuf,bufsize,&bufsize,NULL);
//处理数据
memcpy(pbBuf,readBuf,BUF_SIZE);
for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
memcpy(writeBuf,pbBuf,BUF_SIZE);
WriteFile(hFileW,writeBuf,bufsize,&bufsize,NULL);
}
tim = GetTickCount()-tim;
CloseHandle(hFileR);
CloseHandle(hFileW);
delete pbBuf;
return tim;
}
//异步方式,返回运行时间
long filter_overlaped(char *source,char *sink,int f)
{
HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"read_event");
OVERLAPPED laped;
laped.Offset = 0;
laped.OffsetHigh = 0;
laped.hEvent = hEvent;
BYTE *pbBuf = new BYTE[BUF_SIZE];
BYTE *readBuf = new BYTE[BUF_SIZE];
BYTE *writeBuf = new BYTE[BUF_SIZE];
DWORD FileSize;
DWORD bufedsize;
DWORD bufsize=BUF_SIZE;
FileSize=GetFileSize(hFileR,&FileSize);
if(FileSize < BUF_SIZE) bufsize=FileSize;
DWORD tim=GetTickCount(); //计算时间
ReadFile(hFileR,readBuf,bufsize,&bufedsize,&laped);
memcpy(pbBuf,readBuf,bufsize);
for(long i=1 ; i*BUF_SIZE < FileSize ; i++)
{
//读文件单元
WaitForSingleObject(hEvent,INFINITE);
laped.Offset = i * (BUF_SIZE);
if((FileSize-(i*BUF_SIZE)) < BUF_SIZE) bufsize=FileSize-(i*BUF_SIZE);
ReadFile(hFileR,readBuf,bufsize,&bufedsize,&laped);
//读文件同时处理数据
for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
memcpy(writeBuf,pbBuf,BUF_SIZE);
//写文件单元
WaitForSingleObject(hEvent,INFINITE);
laped.Offset = (i-1) * BUF_SIZE;
WriteFile(hFileW,writeBuf,BUF_SIZE,&bufedsize,&laped);
memcpy(pbBuf,readBuf,BUF_SIZE);
}
DoDataPro(pbBuf,BUF_SIZE);
memcpy(writeBuf,pbBuf,BUF_SIZE);
WaitForSingleObject(hEvent,INFINITE);
laped.Offset = (i-1) * BUF_SIZE;
WriteFile(hFileW,writeBuf,bufsize,&bufedsize,&laped);
tim = GetTickCount()-tim;
//释放单元
CloseHandle(hEvent);
CloseHandle(hFileR);
CloseHandle(hFileW);
delete readBuf;
delete writeBuf;
delete pbBuf;
return tim;
}
void main()
{
cout <<"文件测试程序: "<<" copying D:\\testfile.rar..."<<endl;
cout <<"测试文件:D:\\testfile.rar , size : 51.2 MB."<<endl;
cout <<"异步:"<<filter_overlaped("D:\\testfile.rar","D:\\testfile3.rar",0)<<"ms"<<endl;
cout <<"同步(高速缓存):"<<filter_high("D:\\testfile.rar","D:\\testfile2.rar",0)<<"ms"<<endl;
cout <<"同步:"<<filter_normal("D:\\testfile.rar","D:\\testfile1.rar",0)<<"ms"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -