ReadFile 和 補充CreateFile
續寫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_ANONYMOUS
, SECURITY_IDENTIFICATION
, SECURITY_IMPERSONATION
, SECURITY_DELEGATION
, SECURITY_CONTEXT_TRACKING
, SECURITY_EFFECTIVE_ONLY
hTemplateFile
,hTemplateFile
為一個檔案或裝置控制程式碼,表示按這個引數給出的控制程式碼為模板建立檔案(就是將該控制程式碼檔案拷貝到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函式
相關文章
- MIDI檔案格式分析(補充和勘誤)
- linux命令補充Linux
- 聯通性補充
- JVM補充篇JVM
- 負載均衡補充負載
- explian type extra補充
- step1 補充
- lambda(持續補充)
- 博弈補充練習
- while迴圈補充While
- redis筆記補充Redis筆記
- ping(未完待補充)
- Servlet學習補充Servlet
- css雜項補充CSS
- Scala Learn 5 模式匹配和樣例類 (待補充)模式
- 網路流概念補充
- [Java併發]ThreadLocal補充Javathread
- 二分圖補充
- Spring註解補充(一)Spring
- 前端補充:url編碼前端
- Jaeger知識點補充
- 有關元件的補充~~~~~~~元件
- 陣列常用方法補充陣列
- JPA實體中欄位對映補充和嵌入物件物件
- PS的一些補充
- omnet6.0.1安裝補充
- java 註解學習補充Java
- CC1補充-LazyMap利用
- Scrapy 常用方法以及其補充
- MybatisPlus的一些補充MyBatis
- Golang基礎語法補充Golang
- Python補充02 Python小技巧Python
- 面試題抽答(補充)面試題
- 【排序】氣泡排序(待補充)排序
- Apollo 分散式配置中心(補充)分散式
- CSS——浮動佈局(補充)CSS
- jdk-HashMap-1.7-補充文章JDKHashMap
- [20180928]ora-01426(補充).txt