?? 異步讀寫文件測試.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 + -