作業系統實驗9 採用非同步方式實現檔案讀/寫
阿新 • • 發佈:2020-12-15
技術標籤:課程學習記錄
實驗9 採用非同步方式實現檔案讀/寫
一、實驗目的
(1)瞭解Windows系統非同步檔案讀/寫的概念。
(2)熟悉Windows系統檔案讀/寫相關的API。
(3)掌握採用非同步方式實現檔案讀/寫的相關引數設定。
二、實驗準備
檔案非同步傳輸基本原理: 檔案非同步傳輸是一種改變指令執行順序的機制。一般而言,指令是順序執行的,下一條指令必須在上一條指令執行完畢才可執行 GetOverlappedResult() 返回指定檔案 GetLastError() 獲取錯誤資訊 CreateFile( ) 檔案建立:用於建立一個新檔案,如果檔案已經存在,則得到該檔案的控制代碼。採用非同步方式對檔案進行操作,引數dwFlagsAndAttiibutes選用FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED Readfile( ) 讀檔案:從檔案指標指示的位置開始讀取檔案中的資料 WriteFile ( ) 寫檔案:將資料寫入檔案 CloseHandle() 關閉檔案控制代碼:關閉與檔案相關的控制代碼,其作用與釋放動態申請的記憶體空間類似, 這樣可以釋放系統資源,使程序安全執行。
三、實驗內容
(一)實驗內容
建立一個函式,使用該函式將原檔案source.txt中的內容讀出。再寫到目標檔案overlapped.txt中去。
(二)主要程式碼
// zuoye09.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "zuoye09.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","overlapped.txt");
return nRetCode;
}
void FileReadWrite_Overlapped(char *source,char *destination)
{ HANDLE handle_src,handle_dst;
DWORD NumberOfByteRead,NumberOfByteWrite,Error;
bool cycle;
char *buffer;
buffer=buf;
OVERLAPPED overlapped;
//建立檔案source.txt
handle_src=CreateFile(source,
GENERIC_READ,
0,
NULL,
OPEN_ALWAYS,
//採用非同步方式對檔案進行操作,引數dwFlagsAndAttiibutes選用FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED
FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED,
NULL);
//建立檔案overlapped.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;
overlapped.hEvent=NULL;
overlapped.Offset=-BufferSize;
overlapped.OffsetHigh=0;
while (cycle)
{
overlapped.Offset= overlapped.Offset+BufferSize;
NumberOfByteRead=BufferSize;
//讀取檔案source.txt
if (!ReadFile(handle_src,buffer,NumberOfByteRead,&NumberOfByteRead,&overlapped))
{
switch(Error = GetLastError())
{
case ERROR_HANDLE_EOF: //若到檔案尾
cycle=false;
break;
case ERROR_IO_PENDING: //若程序掛起
if(!GetOverlappedResult(handle_src,&overlapped,&NumberOfByteRead,true))
{
printf("GetOverlappedResult!%d\n",GetLastError());
exit(1);
}
break;
default:
break;
}
}
if(NumberOfByteRead<BufferSize) cycle=false;
//寫入檔案overlapped.txt
if(!WriteFile(handle_dst,buffer,NumberOfByteRead,&NumberOfByteWrite,NULL))
{
寫入檔案overlapped.txt失敗
printf("Write File Error! %d\n",GetLastError());
exit(1);
}
}
//關閉檔案控制代碼("source.txt","overlapped.txt")
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
四、實驗結果與總結
由於要採用非同步方式對檔案進行操作,在使用函式CreateFile()建立檔案時其引數dwFlagsAndAttributes
選用FILE-FLAG_NO_BUFFERING| FILE-FLAG_OVERLAPPED。
因建立檔案source.txt語句中dwCreationDisposition引數為OPEN_EXISTING,即開啟已存在檔案,若檔案不存在,
則該函式開啟失敗。所以首先應該手動建立source.txt檔案,source.txt檔案建立後新增些文字資訊如“實驗9 採用非同步方式實現檔案讀/寫”
程式執行完後,開啟overlapped.txt,發現overlapped.txt中內容和source.txt中內容完全一致,如下圖所示。
該試驗完成非同步方式的檔案讀/寫操作。先建立兩個檔案即source.txt和overlapped.txt,然後反覆從檔案
source.txt中讀取資料塊,並寫到overlapped.txt中去,直到檔案尾結束。