?? filesimulate.cpp
字號:
#include <windows.h>
#include <iostream>
using namespace std;
//讀寫緩沖區,但不是文件模式的緩沖區
const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
//const int FILENUMBER = 11;
//用于存儲待處理的文件名,11個文件
/*
char fileName[21][256]={"file_0.txt","file_1.txt","file_2.txt",
"file_3.txt","file_4.txt","file_5.txt",
"file_6.txt","file_7.txt","file_8.txt",
"file_9.txt","file_10.txt","file_11.txt",
"file_12.txt","file_13.txt",
"file_14.txt","file_15.txt","file_16.txt",
"file_17.txt","file_18.txt","file_19.txt",
"file_20.txt"};
*/
//讀寫文件的三種模式
void filter_nobuffer (char* source, char* sink); //無緩沖區的文件讀寫
void filter_sequen (char* source, char* sink); //有緩沖區的文件讀寫
void filter_overlp (char* source, char* sink); //異步傳輸的文件讀寫
void main()
{
DWORD tick; //用于臨時記錄時間
DWORD nobuffer_time=0; //無緩沖區的文件讀寫所用時間
DWORD sequen_time=0; //有緩沖區的文件讀寫所用時間
DWORD overlp_time=0; //異步傳輸的文件讀寫所用時間
int i;
int count;
cout<<"輸入每次文件復制次數:";
while(cin>>count){
if(count==0)break;
//無緩沖區的文件讀寫10次
cout<<"無緩沖區的文件讀寫中...\n";
nobuffer_time = GetTickCount();
for(i=0;i<count;i++)
{
filter_nobuffer("manuscript.txt","copyfile.txt");
}
cout<<"無緩沖讀寫從 manuscript.txt 到 copyfile.txt 復制"<<count<<"次";
nobuffer_time = GetTickCount() - nobuffer_time;
cout<<"所用時間:"<< nobuffer_time<<"ms"<<endl<<endl;
//有緩沖區的文件讀寫10次
cout<<"有緩沖區的文件讀寫中...\n";
sequen_time = GetTickCount(); //開始計時
for(i=0;i<count;i++)
{
filter_sequen("manuscript.txt","copyfile.txt");
}
cout<<"有緩沖區讀寫從 manuscript.txt 到 copyfile.txt 復制"<<count<<"次";
sequen_time = GetTickCount() - sequen_time;
cout<<"所用時間:"<< sequen_time<<"ms"<<endl<<endl;
//異步傳輸的文件讀寫10次
cout<<"異步傳輸的文件讀寫中...\n";
overlp_time = GetTickCount();
for(i=0;i<count;i++)
{
filter_overlp("manuscript.txt","copyfile.txt");
}
cout<<"異步傳輸從 manuscript.txt 到 copyfile.txt 復制"<<count<<"次";
overlp_time = GetTickCount() - overlp_time;
cout<<"所用時間是"<< overlp_time<<"ms"<<endl<<endl;
cout<<"時間對比:\n"
<<"無緩沖區的文件讀寫: "<<nobuffer_time<<"ms\n"
<<"有緩沖區的文件讀寫: "<<sequen_time<<"ms\n"
<<"異步傳輸的文件讀寫: "<<overlp_time<<"ms\n";
cout<<"\n\n輸入每次文件復制次數:";
}
}
//無緩沖區的文件讀寫
void filter_nobuffer (char* source, char* denst)
{
HANDLE handle_src,
handle_dst;
BOOL cycle;
DWORD NumberOfBytesRead,
NumberOfBytesWrite;
//打開讀和寫的文件
handle_src=CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
handle_dst = CreateFile(denst,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);
if(handle_src==INVALID_HANDLE_VALUE||handle_dst==INVALID_HANDLE_VALUE)
{
cout<<"打開讀寫文件失敗!"<<endl;
return;
}
cycle = TRUE;
while(cycle)
{
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,NULL) == FALSE)
{
cout<<"讀文件錯誤!"<<endl;
exit(1);
}
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,NULL) == FALSE)
{
cout<<"寫入文件錯誤!"<<endl;
exit(1);
}
}
//cout<<"從"<<source<<" 到"<<denst<<"復制成功!\n";
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
//有緩沖區的文件讀寫
void filter_sequen (char* source, char* denst)
{
HANDLE handle_src,
handle_dst;
BOOL cycle;
DWORD NumberOfBytesRead,
NumberOfBytesWrite;
//打開讀和寫的文件
handle_src=CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
handle_dst = CreateFile(denst,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(handle_src==INVALID_HANDLE_VALUE||handle_dst==INVALID_HANDLE_VALUE)
{
cout<<"打開讀寫文件失敗!"<<endl;
return;
}
cycle = TRUE;
while(cycle)
{
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,NULL) == FALSE)
{
cout<<"讀文件錯誤!"<<endl;
exit(1);
}
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,NULL) == FALSE)
{
cout<<"寫入文件錯誤!"<<endl;
exit(1);
}
}
// cout<<"從"<<source<<" 到"<<denst<<"復制成功!\n";
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
//異步傳輸的文件讀寫
void filter_overlp (char* source, char* denst)
{
HANDLE handle_src,handle_dst;
BOOL cycle;
DWORD NumberOfBytesRead,NumberOfBytesWrite,index,dwError;
OVERLAPPED overlapped_read,
overlapped_write;
//打開讀和寫的文件
handle_src =CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
handle_dst=CreateFile(denst,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
if(handle_src ==INVALID_HANDLE_VALUE|| handle_dst == INVALID_HANDLE_VALUE)
{
cout<<"打開讀寫文件失敗!"<<endl;
return;
}
overlapped_read.hEvent=NULL;
overlapped_read.Offset=-BUFFER_SIZE;
overlapped_read.OffsetHigh=0;
//以下是把寫操作也運用異步傳輸所用
overlapped_write.hEvent=NULL;
overlapped_write.Offset=-BUFFER_SIZE;
overlapped_write.OffsetHigh=0;
cycle = TRUE;
while(cycle)
{
overlapped_read.Offset += BUFFER_SIZE;
overlapped_write.Offset += BUFFER_SIZE;
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,&overlapped_read) ==FALSE)
{
switch(dwError = GetLastError())
{
case ERROR_IO_PENDING:
if(GetOverlappedResult(handle_src,&overlapped_read,&NumberOfBytesRead,TRUE)
== FALSE)
{
cout<<"GetOverlappedResult 錯誤!"<<endl;
exit(1);
}
break;
default:
cycle = FALSE;
break;
}
/*cout<<"Mode 3:ReadFile Error!"<<endl;
exit(1); */
}
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,&overlapped_write)==FALSE)
{
cout<<"寫文件錯誤!"<<endl;
exit(1);
}
}
// cout<<"從"<<source<<" 到"<<denst<<"復制成功!\n";
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -