?? filesystem.cpp
字號:
// 作者:鄭鐘武(20042104010)
//完成日期:2007.2.9
#include "stdafx.h"
#include <stdio.h>
#include <iostream.h>
#include <time.h>
#include <afx.h>
#include <windows.h>
//文件高速緩存模式
void FileMapCreate()
{
//打開文件
HANDLE hFile= CreateFile("source.txt",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hFile == INVALID_HANDLE_VALUE)//打開無效
{
cout<<"文件打開失敗!"<<endl;
return;
}
//創建內存映射文件
DWORD dwFileSize = GetFileSize(hFile,NULL);
HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,dwFileSize+sizeof(char),NULL);
if(hFileMap == NULL)
{
CloseHandle(hFile);
cout<<"內存映射文件創建失敗"<<endl;
return ;
}
//建立該文件到本進程地址空間的映射并保存到pBuf中
char* pBuf = (char*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
if(pBuf == NULL)
{
CloseHandle(hFileMap);
return;
}
//創建新目標文件
HANDLE hdstFile=CreateFile("MapDest.txt",GENERIC_WRITE|GENERIC_READ,0, NULL,CREATE_ALWAYS,
NULL,NULL);
if(hdstFile == INVALID_HANDLE_VALUE)
{
cout<<"寫入失敗,錯誤代碼為:"<<GetLastError()<<endl;
}
else
{
DWORD dwRead;
WriteFile(hdstFile,pBuf,strlen(pBuf),&dwRead, NULL); //寫入
}
CloseHandle(hdstFile);
CloseHandle(hFileMap);
UnmapViewOfFile(pBuf);//解除映射
CloseHandle(hFile);
}
//無緩存模式
void FileNoBufCreate()
{
//打開源文件
HANDLE hFile= CreateFile("source.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,NULL);
//創建新目標文件
HANDLE hdstFile=CreateFile("NoBufDest.txt",GENERIC_WRITE|GENERIC_READ,0, NULL,OPEN_ALWAYS,
NULL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
cout<<"文件打開失敗!"<<endl;
return;
}
if(hdstFile == INVALID_HANDLE_VALUE)
{
cout<<"文件創建失敗,錯誤代碼為:"<<GetLastError()<<endl;
}
DWORD dwRead;
DWORD dwWrite;
char *buf=new char[512];
do{
ReadFile(hFile,buf,512,&dwRead,NULL);
char *pBuf=new char[dwRead];
for(int i=0;i<dwRead;i++)
{
pBuf[i]=buf[i];
}
WriteFile(hdstFile,pBuf,strlen(pBuf),&dwWrite, NULL);//寫入
delete pBuf;
}while(dwRead==512);
delete buf;
CloseHandle(hFile);
CloseHandle(hdstFile);
}
//異步傳輸模式
void FileOverCreate()
{
//打開文件
HANDLE hFile= CreateFile("source.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED,NULL);
HANDLE hdstFile=CreateFile("OverlappedDest.txt",GENERIC_WRITE|GENERIC_READ,0, NULL,OPEN_ALWAYS,
NULL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
cout<<"文件打開失敗!"<<endl;
return;
}
if(hdstFile == INVALID_HANDLE_VALUE)
{
cout<<"文件創建失敗,錯誤代碼為:"<<GetLastError()<<endl;
return;
}
//地址重疊結構體
OVERLAPPED overlapped;
overlapped.hEvent=NULL;
overlapped.Offset=-512;
overlapped.OffsetHigh=0;
DWORD dwRead;
DWORD dwWrite;
char *buf=new char[512];
bool ready=true;
do{
overlapped.Offset += 512;//計算偏移量
if(ReadFile(hFile,buf,512,&dwRead,&overlapped)==false)
{
switch(GetLastError())
{
case ERROR_HANDLE_EOF://文件尾
ready=false;
break;
case ERROR_IO_PENDING://串口傳輸
if(GetOverlappedResult(hFile,&overlapped,&dwRead,true)==false)
{
return;
}
break;
default:
break;
}
}
char *pBuf=new char[dwRead];
for(int i=0;i<dwRead;i++)
{
pBuf[i]=buf[i];
}
WriteFile(hdstFile,pBuf,strlen(pBuf),&dwWrite, NULL);
delete pBuf;
}while(dwRead==512&&ready);
delete buf;
CloseHandle(hFile);
CloseHandle(hdstFile);
}
//刪除生成文件
void Release()
{
CFileFind fd;
if(fd.FindFile("MapDest.txt"))
{
DeleteFile("MapDest.txt");
}
if(fd.FindFile("NoBufDest.txt"))
{
DeleteFile("NoBufDest.txt");
}
if(fd.FindFile("OverlappedDest.txt"))
{
DeleteFile("OverlappedDest.txt");
}
}
//主程序入口
void main()
{
cout<<"本文件系統實驗結果決定于測試硬件配置和文件大小"<<endl;
cout<<endl;
cout<<"本實驗對一個1.3M的文件進行十次測試,平均時間如下(請等待):"<<endl;
bool cycle=true;
while(cycle)
{
DWORD starttime,endtime;
DWORD elasptime[3];
for(int i=0;i<3;i++)
elasptime[i]=0;
for(i=0;i<20;i++)
{
starttime=GetTickCount();
FileMapCreate();
endtime=GetTickCount();
elasptime[0]+=endtime-starttime;
starttime=GetTickCount();
FileNoBufCreate();
endtime=GetTickCount();
elasptime[1]+=endtime-starttime;
starttime=GetTickCount();
FileOverCreate();
endtime=GetTickCount();
elasptime[2]+=endtime-starttime;
}
cout<<"高速緩存模式:"<<elasptime[0]/20<<"毫秒"<<endl;
cout<<"無緩存模式:"<<elasptime[1]/20<<"毫秒"<<endl;
cout<<"異步傳輸模式"<<elasptime[2]/20<<"毫秒"<<endl;
cout<<"是否繼續測試(Y/N):"<<endl;
char choice;
cin>>choice;
if(choice=='N'||choice=='n')
{
cycle=false;
cout<<"正在退出!!"<<endl;
}
}
Release();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -