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