1. 程式人生 > >Windows API一日一練 54 WriteFile和ReadFile函式

Windows API一日一練 54 WriteFile和ReadFile函式

讀寫檔案是每個 Windows 軟體開發人員都需要做的工作。可見這項工作是非常重要的,畢竟各種各樣的資料都需要儲存起來,以便作各種各樣的分析,或者通過網路傳送給別人。像大家用 BT 下載的電影,在那個 BT 軟體裡,就需要不斷從網路裡接收到資料,然後再把這些資料儲存到檔案裡合適的位置,就可以生成跟發行者那裡一樣的檔案,這樣才可以播放出來。又比如我在玩《征途》的遊戲裡,剛剛開啟遊戲時,它就不斷從伺服器上下載更新的檔案下來,然後儲存到硬碟。 WriteFile 函式是用來寫資料到檔案, ReadFile 函式是從檔案裡讀取資料出來。但這兩個函式不但可以讀取寫磁碟的檔案,也可以接收和傳送網路的資料,還有讀寫串列埠、
USB 、並口等裝置的資料。在讀寫檔案裡,首先就是先開啟檔案,然後判斷開啟是否成功。在寫檔案時,同時要注意磁碟的空間是否滿等問題。在讀取檔案時,往往需要讀取不同位置的檔案,比如要讀取一個 4G 的視訊檔案,就不可能完全把它讀取到記憶體裡,因此就需要對檔案進行定位讀取。   函式 WriteFile ReadFile 宣告如下: WINBASEAPI BOOL WINAPI WriteFile(     __in        HANDLE hFile,
    __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,     __in        DWORD nNumberOfBytesToWrite,     __out_opt   LPDWORD lpNumberOfBytesWritten,     __inout_opt LPOVERLAPPED lpOverlapped
    );     WINBASEAPI BOOL WINAPI ReadFile(     __in        HANDLE hFile,     __out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,     __in        DWORD nNumberOfBytesToRead,     __out_opt   LPDWORD lpNumberOfBytesRead,     __inout_opt LPOVERLAPPED lpOverlapped     );   hFile 是檔案控制代碼。 lpBuffer 是讀寫資料緩衝區。 nNumberOfBytesToWrite 是多少資料要寫入。 lpNumberOfBytesWritten 是已經寫入多少資料。 nNumberOfBytesToRead 是多少資料要讀取。 nNumberOfBytesToRead 是已經讀取多少資料。 lpOverlapped 是非同步讀寫的結構。     呼叫函式的例子如下: #001  // 建立、寫入、讀取檔案。 #002  // 蔡軍生  2007/10/21 QQ:9073204 深圳 #003  void CreateFileDemo(void) #004  { #005         // #006         HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"),     // 建立檔案的名稱。 #007               GENERIC_WRITE|GENERIC_READ,          // 寫和讀檔案。 #008               0,                      // 不共享讀寫。 #009               NULL,                   // 預設安全屬性。 #010               CREATE_ALWAYS,          // 如果檔案存在,也建立。 #011               FILE_ATTRIBUTE_NORMAL, // 一般的檔案。        #012               NULL);                 // 模板檔案為空。 #013  #014         if (hFile == INVALID_HANDLE_VALUE) #015         { #016               // #017               OutputDebugString(_T("CreateFile fail!/r/n")); #018         } #019  #020         // 往檔案裡寫資料。 #021         const int BUFSIZE = 4096; #022         char chBuffer[BUFSIZE];          #023         memcpy(chBuffer,"Test",4); #024         DWORD dwWritenSize = 0; #025        BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL); #026         if (bRet) #027         { #028               // #029               OutputDebugString(_T("WriteFile 寫檔案成功 /r/n")); #030         } #031  #032         // 先把寫檔案緩衝區的資料強制寫入磁碟。 #033         FlushFileBuffers(hFile); #034  #035         // #036         // 從檔案裡讀取資料。 #037         LONG lDistance = 0; #038         DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN); #039         if (dwPtr == INVALID_SET_FILE_POINTER) #040         { #041               // 獲取出錯碼。 #042               DWORD dwError = GetLastError() ; #043               // 處理出錯。             #044         } #045  #046         DWORD dwReadSize = 0; #047        bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL); #048         if (bRet) #049         { #050               // #051               OutputDebugString(_T("ReadFile 讀檔案成功 /r/n")); #052         } #053         else #054         { #055               // 獲取出錯碼。 #056               DWORD dwError = GetLastError(); #057               // 處理出錯。             #058               TCHAR chErrorBuf[1024]; #059               wsprintf(chErrorBuf,_T("GetLastError()=%d/r/n"),dwError); #060               OutputDebugString(chErrorBuf); #061         } #062  #063  }

 

 

 

跟老菜鳥學C++

http://edu.csdn.net/course/detail/2901

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net