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