1. 程式人生 > >C/C++ 文件操作之CreateFile、ReadFile和WriteFile

C/C++ 文件操作之CreateFile、ReadFile和WriteFile

amp 列表 invalid bsp 功能 空間 out 系統 file

通常使用下列函數來通過Win系統來對外圍設備進行通信處理:

-------------------------------

1. CreateFile

  這個函數的功能是創建或者打開一個文件或者I/O設備,通常使用的I/O形式有文件、文件流、目錄、物理磁盤、卷、終端流等。如執行成功,則返回文件句柄。 INVALID_HANDLE_VALUE 表示出錯,會設置 GetLastError 。
  函數的聲明定義:

  HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,              
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);

參數列表:

技術分享

2. ReadFile

文件指針指向的位置(設備文件,通信)開始將數據讀出到一個文件中, 且支持同步和異步操作,如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際讀出文件的字節數保存到lpNumberOfBytesRead指明的地址空間中。FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作。
  函數聲明定義:

 BOOL WINAPI ReadFile(
  __in          HANDLE hFile,                   // 文件句柄
  __out         LPVOID lpBuffer,                //
接收數據用的 buffer __in DWORD nNumberOfBytesToRead, // 要讀取的字節數 __out LPDWORD lpNumberOfBytesRead, // 實際讀取到的字節數 __in LPOVERLAPPED lpOverlapped // OVERLAPPED 結構,一般設定為 NULL );

代碼示例:、

 1 BOOL Read(char *filePath)
 2 {
 3     HANDLE pFile;
 4     DWORD fileSize;
 5     char
*buffer,*tmpBuf; 6 DWORD dwBytesRead,dwBytesToRead,tmpLen; 7 8 pFile = CreateFile(filePath,GENERIC_READ, 9 FILE_SHARE_READ, 10 NULL, 11 OPEN_EXISTING, //打開已存在的文件 12 FILE_ATTRIBUTE_NORMAL, 13 NULL); 14   // 創建設備文件,返回文件的位置 15 if ( pFile == INVALID_HANDLE_VALUE) 16 { 17 printf("open file error!\n"); 18 CloseHandle(pFile); 19 return FALSE; 20 } 21    22 fileSize = GetFileSize(pFile,NULL); //得到文件的大小 23 24 buffer = (char *) malloc(fileSize); 25 ZeroMemory(buffer,fileSize); 26 dwBytesToRead = fileSize; 27 dwBytesRead = 0; 28 tmpBuf = buffer; 29 30 do{ //循環讀文件,確保讀出完整的文件 31 32 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL); 33 34 if (dwBytesRead == 0) 35 break; 36 37 dwBytesToRead -= dwBytesRead; 38 tmpBuf += dwBytesRead; 39 40 } while (dwBytesToRead > 0); 41 42 // TODO 處理讀到的數據 buffer 43 44 free(buffer); 45 CloseHandle(pFile); 46 47 return TRUE; 48 }

3. WriteFile

  將數據寫入一個文件(設備文件,通信)。該函數比fwrite函數要靈活的多。也可將這個函數應用於對通信設備、管道、套接字以及郵槽的處理。返回時,TRUE(非零)表示成功,否則返回零。會設置GetLastError。
函數聲明定義:

BOOL WINAPI WriteFile(
  __in          HANDLE hFile,                   // 文件句柄
  __in          LPCVOID lpBuffer,               // 要寫入的數據
  __in          DWORD nNumberOfBytesToWrite,    // 要寫入的字節數
  __out         LPDWORD lpNumberOfBytesWritten, // 實際寫入的字節數
  __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 結構,一般設定為 NULL
);

示例代碼:

 1 BOOL Write(char *buffer, DWORD contentLen)
 2 {
 3     HANDLE pFile;
 4     char *tmpBuf;
 5     DWORD dwBytesWrite,dwBytesToWrite;
 6 
 7     pFile = CreateFile(filePath,GENERIC_WRITE,          
 8         0,
 9         NULL,               
10         CREATE_ALWAYS,        //總是創建文件
11         FILE_ATTRIBUTE_NORMAL, 
12         NULL);
13 
14     if ( pFile == INVALID_HANDLE_VALUE)
15     {
16         printf("create file error!\n");
17         CloseHandle(pFile);
18         return FALSE;
19     }
20 
21     dwBytesToWrite = contentLen;
22     dwBytesWrite = 0;
23 
24     tmpBuf = buffer;
25 
26     do{                                       //循環寫文件,確保完整的文件被寫入  
27 
28         WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);
29 
30         dwBytesToWrite -= dwBytesWrite;
31         tmpBuf += dwBytesWrite;
32 
33         } while (dwBytesToWrite > 0);
34 
35     CloseHandle(pFile);
36 
37     return TRUE;
38 }

endl;

C/C++ 文件操作之CreateFile、ReadFile和WriteFile