⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filesimulate.cpp

📁 调用windows的api
💻 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 + -