這幾天看windows API一日一練,博主給畫出了道道,我來填填具體點的內容。
需求:想操作檔案、串口、並口、USB等等。
原理層:其實很簡單,就三步:開啟,操作,然後關閉。
實踐層1:開啟用CreateFile,讀寫操作用WriteFile、ReadFile,關閉用CloseHandle。
實踐層2:學習各個API怎麼用。
學習API,不就是先瞭解其作用,再瞅瞅傳回值,最後學習學習參數怎麼用麼。
1、CreateFile
<作用>CreateFile:開啟或建立一個檔案、串口、並口、USB等等。還可以開啟路徑喔,親。
<傳回值>成功返回控制代碼,dwCreationDisposition設為CREATE_ALWAYS或OPEN_ALWAYS時,GetLastError返回ERROR_ALREADY_EXISTS。失敗返回INVALID_HANDLE_VALUE。
<參數介紹>
HANDLECreateFile(
LPCTSTRlpFileName,檔案路徑。ANSI:最大MAX_PATH個字元;Unicode:最大32767,and
prepend "\\?\" to the path.
DWORDdwDesiredAccess,訪問方式,如GENERIC_READ
DWORDdwShareMode,讀寫的共用方式。為0時,不共用讀寫,對象不能被再次開啟。此屬性設定不要與訪問方式衝突。
LPSECURITY_ATTRIBUTESlpSecurityAttributes,NULL時,控制代碼不能被繼承。
DWORDdwCreationDisposition, CREATE_ALWAYS:總是建立新的。CREATE_NEW:存在時,失敗。OPEN_ALWAYS:不存在時,建立一個新的。OPEN_EXISTING:不存在時,失敗。
DWORDdwFlagsAndAttributes,一般用FILE_ATTRIBUTE_NORMAL就夠了。
HANDLEhTemplateFileNULL
);
對這種開啟、操作、關閉三步驟方式的對象,一般都會在開啟時指定各種屬性,且這些屬性僅會保留到關閉前。
建立路徑用:CreateDirectory、CreateDirectoryEx
什麼是檔案一直保留的屬性:如下。關心的屬性:大小、時間。
什麼是檔案開啟後才有的屬性:
以下屬性範圍:檔案開啟到關閉。即開啟時指定,關閉時消失。
檔案指標屬性、共用屬性、訪問屬性、建立屬性、檔案標識和屬性、安全屬性。前四個比較重要。File pointer是一個可以更改的值,在讀寫資料時可通過設定其值來改變讀寫位置。
2、WriteFile和ReadFile
2-1、WriteFile
<作用>寫資料到檔案指標指定的位置。同步非同步都行。WriteFileEx僅支援非同步作業。
<傳回值>成功返回非0,失敗返回0。
<參數介紹>
BOOL WriteFile(
HANDLE hFile,GENERIC_WRITE方式訪問的控制代碼。對非同步寫:是以FILE_FLAG_OVERLAPPED檔案標識開啟的控制代碼,或由socket或accept返回的通訊端控制代碼。
LPCVOID lpBuffer,寫資料緩衝區
DWORD nNumberOfBytesToWrite,要寫入的位元組大小
LPDWORD lpNumberOfBytesWritten,[out]已寫入多少位元組。若lpOverlapped為NULL,則此參數不能為NULL;lpOverlapped非NULL時,此參數才可為NULL。若是overlapped write操作,可通過GetOverlappedResult獲得已寫入位元組。若hFile和I/O completion port關聯,通過GetQueuedCompletionStatus擷取已寫入位元組大小
LPOVERLAPPED lpOverlapped hFile以FILE_FLAG_OVERLAPPED檔案標識開啟時才需要此屬性。以FILE_FLAG_OVERLAPPED開啟的hFile,lpOverlapped必須不為NULL。具體到完成連接埠再講。
);
2-2、ReadFile
<作用>從檔案指標指定位置開始讀資料。同步非同步都行。ReadFileEx僅用於非同步作業。
<傳回值>成功返回非0,不成功返回0。若傳回值非0,但讀到的位元組是0,說明讀發生時,檔案指標在檔案結尾。以下任意一種情況發生時,ReadFile才返回:
Ø 管道寫入完畢後,會通知你寫操作完成。
Ø 請求的位元組已讀到。
Ø 發生錯誤。
<參數介紹>
BOOL ReadFile(
HANDLE hFile,GENERIC_READ方式訪問的控制代碼。對非同步讀:是以FILE_FLAG_OVERLAPPED檔案標識開啟的控制代碼,或由socket或accept返回的通訊端控制代碼。
LPVOID lpBuffer,[out]接受資料的buffer
DWORD nNumberOfBytesToRead,要讀的位元組大小
LPDWORD lpNumberOfBytesRead,[out]已讀取的位元組。Overlapped不講了。
LPOVERLAPPED lpOverlapped不講了。
);
2-3、FlushFileBuffers
<作用>將緩衝中資料寫入檔案。
<傳回值>成功非0,失敗0。控制代碼是console output時,失敗,因控制台輸出沒有緩衝。
<參數介紹>
BOOL FlushFileBuffers(
HANDLE hFile GENERIC_WRITE方式訪問的控制代碼。
);
對一個不支援緩衝的I/O裝置,調用CreateFile時應以FILE_FLAG_NO_BUFFERING檔案標誌開啟。
2-4、SetFilepointer /*typedefunsigned
long DWORD;*/
<作用>對已開啟的檔案,移動其指標。檔案指標比LONG大時,使用SetFilePointerEx更簡單。
<傳回值>①成功且lpDistanceToMoveHigh為NULL,則傳回值是檔案指標(DWORD類型)的低位。②lpDistanceToMoveHigh非NULL,傳回值是檔案指標的低位,高位存放在lpDistanceToMoveHigh中。③失敗且lpDistanceToMoveHigh為NULL,傳回值是INVALID_SET_FILE_POINTER。④失敗且lpDistanceToMoveHigh非NULL,傳回值是INVALID_SET_FILE_POINTER。⑤若新的檔案指標是負數,則函數失敗,GetLastError返回ERROR_NEGATIVE_SEEK。
<參數介紹>
DWORD SetFilePointer(
HANDLE hFile, GENERIC_READ或GENERIC_WRITE方式訪問的控制代碼。
LONG lDistanceToMove,[in,out]檔案指標要移動的低位長度,有加號或減號。
PLONG lpDistanceToMoveHigh, 檔案指標距離頭或尾的高位長度,32位夠用時,此值設為NULL。
DWORD dwMoveMethod檔案指標的起始位置:FILE_BEGIN、FILE_CURRENT或FILE_END。
);
2-5、SetEndOfFile
<作用>移動檔案的結尾位置到當前檔案指標所在位置。可以通過此函數來截斷或擴充設定檔案大小。若增大檔案,則舊的EOF position和新的結束位置之間的內容未定義。這個是設定檔案的物理結束位置,設定邏輯結束位置,使用SetFileValidData。
<傳回值>成功非0,失敗0。
<參數介紹>
BOOL SetEndOfFile(
HANDLE hFile GENERIC_WRITE方式訪問的檔案控制代碼。
);
3、CloseHandle可關閉檔案控制代碼。