实验8 采用高速缓存实现文件读写
一、实验目的
(1)了解windows系统文件高速缓存的概念。
(2)熟悉windows系统文件读写相关API。
(3)掌握采用缓冲方式实现文件读写相关参数的设置。
二、实验准备
CreateFile( ) 文件创建:用于创建一个新文件,如果文件已经存在,则得到该文件的句柄。采用高速缓存进行文件操作,参数dwFlagsAndAttiibutes选用FILE_FLAG_SEQUENT_SCAN。
Readfile( ) 读文件:从文件指针指示的位置开始读取文件中的数据
WriteFile ( ) 写文件:将数据写入文件
CloseHandle() 关闭文件句柄:关闭与文件相关的句柄,其作用与释放动态申请的内存空间类似,
这样可以释放系统资源,使进程安全运行。
三、实验内容
(一)实验内容
建立一个函数,使用该函数将源文件source.txt中的内容读出,再写到目标文件sequential.txt中去。
(二)主要代码
#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];
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("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;
handle_src=CreateFile(source,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
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;
if (!ReadFile(handle_src,buffer,NumberOfByteRead,& NumberOfByteRead,NULL))
{
printf("read File Error! %d\n",GetLastError());
exit(1);
}
if(NumberOfByteRead<BufferSize) cycle=false;
if(!WriteFile(handle_dst,buffer,NumberOfByteRead,&NumberOfByteWrite,NULL))
{
printf("Write File Error! %d\n",GetLastError());
exit(1);
}
}
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中去,直到文件尾为止。
