1. 程式人生 > >CreateFile 函式詳細解析

CreateFile 函式詳細解析

前言:
    在Windows程式設計中CreateFile函式是用得非常多的,由於它的引數比較多比較複雜,在使用的時候容易出現問題,在學習了MSDN的官方文件後打算將其原文翻譯出來,以供參考,如有錯誤,歡迎指正:[email protected]點com

CreateFile 
    建立或開啟檔案或I/O裝置。常用的I/O裝置有:檔案,檔案流,目錄,物理磁碟,卷,控制檯緩衝區,磁帶驅動器,通訊資源,郵筒和管道。該函式返回一個控制代碼,該控制代碼可用於根據檔案或裝置以及指定的標誌和屬性訪問檔案或裝置以獲取各種型別的I/O。
    要將此操作作為事務操作執行,這會導致可用於事務I / O的控制代碼,請使用CreateFileTransacted函式。

句法:

HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,
  _In_     DWORD                 dwDesiredAccess,
  _In_     DWORD                 dwShareMode,
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_     DWORD                 dwCreationDisposition,
  _In_     DWORD                 dwFlagsAndAttributes,
  _In_opt_ HANDLE                hTemplateFile
);
引數:

lpFileName [in]

    要建立或開啟的檔案或裝置的名稱。 可以在這個名字中使用正斜槓(/)或反斜槓(\)【注意/是轉義符號】。在該函式的ANSI版本中,該名稱僅限於MAX_PATH字元。要將此限制擴充套件為32,767個寬字元,請呼叫該函式的Unicode版本並將“\\?\”新增到路徑中。更多內容請檢視:Naming Files, Paths, and Namespaces.
    有關特殊裝置名稱的資訊,請參閱:Defining an MS-DOS Device Name.
    要建立檔案流,請指定檔案的名稱,冒號,然後指定流的名稱。 有關更多資訊,請參閱File Streams.
    提示:從Windows 10版本1607開始,針對此函式的unicode版本(CreateFileW),您可以選擇刪除MAX_PATH限制而不預先新增“\\?\”
有關詳細資訊,請參閱命名檔案,路徑和名稱空間的“Naming Files, Paths, and Namespaces ”部分。
dwDesiredAccess [in]
    所請求的檔案或裝置訪問許可權,這可以被概括為讀,寫,兩者或非)。最常用的值是GENERIC_READGENERIC_WRITE或兩者(GENERIC_READ | GENERIC_WRITE)。更多內容檢視;Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
    如果此引數為零,則應用程式可以查詢某些元資料(如檔案,目錄或裝置屬性),而不訪問該檔案或裝置,即使GENERIC_READ訪問已被拒絕。
    您無法請求與已開啟控制代碼的開啟請求中的dwShareMode引數指定的共享模式衝突的訪問模式。
    有關更多資訊,請參閱本主題的“備註”部分和Creating and Opening Files.
dwShareMode [in]
    檔案或裝置的請求共享模式,可以讀取,寫入,刪除,全部或全部刪除。對屬性或擴充套件屬性的訪問請求不受此標誌的影響。
    如果此引數為零且CreateFile成功,則檔案或裝置無法共享,並且無法再次開啟,直到檔案或裝置的控制代碼關閉。
    你無法請求與在具有開啟控制代碼的現有請求中指定的訪問模式衝突的共享模式。 CreateFile將失敗,GetLastError函式將返回ERROR_SHARING_VIOLATION。
    要啟用程序在另一程序開啟檔案或裝置時共享檔案或裝置,請使用以下一個或多個值的相容組合。有關此引數與dwDesiredAccess引數的有效組合的更多資訊,請檢視Creating and Opening Files.
提示:每個開啟的控制代碼的共享選項在該控制代碼關閉之前保持有效,而與流程上下文無關。
ValueMeaning
0x00000000 防止其他程序在請求刪除,讀取或寫入訪問時開啟檔案或裝置。

FILE_SHARE_DELETE                               

0x00000004

啟用檔案或裝置共享刪除訪問,否則,如果其他程序請求刪除訪問,則無法開啟該檔案或裝置。如果未指定此標誌,但檔案或裝置已被開啟以進行刪除訪問,則該功能失敗。

注意:除訪問許可權允許刪除和重新命名操作

FILE_SHARE_READ

0x00000001

啟用檔案或裝置共享讀訪問,否則,如果其他程序請求讀取訪問許可權,則無法開啟檔案或裝置。如果未指定此標誌,但檔案或裝置已被開啟以進行讀取訪問,則該功能失敗。

FILE_SHARE_WRITE

0x00000002

啟用檔案或裝置共享寫訪問,否則,如果其他程序請求寫訪問許可權,則無法開啟該檔案或裝置。如果未指定此標誌,但檔案或裝置已開啟以進行寫入訪問或具有寫入訪問的檔案對映,則該功能將失敗。
lpSecurityAttributes [in, optional]
    指向SECURITY_ATTRIBUTES結構的指標,該結構包含兩個獨立但相關的資料成員:一個可選的安全描述符以及一個布林值,該值確定返回的控制代碼是否可以被子程序繼承。
    該引數可以是NULL。
    如果此引數為NULL,則由CreateFile返回的控制代碼不能由應用程式可能建立的任何子程序繼承,並且與返回控制代碼關聯的檔案或裝置將獲得預設安全描述符。
    該結構的lpSecurityDescriptor成員為檔案或裝置指定SECURITY_DESCRIPTOR。如果此成員為NULL,則與返回控制代碼關聯的檔案或裝置將被分配一個預設安全描述符。
    CreateFile在開啟現有檔案或裝置時會忽略lpSecurityDescriptor成員,但會繼續使用bInheritHandle成員。
    該結構的bInheritHandle成員指定是否可以繼承返回的控制代碼。
dwCreationDisposition [in]
    採取存在或不存在的檔案或裝置的操作。
    對於檔案以外的裝置,此引數通常設定為OPEN_EXISTING。

    該引數必須是以下值之一,不能組合:

ValueMeaning

CREATE_ALWAYS

2

始終建立一個新檔案。

如果指定的檔案存在並且是可寫的,則該函式覆蓋檔案,函式成功,並且最後的錯誤程式碼被設定為ERROR_ALREADY_EXISTS(183)。

如果指定的檔案不存在並且是有效的路徑,則會建立一個新檔案,該函式成功,並且最後一個錯誤程式碼被設定為零。

CREATE_NEW
1
只有在不存在的情況下才建立一個新檔案。
如果指定的檔案存在,則該函式失敗,並且最後的錯誤程式碼被設定為ERROR_FILE_EXISTS(80)。
如果指定的檔案不存在並且是可寫位置的有效路徑,則會建立一個新檔案。
OPEN_ALWAYS
4
總是開啟一個檔案。
如果指定的檔案存在,則函式成功並且最後的錯誤程式碼被設定為ERROR_ALREADY_EXISTS(183)。
如果指定的檔案不存在並且是可寫位置的有效路徑,則該函式將建立一個檔案,並將最後一個錯誤程式碼設定為零。
OPEN_EXISTING
3
只有存在檔案或裝置時才打開。
如果指定的檔案或裝置不存在,則該函式將失敗,並且最後一個錯誤程式碼將設定為ERROR_FILE_NOT_FOUND(2)。
TRUNCATE_EXISTING           
5
開啟一個檔案並截斷它,以便它的大小為零位元組,只要它存在。
如果指定的檔案不存在,則該函式失敗,並且最後的錯誤程式碼被設定為ERROR_FILE_NOT_FOUND(2)。
呼叫程序必須開啟GENERIC_WRITE位設定為dwDesiredAccess引數的一部分的檔案。
dwFlagsAndAttributes [in]
    檔案或裝置屬性和標誌FILE_ATTRIBUTE_NORMAL是檔案最常用的預設值。
   此引數可以包含可用檔案屬性的任意組合(FILE_ATTRIBUTE_ *)。 所有其他檔案屬性都會覆蓋FILE_ATTRIBUTE_NORMAL。
    此引數還可以包含用於控制檔案或裝置快取行為,訪問模式和其他特殊用途標誌的標誌組合(FILE_FLAG_ *)。 這些與任何FILE_ATTRIBUTE_ *值結合使用。
    此引數還可以通過指定SECURITY_SQOS_PRESENT標誌來包含安全服務質量(SQOS)資訊。
    當CreateFile開啟現有檔案時,它通常將檔案標誌與現有檔案的檔案屬性組合在一起,並忽略作為dwFlagsAndAttributes的一部分提供的任何檔案屬性。
    官方文件中還有列出很多檔案和裝置屬性和標誌的表格,內容太多不再列出,建議參考原文。
hTemplateFile [in, optional]
    具有GENERIC_READ訪問許可權的模板檔案的有效控制代碼。模板檔案為正在建立的檔案提供檔案屬性和擴充套件屬性。
    該引數可以是NULL。
    開啟現有檔案時,CreateFile將忽略此引數。

    開啟新的加密檔案時,該檔案從其父目錄繼承自主訪問控制列表。

返回值:
    如果函式成功,則返回值是指定檔案,裝置,命名管道或郵件插槽的開啟控制代碼。

    如果該函式失敗,則返回值為INVALID_HANDLE_VALUE。 要獲得擴充套件的錯誤資訊,請呼叫GetLastError。

備註:

    CreateFile最初是專門為檔案互動而開發的,但後來被擴充套件和增強,以包括Windows開發人員可用的大多數其他型別的I / O裝置和機制。本節試圖涵蓋開發人員在不同上下文和不同I / O型別中使用CreateFile時可能遇到的各種問題

......未完,還有


相關推薦

no