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

📄 filesystem.cpp

📁 操作系统实验 模拟操作系统文件管理 实现文件系统
💻 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 + -