1. 程式人生 > 其它 >作業系統實驗9 採用非同步方式實現檔案讀/寫

作業系統實驗9 採用非同步方式實現檔案讀/寫

技術標籤:課程學習記錄

實驗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中去,直到檔案尾結束。

image