?? filesystem.cpp
字號:
/*****************************************************************
/*
/*****************************************************************
/*-------------------------------------------------------------
/*三種模式
/* 1. FILE_FLAG_NOBUFFER
/* 2. FILE_FLAG_SEQUENTIAL_SCAN
/* 3. FILE_FLAG_BUFFERING|FILE_FLAG_OVERLAPPED
/*------------------------------------------------------------
/*五種操作
/* 1. charactor +1
/* 2. charactor -1
/* 3. charactor -32
/* 4. charactor +32
/* 5. charactor *1
/*---------------------------------------------------------------
*/
#include<iostream.h>
#include<windows.h>
//三種模式
void filter_nobuffer(char* source,char* sink,void (*func)(char* addr));
void filter_sequen(char* source,char* sink,void (*func)(char* addr));
void filter_overlp(char* source,char* sink,void (*func)(char* addr));
//五種不同功能的操作
void f1(char* addr);
void f2(char* addr);
void f3(char* addr);
void f4(char* addr);
void f5(char* addr);
#define BUFFER_SIZE 1024 //定義緩沖區的大小,這里設為1024字節
char* buffer; //這里的緩沖區被定義成char型
void main()
{
//分配緩沖區
buffer = new char[BUFFER_SIZE];
//記錄執行filter函數的開始時間
DWORD tick;
//用于三種模式各自的平均時間
DWORD nobuffer_average_time = 0;
DWORD sequen_average_time = 0;
DWORD overlp_average_time = 0;
//采用無緩存模式調用filter函數10次
cout<<"*無文件高速緩存模式正在運行......"<<endl;
DWORD nobuffer_start_time = GetTickCount();
tick = nobuffer_start_time;
filter_nobuffer("source.txt","nobuffer_1.txt",f1);
cout<<"nobuffer 0-1:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_1.txt","nobuffer_2.txt",f2);
cout<<"nobuffer 1-2:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_2.txt","nobuffer_3.txt",f3);
cout<<"nobuffer 2-3:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_3.txt","nobuffer_4.txt",f4);
cout<<"nobuffer 3-4:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_4.txt","nobuffer_5.txt",f5);
cout<<"nobuffer 4-5:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_5.txt","nobuffer_6.txt",f1);
cout<<"nobuffer 5-6:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_6.txt","nobuffer_7.txt",f2);
cout<<"nobuffer 6-7:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_7.txt","nobuffer_8.txt",f3);
cout<<"nobuffer 7-8:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_8.txt","nobuffer_9.txt",f4);
cout<<"nobuffer 8-9:"<<GetTickCount()-tick<<" ms."<<endl;
tick = GetTickCount();
filter_nobuffer("nobuffer_9.txt","nobuffer_10.txt",f5);
DWORD nobuffer_end_time = GetTickCount();
cout<<"nobuffer 9-10:"<<nobuffer_end_time - tick<<" ms."<<endl;
//采用高速緩存模式調用filter函數10次
cout<<"*使用文件高速緩存模式正在運行......"<<endl;
DWORD sequen_start_time = GetTickCount();
tick = sequen_start_time;
filter_sequen("source.txt","sequen_1.txt",f1);
cout<<"sequen 0-1:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_1.txt","sequen_2.txt",f2);
cout<<"sequen 1-2:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_2.txt","sequen_3.txt",f3);
cout<<"sequen 2-3:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_3.txt","sequen_4.txt",f4);
cout<<"sequen 3-4:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_4.txt","sequen_5.txt",f5);
cout<<"sequen 4-5:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_5.txt","sequen_6.txt",f1);
cout<<"sequen 5-6:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_6.txt","sequen_7.txt",f2);
cout<<"sequen 6-7:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_7.txt","sequen_8.txt",f3);
cout<<"sequen 7-8:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_8.txt","sequen_9.txt",f4);
cout<<"sequen 8-9:"<<GetTickCount() - tick <<" ms. "<<endl;
tick = GetTickCount();
filter_sequen("sequen_9.txt","sequen_10.txt",f5);
DWORD sequen_end_time = GetTickCount();
cout<<"sequen 9-10:"<<sequen_end_time - tick <<" ms. "<<endl;
//采用異步模式調用filter函數10次
cout<<"異步傳輸模式正在運行......"<<endl;
DWORD overlp_start_time = GetTickCount();
tick = overlp_start_time;
filter_overlp("source.txt","overlp_1.txt",f1);
cout<<"overlp 0-1:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_1.txt","overlp_2.txt",f2);
cout<<"overlp 1-2:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_2.txt","overlp_3.txt",f3);
cout<<"overlp 2-3:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_3.txt","overlp_4.txt",f4);
cout<<"overlp 3-4:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_4.txt","overlp_5.txt",f5);
cout<<"overlp 4-5:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_5.txt","overlp_6.txt",f1);
cout<<"overlp 5-6:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_6.txt","overlp_7.txt",f2);
cout<<"overlp 6-7:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_7.txt","overlp_8.txt",f3);
cout<<"overlp 7-8:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_8.txt","overlp_9.txt",f4);
cout<<"overlp 8-9:"<<GetTickCount() - tick<<" ms."<<endl;
tick = GetTickCount();
filter_overlp("overlp_9.txt","overlp_10.txt",f5);
DWORD overlp_end_time = GetTickCount();
cout<<"overlp 9-10:"<<overlp_end_time - tick<<" ms."<<endl;
//輸出三種模式下的平均時間以做對比
cout<<"*三種模式的平均用時如下:"<<endl;
cout<<".無模式高速緩存模式平均用時:"<<(nobuffer_end_time - nobuffer_start_time)/10 <<" ms."<<endl;
cout<<".使用文件高速緩存模式平均用時:"<<(sequen_end_time - sequen_start_time)/10 <<" ms."<<endl;
cout<<".異步傳輸模式平均用時:"<<(overlp_end_time - overlp_start_time)/10 <<" ms."<<endl<<endl;
return;
}
/*------------------------------------------------------------------*/
//對文件內容進行的5種操作
//f1 +1
//f2 -1
//f3 *1
//f4 >>
//f5 <<
void f1(char* addr) {*addr = (unsigned char)*addr +1;}
void f2(char* addr) {*addr = (unsigned char)*addr -1;}
void f3(char* addr) {*addr = (unsigned char)*addr *1;}
void f4(char* addr) {*addr = (unsigned char)*addr >>1;}
void f5(char* addr) {*addr = (unsigned char)*addr <<1;}
/*-------------------------------------------------------------*/
//沒有文件高速緩存的filter函數
void filter_nobuffer(char* source,char* sink, void(*func)(char* addr))
{
HANDLE handle_src,handle_dst; //定義原文件與目標文件的句柄
BOOL cycle; //用來判斷一個緩沖區是否被寫滿
DWORD NumberOfBytesRead,NumberOfBytesWrite,index; //讀的字節數、寫的字節數
//打開原文件
handle_src = CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
//創建目標文件
handle_dst = CreateFile(sink,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);
if(handle_src == INVALID_HANDLE_VALUE||handle_dst == INVALID_HANDLE_VALUE)
{
cout<<"CreatFile Invocation Error!"<<endl;
exit(1);
}
cycle = TRUE;
//用來cycle判斷文件什么時候讀完
while(cycle)
{
//從原文件讀數據送入緩沖區
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,NULL) == FALSE)
{
cout<<"ReadFile Error!"<<endl;
exit(1);
}
//當讀不滿一個緩沖區時,說明達到文件末尾,結束循環
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
//對文件內容進行的操作
for(index = 0;index < NumberOfBytesRead;index++)
func(&buffer[index]);
//將緩沖區中的數據寫入目標文件
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,NULL) == FALSE)
{
cout<<"WriteFile Error!"<<endl;
exit(1);
}
}
//關閉文件句柄
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
/*-------------------------------------------------------------*/
void filter_sequen(char* source,char* sink, void(*func)(char* addr))
{
HANDLE handle_src,handle_dst; //定義原文件與目標文件的句柄
BOOL cycle; //用來判斷一個緩沖區是否被寫滿
DWORD NumberOfBytesRead,NumberOfBytesWrite,index; //讀的字節數、寫的字節數
//打開原文件
handle_src = CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
//創建目標文件
handle_dst = CreateFile(sink,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(handle_src == INVALID_HANDLE_VALUE||handle_dst == INVALID_HANDLE_VALUE)
{
cout<<"CreatFile Invocation Error!"<<endl;
exit(1);
}
cycle = TRUE;
//用來cycle判斷文件什么時候讀完
while(cycle)
{
//從原文件讀數據送入緩沖區
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,NULL) == FALSE)
{
cout<<"ReadFile Error!"<<endl;
exit(1);
}
//當讀不滿一個緩沖區時,說明達到文件末尾,結束循環
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
//對文件內容進行的操作
for(index = 0;index < NumberOfBytesRead;index++)
func(&buffer[index]);
//將緩沖區中的數據寫入目標文件
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,NULL) == FALSE)
{
cout<<"WriteFile Error!"<<endl;
exit(1);
}
}
//關閉文件句柄
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
/*-------------------------------------------------------------*/
void filter_overlp(char* source,char* sink, void(*func)(char* addr))
{
HANDLE handle_src,handle_dst; //定義原文件與目標文件的句柄
BOOL cycle; //用來判斷一個緩沖區是否被寫滿
DWORD NumberOfBytesRead,NumberOfBytesWrite,index,dwError; //讀的字節數、寫的字節數
OVERLAPPED overlapped; //overlapped 結構
//打開原文件
handle_src = CreateFile(source,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED,NULL);
//創建目標文件
handle_dst = CreateFile(sink,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);
if(handle_src == INVALID_HANDLE_VALUE||handle_dst == INVALID_HANDLE_VALUE)
{
cout<<"CreatFile Invocation Error!"<<endl;
exit(1);
}
cycle = TRUE;
//對overlapped結構初始化
overlapped.hEvent = NULL;
overlapped.Offset = -BUFFER_SIZE;
overlapped.OffsetHigh = 0;
//用來cycle判斷文件什么時候讀完
while(cycle)
{
//計算文件的偏移量
overlapped.Offset = overlapped.Offset + BUFFER_SIZE;
//從原文件讀數據送入緩沖區
if(ReadFile(handle_src,buffer,BUFFER_SIZE,&NumberOfBytesRead,&overlapped) == FALSE)
{
switch(dwError = GetLastError())
{
//讀文件結尾
case ERROR_HANDLE_EOF:
cycle = FALSE;
break;
case ERROR_IO_PENDING:
if(GetOverlappedResult(handle_src,&overlapped,&NumberOfBytesRead,TRUE) == FALSE)
{
cout<<"GetOverlappedResult Error!"<<endl;
exit(1);
}
break;
default:
break;
}
}
//當不滿一個個緩存區時,說明達到文件末尾,結束循環
if(NumberOfBytesRead < BUFFER_SIZE)
cycle = FALSE;
//對文件內容進行的操作
for(index = 0;index < NumberOfBytesRead;index++)
func(&buffer[index]);
//將緩沖區中的數據寫入目標文件
if(WriteFile(handle_dst,buffer,NumberOfBytesRead,&NumberOfBytesWrite,NULL) == FALSE)
{
cout<<"WriteFile Error!"<<endl;
exit(1);
}
}
//關閉文件句柄
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
/************************THE END********************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -