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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ReadFile 和 补充CreateFile

發(fā)布時(shí)間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ReadFile 和 补充CreateFile 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 寫CreatFile函數(shù):
    • 第一個(gè)參數(shù)
    • 第二個(gè)參數(shù)
    • 第三個(gè)參數(shù)
    • 第四個(gè)參數(shù)
    • 第五個(gè)參數(shù)
    • 第六個(gè)參數(shù)(設(shè)定這個(gè)文件的屬性)
    • 第七個(gè)參數(shù)(指定模板)
    • 返回值
    • `ReadFile`函數(shù)
    • 第一個(gè)參數(shù)(文件句柄 )
    • 第二個(gè)參數(shù)(緩沖區(qū))
    • 第三個(gè)參數(shù)(想讀字節(jié)數(shù))
    • 第四個(gè)參數(shù)(實(shí)際所讀字節(jié)數(shù))
    • 第五個(gè)參數(shù)
    • 返回值
    • 實(shí)現(xiàn)截圖:
    • 補(bǔ)充:(特記)

寫CreatFile函數(shù):

CreateFile的涵義是創(chuàng)建File這個(gè)內(nèi)核對(duì)象,而不是創(chuàng)建物理磁盤上的“文件”。在Win32 API中有一系列操作內(nèi)核對(duì)象的函數(shù),創(chuàng)建內(nèi)核對(duì)象的函數(shù)大多命名為CreateXxxx型

CreateFile("test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

第一個(gè)參數(shù)

test.txt要打開的文件的名或設(shè)備名。這個(gè)字符串的最大長度在ANSI版本中為MAX_PATH,在unicode版本中為32767。

第二個(gè)參數(shù)

GENERIC_READ指定類型的訪問對(duì)象。如果為 GENERIC_READ 表示允許對(duì)設(shè)備進(jìn)行讀訪問;如果為 GENERIC_WRITE 表示允許對(duì)設(shè)備進(jìn)行寫訪問(可組合使用);如果為零,表示只允許獲取與一個(gè)設(shè)備有關(guān)的信息

  • 另外,還可以指定下面的控制標(biāo)志:

    標(biāo)準(zhǔn)控制權(quán)限(16-23位掩碼):

    DELETE 刪除對(duì)象的權(quán)限。

    READ_CONTROL 從對(duì)象的安全描述符中讀取信息的權(quán)限,但不包括SACL(系統(tǒng)訪問控制列表)中的信息。

    WRITE_DAC 修改對(duì)象安全描述符中的DACL(隨機(jī)訪問控制列表)的權(quán)限

    WRITE_OWNER 修改對(duì)象安全描述符中的屬主的權(quán)限

    SYNCHRONIZE 同步化使用對(duì)象的權(quán)限,即可以創(chuàng)建一個(gè)線程等待信號(hào)量釋放(但有些對(duì)象不支持這個(gè)權(quán)限)。

    STANDARD_RIGHTS_REQUIRED 等價(jià)于前面四種權(quán)限的總合(通常這四種是必須具有的權(quán)限)。

    STANDARD_RIGHTS_READ 一般等價(jià)于READ_CONTROL

    STANDARD_RIGHTS_WRITE 一般等價(jià)于READ_CONTROL

    STANDARD_RIGHTS_EXECUTE 一般等價(jià)于READ_CONTROL

    STANDARD_RIGHTS_ALL 等價(jià)于前面五種權(quán)限的總合。

    特殊控制權(quán)限(0-15位掩碼):

    SPECIFIC_RIGHTS_ALL

    ACCESS_SYSTEM_SECURITY

    MAXIMUM_ALLOWED

    GENERIC_READ

    GENERIC_WRITE

    GENERIC_EXECUTE

    GENERIC_ALL

    注:實(shí)質(zhì)上是通過ACCESS_MASK結(jié)構(gòu)體的一個(gè)雙字值來設(shè)置標(biāo)準(zhǔn)權(quán)限、特殊權(quán)限和一般權(quán)限的。

第三個(gè)參數(shù)

FILE_SHARE_READ(共享讀操作), 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示隨后打開操作對(duì)象會(huì)成功,但只有刪除訪問請(qǐng)求的權(quán)限;如果是FILE_SHARE_READ隨后打開操作對(duì)象會(huì)成功只有請(qǐng)求讀訪問的權(quán)限;如果是FILE_SHARE_WRITE隨后打開操作對(duì)象會(huì)成功,但只有請(qǐng)求寫訪問的權(quán)限。

第四個(gè)參數(shù)

lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,定義了文件的安全特性(如果操作系統(tǒng)支持的話),一般為null(表示默認(rèn)的安全屬性)

第五個(gè)參數(shù)

dwCreationDispositionLong下述常數(shù)之一:

  • CREATE_NEW創(chuàng)建文件;如文件存在則會(huì)出錯(cuò)
    CREATE_ALWAYS創(chuàng)建文件,會(huì)改寫前一個(gè)文件
    OPEN_EXISTING文件必須已經(jīng)存在。由設(shè)備提出要求
    OPEN_ALWAYS如文件不存在則創(chuàng)建它
    TRUNCATE_EXISTING將現(xiàn)有文件縮短為零長度

第六個(gè)參數(shù)(設(shè)定這個(gè)文件的屬性)

dwFlagsAndAttributesLong一個(gè)或多個(gè)下述常數(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)不得推遲對(duì)文件的寫操作
    FILE_FLAG_OVERLAPPED允許對(duì)文件進(jìn)行重疊操作
    FILE_FLAG_NO_BUFFERING禁止對(duì)文件進(jìn)行緩沖處理。文件只能寫入磁盤卷的扇區(qū)塊
    FILE_FLAG_RANDOM_ACCESS針對(duì)隨機(jī)訪問對(duì)文件緩沖進(jìn)行優(yōu)化
    FILE_FLAG_SEQUENTIAL_SCAN針對(duì)連續(xù)訪問對(duì)文件緩沖進(jìn)行優(yōu)化
    FILE_FLAG_DELETE_ON_CLOSE關(guān)閉了上一次打開的句柄后,將文件刪除。特別適合臨時(shí)文件

    也可在Windows NT下組合使用下述常數(shù)標(biāo)記:
    SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION,
    SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY

第七個(gè)參數(shù)(指定模板)

hTemplateFile,hTemplateFile為一個(gè)文件或設(shè)備句柄,表示按這個(gè)參數(shù)給出的句柄為模板創(chuàng)建文件(就是將該句柄文件拷貝到lpFileName指定的路徑,然后再打開)。它將指定該文件的屬性擴(kuò)展到新創(chuàng)建的文件上面,這個(gè)參數(shù)可用于將某個(gè)新文件的屬性設(shè)置成與現(xiàn)有文件一樣,并且這樣會(huì)忽略dwAttrsAndFlags。通常這個(gè)參數(shù)設(shè)置為NULL,為空表示不使用模板,一般為空。

返回值

如執(zhí)行成功,則返回HANDLE文件句柄。如果函數(shù)失敗,返會(huì)值會(huì)是 INVALID_HANDLE_VALUE,INVALID_HANDLE_VALUE表示出錯(cuò),會(huì)設(shè)置GetLastError,更多的錯(cuò)誤信息可以調(diào)用 GetLastError 來獲得。即使函數(shù)成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也會(huì)設(shè)為ERROR_ALREADY_EXISTS

ReadFile函數(shù)

ReadFile(hFileRead, buffer, BUF_SIZE, &nIn, NULL)

第一個(gè)參數(shù)(文件句柄 )

HANDLE hFile, 需要讀入數(shù)據(jù)的文件指針,這個(gè)指針指向的文件必須是GENERIC_READ 訪問屬性的文件。

第二個(gè)參數(shù)(緩沖區(qū))

LPVOID lpBuffer,接收數(shù)據(jù)的緩沖區(qū)。

第三個(gè)參數(shù)(想讀字節(jié)數(shù))

DWORD nNumberOfBytesToRead,指定要讀取的字節(jié)數(shù)。

第四個(gè)參數(shù)(實(shí)際所讀字節(jié)數(shù))

LPDWORD lpNumberOfBytesRead,指向一個(gè)DWORD類型變量的指針,用來接收讀取的字節(jié)數(shù)。如果下一個(gè)參數(shù)為NULL,那么一定要傳入這個(gè)參數(shù)。

第五個(gè)參數(shù)

LPOVERLAPPED lpOverlapped OVERLAPPED結(jié)構(gòu)體指針,如果文件是以FILE_FLAG_OVERLAPPED方式打開的話,那么這個(gè)指針就不能為NULL。
FILE_FLAG_OVERLAPPED允許對(duì)文件進(jìn)行重疊操作

返回值

調(diào)用成功,返回非0
調(diào)用不成功,返回為0

#include<iostream> #include<windows.h> #define BUF_SIZE 256using namespace std;int main() {HANDLE hFileRead;DWORD nIn;char buffer[BUF_SIZE]="";hFileRead = CreateFile(L"test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hFileRead == INVALID_HANDLE_VALUE) {printf("Cannot open file. Error : %x/n", GetLastError());return -1;}while (ReadFile(hFileRead, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0){printf("%s/n", buffer);}CloseHandle(hFileRead);}

實(shí)現(xiàn)截圖:

補(bǔ)充:(特記)

字符數(shù)組沒有初始化 內(nèi)存空間里就會(huì)有一些奇奇怪怪的東西。
所以記得char buffer[BUF_SIZE]=""
千萬別寫成char buffer[BUF_SIZE]這樣,如果寫成這樣的話,那么會(huì)出現(xiàn)一些 “燙燙燙”的字眼。。。。。我一直以為是亂碼問題,一直糾結(jié)在改存儲(chǔ)格式,結(jié)果求助了大佬,才知道是字符數(shù)組沒初始化。。。

備注:
2021年堅(jiān)持學(xué)寫博客第2天(學(xué)習(xí)兩個(gè)windows API) 尋夢(mèng)SS

明日目標(biāo):
windows核心編程API函數(shù)

總結(jié)

以上是生活随笔為你收集整理的ReadFile 和 补充CreateFile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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