CreateFile之類的幾個函數

來源:互聯網
上載者:User

這幾天看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可關閉檔案控制代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.