ReadFile 和 補充CreateFile

尋夢&之璐發表於2021-01-04

續寫CreatFile函式:

CreateFile的涵義是建立File這個核心物件,而不是建立物理磁碟上的“檔案”。在Win32 API中有一系列操作核心物件的函式,建立核心物件的函式大多命名為CreateXxxx

lpFileName String要開啟的檔案的名或裝置名。這個字串的最大長度在ANSI版本中為MAX_PATH,在unicode版本中為32767。

dwDesiredAccess指定型別的訪問物件。如果為 GENERIC_READ 表示允許對裝置進行讀訪問;如果為 GENERIC_WRITE 表示允許對裝置進行寫訪問(可組合使用);如果為零,表示只允許獲取與一個裝置有關的資訊 。

另外,還可以指定下面的控制標誌:

標準控制許可權(16-23位掩碼):

DELETE 刪除物件的許可權。

READ_CONTROL 從物件的安全描述符中讀取資訊的許可權,但不包括SACL(系統訪問控制列表)中的資訊。

WRITE_DAC 修改物件安全描述符中的DACL(隨機訪問控制列表)的許可權

WRITE_OWNER 修改物件安全描述符中的屬主的許可權

SYNCHRONIZE 同步化使用物件的許可權,即可以建立一個執行緒等待訊號量釋放(但有些物件不支援這個許可權)。

STANDARD_RIGHTS_REQUIRED 等價於前面四種許可權的總合(通常這四種是必須具有的許可權)。

STANDARD_RIGHTS_READ 一般等價於READ_CONTROL

STANDARD_RIGHTS_WRITE 一般等價於READ_CONTROL

STANDARD_RIGHTS_EXECUTE 一般等價於READ_CONTROL

STANDARD_RIGHTS_ALL 等價於前面五種許可權的總合。

特殊控制許可權(0-15位掩碼):

SPECIFIC_RIGHTS_ALL

ACCESS_SYSTEM_SECURITY

MAXIMUM_ALLOWED

GENERIC_READ

GENERIC_WRITE

GENERIC_EXECUTE

GENERIC_ALL

注:實質上是通過ACCESS_MASK結構體的一個雙字值來設定標準許可權、特殊許可權和一般許可權的。

dwShareModeLong, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示隨後開啟操作物件會成功,但只有刪除訪問請求的許可權;如果是FILE_SHARE_READ隨後開啟操作物件會成功只有請求讀訪問的許可權;如果是FILE_SHARE_WRITE隨後開啟操作物件會成功,但只有請求寫訪問的許可權。

lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一個SECURITY_ATTRIBUTES結構的指標,定義了檔案的安全特性(如果作業系統支援的話)

dwCreationDispositionLong下述常數之一:

CREATE_NEW建立檔案;如檔案存在則會出錯

CREATE_ALWAYS建立檔案,會改寫前一個檔案

OPEN_EXISTING檔案必須已經存在。由裝置提出要求

OPEN_ALWAYS如檔案不存在則建立它

TRUNCATE_EXISTING將現有檔案縮短為零長度

dwFlagsAndAttributesLong一個或多個下述常數

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關閉了上一次開啟的控制程式碼後,將檔案刪除。特別適合臨時檔案

也可在Windows NT下組合使用下述常數標記:

SECURITY_ANONYMOUSSECURITY_IDENTIFICATIONSECURITY_IMPERSONATIONSECURITY_DELEGATIONSECURITY_CONTEXT_TRACKINGSECURITY_EFFECTIVE_ONLY

hTemplateFilehTemplateFile為一個檔案或裝置控制程式碼,表示按這個引數給出的控制程式碼為模板建立檔案(就是將該控制程式碼檔案拷貝到lpFileName指定的路徑,然後再開啟)。它將指定該檔案的屬性擴充套件到新建立的檔案上面,這個引數可用於將某個新檔案的屬性設定成與現有檔案一樣,並且這樣會忽略dwAttrsAndFlags。通常這個引數設定為NULL,為空表示不使用模板,一般為空。

ReadFile函式

HANDLE hFile, 需要讀入資料的檔案指標,這個指標指向的檔案必須是GENERIC_READ 訪問屬性的檔案。

LPVOID lpBuffer,接收資料的緩衝區。

DWORD nNumberOfBytesToRead,指定要讀取的位元組數。

LPDWORD lpNumberOfBytesRead,指向一個DWORD型別變數的指標,用來接收讀取的位元組數。如果下一個引數為NULL,那麼一定要傳入這個引數。

LPOVERLAPPED lpOverlapped OVERLAPPED結構體指標,如果檔案是以FILE_FLAG_OVERLAPPED方式開啟的話,那麼這個指標就不能為NULL。

FILE_FLAG_OVERLAPPED允許對檔案進行重疊操作

呼叫成功,返回非0

呼叫不成功,返回為0

#include<iostream>
#include<windows.h>
#define BUF_SIZE 256

using 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);

}

實現截圖:

在這裡插入圖片描述
備註:
2021年堅持學寫部落格第二天(學習兩個windows API) 尋夢SS

明日目標:
windows核心程式設計API函式