日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時間:2023/12/18 c/c++ 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++ 文件操作之CreateFile、ReadFile和WriteFile 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. CreateFile

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

  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 );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

參數(shù)列表:

參數(shù) 類型描述
lpFileName String ,要打開的文件的名字
dwDesiredAccess Long ,如果為 GENERIC_READ 表示允許對設(shè)備進(jìn)行讀訪問;如果為 GENERIC_WRITE 表示允許對設(shè)備進(jìn)行寫訪問(可組合使用);如果為零,表示只允許獲取與一個設(shè)備有關(guān)的信息
dwShareMode Long ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允許對文件進(jìn)行共享訪問
lpSecurityAttributes SECURITY_ATTRIBUTES ,指向一個 SECURITY_ATTRIBUTES 結(jié)構(gòu)的指針,定義了文件的安全特性(如果操作系統(tǒng)支持的話)
dwCreationDisposition Long ,下述常數(shù)之一:CREATE_NEW 創(chuàng)建文件; 如文件存在則會出錯CREATE_ALWAYS 創(chuàng)建文件,會改寫前一個文件;OPEN_EXISTING 文件必須已經(jīng)存在。由設(shè)備提出要求;OPEN_ALWAYS 如文件不存在則創(chuàng)建它; TRUNCATE_EXISTING 將現(xiàn)有文件縮短為零長度
dwFlagsAndAttributes Long ,一個或多個下述常數(shù):FILE_ATTRIBUTE_ARCHIVE 標(biāo)記歸檔屬性;FILE_ATTRIBUTE_COMPRESSED 將文件標(biāo)記為已壓縮,或者標(biāo)記為文件在目錄中的默認(rèn)壓縮方式;FILE_ATTRIBUTE_NORMAL 默認(rèn)屬性; FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄;FILE_ATTRIBUTE_READONLY 文件為只讀;FILE_ATTRIBUTE_SYSTEM 文件為系統(tǒng)文件;FILE_FLAG_WRITE_THROUGH 操作系統(tǒng)不得推遲對文件的寫操作; FILE_FLAG_OVERLAPPED 允許對文件進(jìn)行重疊操作;FILE_FLAG_NO_BUFFERING 禁止對文件進(jìn)行緩沖處理。文件只能寫入磁盤卷的扇區(qū)塊;FILE_FLAG_RANDOM_ACCESS 針對隨機(jī)訪問對文件緩沖進(jìn)行優(yōu)化; FILE_FLAG_SEQUENTIAL_SCAN 針對連續(xù)訪問對文件緩沖進(jìn)行優(yōu)化 ;FILE_FLAG_DELETE_ON_CLOSE 關(guān)閉了上一次打開的句柄后,將文件刪除。特別適合臨時文件;
hTemplateFile Long ,如果不為零,則指定一個文件句柄。新文件將從這個文件中復(fù)制擴(kuò)展屬性

2. ReadFile

  從文件指針指向的位置開始將數(shù)據(jù)讀出到一個文件中, 且支持同步和異步操作,如果文件打開方式?jīng)]有指明FILE_FLAG_OVERLAPPED的話,當(dāng)程序調(diào)用成功時,它將實際讀出文件的字節(jié)數(shù)保存到lpNumberOfBytesRead指明的地址空間中。FILE_FLAG_OVERLAPPED 允許對文件進(jìn)行重疊操作。?
  函數(shù)聲明定義:

  BOOL WINAPI ReadFile(__in HANDLE hFile, // 文件句柄__out LPVOID lpBuffer, // 接收數(shù)據(jù)用的 buffer__in DWORD nNumberOfBytesToRead, // 要讀取的字節(jié)數(shù)__out LPDWORD lpNumberOfBytesRead, // 實際讀取到的字節(jié)數(shù)__in LPOVERLAPPED lpOverlapped // OVERLAPPED 結(jié)構(gòu),一般設(shè)定為 NULL );
  • 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{ //循環(huán)讀文件,確保讀出完整的文件 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);if (dwBytesRead == 0)break;dwBytesToRead -= dwBytesRead;tmpBuf += dwBytesRead;} while (dwBytesToRead > 0);// TODO 處理讀到的數(shù)據(jù) 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

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

BOOL WINAPI WriteFile(__in HANDLE hFile, // 文件句柄__in LPCVOID lpBuffer, // 要寫入的數(shù)據(jù)__in DWORD nNumberOfBytesToWrite, // 要寫入的字節(jié)數(shù)__out LPDWORD lpNumberOfBytesWritten, // 實際寫入的字節(jié)數(shù)__in LPOVERLAPPED lpOverlapped // OVERLAPPED 結(jié)構(gòu),一般設(shè)定為 NULL );
  • 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, //總是創(chuàng)建文件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{ //循環(huán)寫文件,確保完整的文件被寫入 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

總結(jié)

以上是生活随笔為你收集整理的C/C++ 文件操作之CreateFile、ReadFile和WriteFile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。