ReadFile 和 补充CreateFile
文章目錄
- 寫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
實(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM多寄存器加载/存储指令
- 下一篇: MessageBoxA 和Messag