CreateFile 函式詳細解析

2021-08-19 13:36:27 字數 4913 閱讀 6925

前言:

在windows程式設計中createfile函式是用得非常多的,由於它的引數比較多比較複雜,在使用的時候容易出現問題,在學習了msdn的官方文件後打算將其原文翻譯出來,以供參考,如有錯誤,歡迎指正:lcb0281@163點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]

naming files, paths, and namespaces.

有關特殊裝置名稱的資訊,請參閱:defining an ms-dos device name.

要建立檔案流,請指定檔案的名稱,冒號,然後指定流的名稱。 有關更多資訊,請參閱file streams.

。有關詳細資訊,請參閱命名檔案,路徑和命名空間的「naming files, paths, and namespaces 」部分。

dwdesiredaccess [in]

所請求的檔案或裝置訪問許可權,這可以被概括為讀,寫,兩者或非)。最常用的值是generic_readgeneric_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。creating and opening files.

value

meaning

0x00000000 

防止其他程序在請求刪除,讀取或寫入訪問時開啟檔案或裝置。

file_share_delete

0x00000004

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

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

file_share_read

0x00000001

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

file_share_write

0x00000002

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

lpsecurityattributes [in, optional]

該引數可以是null。

如果此引數為null,則由createfile返回的控制代碼不能由應用程式可能建立的任何子程序繼承,並且與返回控制代碼關聯的檔案或裝置將獲得預設安全描述符。

該結構的lpsecuritydescriptor成員為檔案或裝置指定security_descriptor。如果此成員為null,則與返回控制代碼關聯的檔案或裝置將被分配乙個預設安全描述符。

createfile在開啟現有檔案或裝置時會忽略lpsecuritydescriptor成員,但會繼續使用binherithandle成員。

該結構的binherithandle成員指定是否可以繼承返回的控制代碼。

dwcreationdisposition [in]

採取存在或不存在的檔案或裝置的操作。

對於檔案以外的裝置,此引數通常設定為open_existing。

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

value

meaning

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時可能遇到的各種問題

......未完,還有

CreateFile之類的幾個函式

這幾天看windows api一日一練,博主給畫出了道道,我來填填具體點的內容。需求 想操作檔案 串列埠 並口 usb等等。原理層 其實很簡單,就三步 開啟,操作,然後關閉。實踐層1 開啟用createfile,讀寫操作用writefile readfile,關閉用closehandle。實踐層2 ...

kafka Controller模組 詳細解讀

目錄 集群元資料 controllercontext controllerstats shuttingdownbrokerids epoch epochzkversion livebrokers livebrokerepochs alltopics partitionassignments part...

關於Python中的join 函式的詳細解說

詳解python中的join 函式的用法 字串和os.path 2016年08月12日 13 41 30 橙子愛柚子 閱讀數 16033 函式 string.join python中有join 和os.path.join 兩個函式,具體作用如下 join 連線字串陣列。將字串 元組 列表中的元素以指...