操作系统实验8 采用高速缓存实现文件读写

本文档详细介绍了如何在操作系统实验中利用高速缓存进行文件的读写操作,包括实验目的、准备工作、具体实验内容及主要代码实现,并对实验结果进行了总结。

实验8 采用高速缓存实现文件读写

一、实验目的

(1)了解windows系统文件高速缓存的概念。
(2)熟悉windows系统文件读写相关API。
(3)掌握采用缓冲方式实现文件读写相关参数的设置。

二、实验准备

 CreateFile( )        文件创建:用于创建一个新文件,如果文件已经存在,则得到该文件的句柄。采用高速缓存进行文件操作,参数dwFlagsAndAttiibutes选用FILE_FLAG_SEQUENT_SCAN。
 Readfile( )          读文件:从文件指针指示的位置开始读取文件中的数据
 WriteFile ( )        写文件:将数据写入文件
 CloseHandle()        关闭文件句柄:关闭与文件相关的句柄,其作用与释放动态申请的内存空间类似,
                      这样可以释放系统资源,使进程安全运行。

三、实验内容

(一)实验内容

  建立一个函数,使用该函数将源文件source.txt中的内容读出,再写到目标文件sequential.txt中去。

(二)主要代码

// zuoye08.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "zuoye08.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DWORD BufferSize=1024;
char buf[1024];

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;
void FileReadWrite_Overlapped(char *source,char *destination);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{   int nRetCode=0;
	printf("Call FileReadWrite_Overlapped!\n");
	//调用FileReadWrite_Overlapped(char *source,char *destination)函数
	FileReadWrite_Overlapped("source.txt","sequential.txt");
	return nRetCode;
}
void FileReadWrite_Overlapped(char *source,char *destination)
{   HANDLE handle_src,handle_dst;
	DWORD NumberOfByteRead,NumberOfByteWrite;
	bool cycle;
	char *buffer;
	buffer=buf;	
	//建立文件source.txt
	handle_src=CreateFile(source,
				GENERIC_READ,
				0,
				NULL,
				OPEN_EXISTING,
				//采用高速缓存进行文件操作,参数dwFlagsAndAttiibutes选用FILE_FLAG_SEQUENT_SCAN。
				FILE_FLAG_SEQUENTIAL_SCAN,
				NULL);
	//建立文件sequential.txt
	handle_dst=CreateFile(destination,
				GENERIC_WRITE,
				NULL,
				NULL,
				CREATE_ALWAYS,
				NULL,
				NULL);
	//判断文件是否创建失败,若失败打印输出提示信息并退出
	if (handle_src==INVALID_HANDLE_VALUE||handle_dst==INVALID_HANDLE_VALUE)
	{    
		 printf("File Create Fail!\n");
		 exit(1);
	}
	cycle=true;

	while (cycle)
    {
		NumberOfByteRead=BufferSize;
		//读取文件source.txt
		if (!ReadFile(handle_src,buffer,NumberOfByteRead,& NumberOfByteRead,NULL))
		{
			//读取文件source.txt失败
			printf("read File Error! %d\n",GetLastError());
	    	exit(1);
		}
		if(NumberOfByteRead<BufferSize) cycle=false;
		//写入文件sequential.txt
		if(!WriteFile(handle_dst,buffer,NumberOfByteRead,&NumberOfByteWrite,NULL)) 
		{
			////写入文件sequential.txt失败
			printf("Write File Error! %d\n",GetLastError());
		    exit(1);
		}
	}
	//关闭文件句柄("source.txt","sequential.txt")
	CloseHandle(handle_src);
	CloseHandle(handle_dst);
}

四、实验结果与总结

    本实验与实验七无缓冲方式实现文件读写大体上一致,但是由于要采用高速缓存进行文件操作,在使用函数
Createfile()建立文件时,其参数dwFlagsAndAttiibutes应选用FILE_FLAG_SEQUENT_SCAN。
     一开始成功运行程序没有source.txt文件,后找到原因,即在建立文件source.txt语句中dwCreationDisposition
参数为OPEN_EXISTING,即打开已存在文件,若文件不存在,则该函数打开失败。所以首先应该手动建立source.txt文件,
之后在source.txt中添加些文字信息如“实验8 采用高速缓存实现文件读写”程序运行完后,打开sequential.txt,
发现其内容和source.txt中内容完全一致,如下图所示。
    该实验完成高速缓存方式的文件读写操作。先创建两个文件,即source.txt和sequential.txt,
然后反复从文件source.txt中读出数据块,并写到文件sequential.txt中去,直到文件尾为止。   

image

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值