C/C++ 文件操作之CreateFile、ReadFile和WriteFile
生活随笔
收集整理的這篇文章主要介紹了
C/C++ 文件操作之CreateFile、ReadFile和WriteFile
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. CreateFile
這個函數的功能是創建或者打開一個文件或者I/O設備,通常使用的I/O形式有文件、文件流、目錄、物理磁盤、卷、終端流等。如執行成功,則返回文件句柄。 INVALID_HANDLE_VALUE 表示出錯,會設置 GetLastError 。?
函數的聲明定義:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
參數列表:
| lpFileName | String ,要打開的文件的名字 |
| dwDesiredAccess | Long ,如果為 GENERIC_READ 表示允許對設備進行讀訪問;如果為 GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果為零,表示只允許獲取與一個設備有關的信息 |
| dwShareMode | Long ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允許對文件進行共享訪問 |
| lpSecurityAttributes | SECURITY_ATTRIBUTES ,指向一個 SECURITY_ATTRIBUTES 結構的指針,定義了文件的安全特性(如果操作系統支持的話) |
| dwCreationDisposition | Long ,下述常數之一:CREATE_NEW 創建文件; 如文件存在則會出錯CREATE_ALWAYS 創建文件,會改寫前一個文件;OPEN_EXISTING 文件必須已經存在。由設備提出要求;OPEN_ALWAYS 如文件不存在則創建它; TRUNCATE_EXISTING 將現有文件縮短為零長度 |
| dwFlagsAndAttributes | Long ,一個或多個下述常數:FILE_ATTRIBUTE_ARCHIVE 標記歸檔屬性;FILE_ATTRIBUTE_COMPRESSED 將文件標記為已壓縮,或者標記為文件在目錄中的默認壓縮方式;FILE_ATTRIBUTE_NORMAL 默認屬性; FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄;FILE_ATTRIBUTE_READONLY 文件為只讀;FILE_ATTRIBUTE_SYSTEM 文件為系統文件;FILE_FLAG_WRITE_THROUGH 操作系統不得推遲對文件的寫操作; FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作;FILE_FLAG_NO_BUFFERING 禁止對文件進行緩沖處理。文件只能寫入磁盤卷的扇區塊;FILE_FLAG_RANDOM_ACCESS 針對隨機訪問對文件緩沖進行優化; FILE_FLAG_SEQUENTIAL_SCAN 針對連續訪問對文件緩沖進行優化 ;FILE_FLAG_DELETE_ON_CLOSE 關閉了上一次打開的句柄后,將文件刪除。特別適合臨時文件; |
| hTemplateFile | Long ,如果不為零,則指定一個文件句柄。新文件將從這個文件中復制擴展屬性 |
2. ReadFile
從文件指針指向的位置開始將數據讀出到一個文件中, 且支持同步和異步操作,如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際讀出文件的字節數保存到lpNumberOfBytesRead指明的地址空間中。FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作。?
函數聲明定義:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
代碼示例:
BOOL Read(char *filePath) {HANDLE pFile;DWORD fileSize;char *buffer,*tmpBuf;DWORD dwBytesRead,dwBytesToRead,tmpLen;pFile = CreateFile(filePath,GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, //打開已存在的文件 FILE_ATTRIBUTE_NORMAL, NULL);if ( pFile == INVALID_HANDLE_VALUE){printf("open file error!\n");CloseHandle(pFile);return FALSE;}fileSize = GetFileSize(pFile,NULL); //得到文件的大小buffer = (char *) malloc(fileSize);ZeroMemory(buffer,fileSize);dwBytesToRead = fileSize;dwBytesRead = 0;tmpBuf = buffer;do{ //循環讀文件,確保讀出完整的文件 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);if (dwBytesRead == 0)break;dwBytesToRead -= dwBytesRead;tmpBuf += dwBytesRead;} while (dwBytesToRead > 0);// TODO 處理讀到的數據 bufferfree(buffer);CloseHandle(pFile);return TRUE; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
3. WriteFile
將數據寫入一個文件。該函數比fwrite函數要靈活的多。也可將這個函數應用于對通信設備、管道、套接字以及郵槽的處理。返回時,TRUE(非零)表示成功,否則返回零。會設置GetLastError。?
函數聲明定義:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
代碼示例:
BOOL Write(char *buffer, DWORD contentLen) {HANDLE pFile;char *tmpBuf;DWORD dwBytesWrite,dwBytesToWrite;pFile = CreateFile(filePath,GENERIC_WRITE, 0,NULL, CREATE_ALWAYS, //總是創建文件FILE_ATTRIBUTE_NORMAL, NULL);if ( pFile == INVALID_HANDLE_VALUE){printf("create file error!\n");CloseHandle(pFile);return FALSE;}dwBytesToWrite = contentLen;dwBytesWrite = 0;tmpBuf = buffer;do{ //循環寫文件,確保完整的文件被寫入 WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);dwBytesToWrite -= dwBytesWrite;tmpBuf += dwBytesWrite;} while (dwBytesToWrite > 0);CloseHandle(pFile);return TRUE; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
總結
以上是生活随笔為你收集整理的C/C++ 文件操作之CreateFile、ReadFile和WriteFile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经验从哪里来?从痛苦中来!
- 下一篇: 对几个重要问题的阐述