共用方式為


CreateFile2 函式 (fileapi.h)

建立或開啟檔案或 I/O 裝置。 最常使用的 I/O 裝置如下:檔案、檔案數據流、目錄、實體磁碟、磁碟區、控制台緩衝區、磁帶機、通訊資源、mailslot 和管道。 函式會傳回句柄,根據檔案或裝置以及指定的旗標和屬性,可用來存取各種 I/O 類型的檔案或裝置。

從 Windows 市集應用程式呼叫時,CreateFile2 簡化。 您只能在 ApplicationData.LocalFolder或 package.InstalledLocation 目錄中開啟檔案或目錄。 您無法開啟命名管道或郵件集,或建立加密的檔案 (FILE_ATTRIBUTE_ENCRYPTED)。

注意 我們在這裡指的是應用程式的本機資料夾和套件的已安裝位置,而不是套件圖形中的其他套件,例如資源套件。 CreateFile2 不支援在套件圖形中的其他套件中開啟檔案。 例如,假設應用程式相依於 WinJS。 應用程式可以呼叫 CreateFile2,以在其套件中開啟檔案,但無法在 winJS 套件 中開啟檔案。
 
若要以交易作業的形式執行此作業,這會導致可用於交易 I/O 的句柄,請使用 CreateFileTransacted 函式。

語法

HANDLE CreateFile2(
  [in]           LPCWSTR                           lpFileName,
  [in]           DWORD                             dwDesiredAccess,
  [in]           DWORD                             dwShareMode,
  [in]           DWORD                             dwCreationDisposition,
  [in, optional] LPCREATEFILE2_EXTENDED_PARAMETERS pCreateExParams
);

參數

[in] lpFileName

要建立或開啟的檔案或裝置名稱。

如需特殊裝置名稱的相關信息,請參閱 定義 MS-DOS 裝置名稱

若要建立檔案數據流,請指定檔名、冒號,然後指定數據流的名稱。 如需詳細資訊,請參閱 檔案資料流

提示 從 Windows 10 版本 1607 開始,您可以選擇加入移除 MAX_PATH 限制,而不需加上 “\\?\”。 如需詳細資訊,請參閱 命名檔案、路徑和命名空間 的一節。
 

[in] dwDesiredAccess

要求的檔案或裝置存取權,可摘要為讀取、寫入或兩者皆非零)。

最常使用的值是 GENERIC_READGENERIC_WRITE或兩者(GENERIC_READ | GENERIC_WRITE)。 如需詳細資訊,請參閱 一般訪問許可權檔案安全性和訪問許可權檔案訪問許可權常數ACCESS_MASK

如果此參數為零,應用程式可以查詢某些元數據,例如檔案、目錄或裝置屬性,而不需要存取該檔案或裝置,即使 GENERIC_READ 存取也遭到拒絕。

您無法要求與已開啟句柄之開啟要求中 dwShareMode 參數所指定的共用模式衝突的存取模式。

如需詳細資訊,請參閱本主題的一節,並 建立和開啟檔案

[in] dwShareMode

檔案或裝置的要求共用模式,可以是讀取、寫入、刪除、所有這些或無(請參閱下表)。 存取屬性或擴充屬性的要求不會受到這個旗標的影響。

如果此參數為零且 CreateFile2 成功,則檔案或裝置無法共用,而且在關閉檔案或裝置的句柄之前,無法再次開啟。 如需詳細資訊,請參閱一節。

您無法要求與現有要求中具有開啟句柄之存取模式衝突的共用模式。 CreateFile2 會失敗,而且 getLastError 函式 會傳回 ERROR_SHARING_VIOLATION

若要讓進程在開啟檔案或裝置時共用檔案或裝置,請使用下列一或多個值的相容組合。 如需此參數與 dwDesiredAccess 參數之有效組合的詳細資訊,請參閱 建立和開啟檔案

附註 不論進程內容為何,每個開啟句柄的共用選項都會維持有效狀態,直到該句柄關閉為止。
 
價值 意義
0
0x00000000
如果其他進程要求刪除、讀取或寫入存取,則防止其他進程開啟檔案或裝置。 只有在應用程式具有檔案的寫入許可權時,才會授與檔案或目錄的獨佔存取權。
FILE_SHARE_DELETE
0x00000004
啟用檔案或裝置上的後續開啟作業,以要求刪除存取權。

否則,如果進程要求刪除存取權,則無法開啟檔案或裝置。

如果未指定此旗標,但檔案或裝置已開啟以進行刪除存取,則函式會失敗。

注意 刪除存取權允許刪除和重新命名作業。
 
FILE_SHARE_READ
0x00000001
啟用檔案或裝置上的後續開啟作業,以要求讀取存取權。

否則,如果進程要求讀取許可權,則無法開啟檔案或裝置。

如果未指定此旗標,但檔案或裝置已開啟以供讀取存取,則函式會失敗。

如果檔案或目錄正在開啟且未指定此旗標,而且呼叫端沒有檔案或目錄的寫入許可權,則函式會失敗。

FILE_SHARE_WRITE
0x00000002
啟用檔案或裝置上的後續開啟作業,以要求寫入存取權。

否則,如果其他進程要求寫入存取權,則無法開啟檔案或裝置。

如果未指定此旗標,但檔案或裝置已開啟以進行寫入存取,或具有寫入存取權的檔案對應,則函式會失敗。

[in] dwCreationDisposition

針對存在或不存在的檔案或裝置採取動作。

對於檔案以外的裝置,此參數通常會設定為 OPEN_EXISTING

如需詳細資訊,請參閱一節。

此參數必須是下列其中一個值,無法合併:

價值 意義
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 參數的一部分。

[in, optional] pCreateExParams

選擇性 CREATEFILE2_EXTENDED_PARAMETERS 結構的指標。

傳回值

如果函式成功,傳回值就是指定檔案、裝置、命名管道或郵件位置的開啟句柄。

如果函式失敗,傳回值會 INVALID_HANDLE_VALUE。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

言論

若要編譯使用 CreateFile2 函式的應用程式,請將 _WIN32_WINNT 宏定義為0x0602或更新版本。 如需詳細資訊,請參閱使用 Windows 標頭

CreateFile2 支援檔案互動,以及 Windows 開發人員可用的大多數其他類型的 I/O 裝置和機制。 本節會嘗試涵蓋開發人員在不同內容和不同 I/O 類型中使用 CreateFile2 時可能會遇到的各種問題。 只有在特別參考儲存在文件系統上實際檔案中的數據時,文字才會嘗試使用 檔案一詞。 不過,某些使用 檔案 可能會更普遍地參考支援類似檔案機制的 I/O 物件。 由於先前提及的歷史原因,這種自由使用 檔案 一詞在常數名稱和參數名稱中特別普遍。

當應用程式使用 createFile2 傳回的物件句柄完成時,請使用 CloseHandle 函式來關閉句柄。 這不僅釋放了系統資源,而且可以更廣泛地影響共用檔案或裝置,並將數據認可至磁碟等專案。 本主題中會適當地指出細節。

某些文件系統,例如 NTFS 檔案系統,支援個別檔案和目錄的壓縮或加密。 在具有此支援之掛接文件系統的磁碟區上,新的檔案會繼承其目錄的壓縮和加密屬性。

您無法使用 CreateFile2 來控制檔案或目錄上的壓縮、解壓縮或解密。 如需詳細資訊,請參閱 建立和開啟檔案檔案壓縮和解壓縮,以及 檔案加密

如果傳遞 pCreateExParams 參數中傳遞之 CREATEFILE2_EXTENDED_PARAMETERS 結構的 lpSecurityAttributes 成員是 NULL,則 CreateFile2 所傳回的句柄無法由應用程式建立的任何子進程繼承。 此成員的下列資訊也適用於:

  • 如果 bInheritHandle 成員變數未 FALSE,這是任何非零值,則可以繼承句柄。 因此,如果您不想要繼承句柄,請務必正確初始化此結構成員,以 FALSE
  • 檔案或目錄的預設安全性描述元中的訪問控制清單 (ACL) 會繼承自其父目錄。
  • 目標文件系統必須支援 lpSecurityDescriptor 成員對檔案和目錄的安全性,才能對其產生影響,這可以使用 GetVolumeInformation來決定。
在 Windows 8 和 Windows Server 2012 中,下列技術支援此功能。
科技 支援
伺服器消息塊 (SMB) 3.0 通訊協定 是的
SMB 3.0 透明故障轉移 (TFO)
具有向外延展檔案共用的SMB 3.0(SO)
叢集共用磁碟區檔案系統 (CsvFS) 是的
復原檔案系統 (ReFS) 是的
 

符號連結行為

如果呼叫此函式會建立檔案,則行為不會有任何變更。 此外,請考慮下列 FILE_FLAG_OPEN_REPARSE_POINT 有關 dwFileFlags dwFileFlags pCreateExParams 參數中所傳遞之 CREATEFILE2_EXTENDED_PARAMETERS 結構成員的下列資訊:
  • 如果指定 FILE_FLAG_OPEN_REPARSE_POINT
    • 如果已開啟現有的檔案,而且它是符號連結,傳回的句柄就是符號連結的句柄。
    • 如果指定 TRUNCATE_EXISTINGFILE_FLAG_DELETE_ON_CLOSE,受影響的檔案就是符號連結。
  • 如果未指定 FILE_FLAG_OPEN_REPARSE_POINT
    • 如果已開啟現有的檔案,而且它是符號連結,則傳回的句柄是目標的句柄。
    • 如果指定 CREATE_ALWAYSTRUNCATE_EXISTINGFILE_FLAG_DELETE_ON_CLOSE,受影響的檔案就是目標。

檔案

如果您重新命名或刪除檔案,然後在不久之後加以還原,系統會搜尋快取以取得要還原的檔案資訊。 快取的資訊包含其簡短/長名稱組和建立時間。

如果您在擱置刪除的檔案上呼叫 CreateFile2,因為先前呼叫 deleteFile,函式會失敗。 操作系統會延遲刪除檔案,直到檔案的所有句柄都關閉為止。 GetLastError 會傳回 ERROR_ACCESS_DENIED

dwDesiredAccess 參數可以是零,可讓應用程式在沒有存取檔案的情況下查詢檔案屬性,如果應用程式執行時具有足夠的安全性設定。 這適用於測試檔案是否存在,而不需開啟檔案以進行讀取和/或寫入存取,或取得檔案或目錄的其他統計數據。 請參閱 取得和設定檔案資訊GetFileInformationByHandle

當應用程式跨網路建立檔案時,最好將 GENERIC_READ | GENERIC_WRITE 用於 dwDesiredAccess,而不是單獨使用 GENERIC_WRITE。 產生的程式代碼較快,因為重新導向器可以使用快取管理員,並傳送較少具有更多數據的SMB。 這種組合也避免了跨網路寫入檔案可能會偶爾傳回 ERROR_ACCESS_DENIED的問題。

如需詳細資訊,請參閱 建立和開啟檔案

檔案數據流

在 NTFS 文件系統上,您可以使用 CreateFile2 在檔案中建立個別的數據流。 如需詳細資訊,請參閱 檔案資料流

目錄

應用程式無法使用 createFile2 來建立目錄,因此此使用案例的 dwCreationDisposition 只有 OPEN_EXISTING 值才有效。 若要建立目錄,應用程式必須呼叫 CreateDirectoryCreateDirectoryEx

若要使用 CreateFile2開啟目錄,請將 FILE_FLAG_BACKUP_SEMANTICS 旗標指定為 dwFileFlagspCreateExParams 參數中所傳遞之 CREATEFILE2_EXTENDED_PARAMETERS 結構成員的一部分。 在不使用 SE_BACKUP_NAMESE_RESTORE_NAME 許可權的情況下使用此旗標時,仍適用適當的安全性檢查。

使用 CreateFile2 在 FAT 或 FAT32 檔系統磁碟區重組期間開啟目錄時,請勿指定 MAXIMUM_ALLOWED 訪問許可權。 如果這樣做,就會拒絕存取目錄。 請改為指定 GENERIC_READ 存取權。

如需詳細資訊,請參閱 關於目錄管理

實體磁碟和磁碟區

直接存取磁碟或磁碟區會受到限制。

您可以使用 CreateFile2 函式來開啟實體磁碟驅動器或磁碟區,這會傳回直接存取存儲設備 (DASD) 句柄,可與 DeviceIoControl 函式搭配使用。 這可讓您直接存取磁碟或磁碟區,例如磁碟分區數據表之類的磁碟元數據。 不過,這種存取也會讓磁碟驅動器或磁碟區暴露出潛在的數據遺失,因為使用此機制對磁碟的寫入不正確,使得其內容無法存取操作系統。 為了確保數據完整性,請務必熟悉 deviceIoControl ,以及其他 API 與直接存取句柄的行為不同,而不是文件系統句柄。

必須符合下列需求,才能讓這類呼叫成功:

  • 呼叫端必須具有系統管理許可權。 如需詳細資訊,請參閱 以特殊許可權執行
  • dwCreationDisposition 參數必須具有 OPEN_EXISTING 旗標。
  • 開啟磁碟區或磁碟驅動器時,dwShareMode 參數必須具有 FILE_SHARE_WRITE 旗標。
附註dwDesiredAccess 參數可以是零,可讓應用程式在不存取裝置的情況下查詢裝置屬性。 這適用於應用程式判斷磁碟驅動器的大小,以及它所支援的格式,例如,不需要磁碟驅動器中的磁碟驅動器。 它也可以用來讀取統計數據,而不需要較高層級的數據讀取/寫入許可權。
 
開啟實體磁碟驅動器 x:時,lpFileName 字串的格式應該是:“\\.\PhysicalDriveX”。 硬碟號碼從零開始。 下表顯示實體磁碟驅動器字串的一些範例。
字串 意義
“\\.\PhysicalDrive0” 開啟第一個實體磁碟驅動器。
“\\.\PhysicalDrive2” 開啟第三個實體磁碟驅動器。
 

若要取得磁碟區的實體磁碟驅動器標識碼,請開啟磁碟區的句柄,並使用 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS呼叫 DeviceIoControl 函式。 此控制程式代碼會傳回每個磁碟區一或多個範圍的磁碟編號和位移;磁碟區可以跨越多個實體磁碟。

如需開啟實體磁碟驅動器的範例,請參閱 呼叫 DeviceIoControl

開啟磁碟區或卸除式媒體磁碟驅動器時(例如磁碟驅動器或快快閃記憶體指紋磁碟驅動器),lpFileName 字串的格式應該是:“\\.\X:”。 請勿使用尾端反斜杠 (\),指出磁碟驅動器的根目錄。 下表顯示磁碟驅動器字串的一些範例。

字串 意義
“\\.\A:” 開啟磁碟驅動器 A。
“\\.\C:” 開啟 C: 磁碟區。
“\\.\C:\” 開啟 C: 磁碟區的檔案系統。
 

您也可以參考磁碟區名稱來開啟磁碟區。 如需詳細資訊,請參閱 為磁碟區命名

磁碟區包含一或多個掛接的文件系統。 即使 createFile2中未指定非快取選項,磁碟區句柄也可以以非快取方式開啟。 您應該假設所有Microsoft文件系統都會以非快取的方式開啟磁碟區句柄。 檔案的非快取 I/O 限制也適用於磁碟區。

即使數據未快取,文件系統也可能不需要緩衝區對齊。 不過,如果在開啟磁碟區時指定了非快取選項,則不論磁碟區上的檔系統為何,都會強制執行緩衝區對齊。 建議您在所有文件系統上以非快取方式開啟磁碟區句柄,並遵循非快取的 I/O 限制。

注意 若要讀取或寫入磁碟區的最後幾個扇區,您必須呼叫 deviceIoControl 並指定 FSCTL_ALLOW_EXTENDED_DASD_IO。 這表示檔系統驅動程式不會對分割區讀取或寫入呼叫執行任何 I/O 界限檢查。 相反地,界限檢查是由設備驅動器執行。
 

變更器裝置

IOCTL_CHANGER_* deviceIoControl
接受變更裝置句柄 控制碼。 若要開啟變更器裝置,請使用下列格式的檔名:“\.\Changerx”,其中 x 是數位,表示要開啟的裝置,從零開始。 若要在以 C 或 C++ 撰寫的應用程式中開啟變更器裝置零,請使用下列檔名:「\\.\Changer0」。

磁帶機

您可以使用下列格式的檔名來開啟磁帶機:「\.\TAPEx」。,其中 x 是數位,表示要開啟的磁碟驅動器,從磁帶機零開始。 若要在以 C 或 C++ 寫入的應用程式中開啟磁帶機零,請使用下列檔名:「\\\\\.\TAPE0」。。

如需詳細資訊,請參閱 備份

通訊資源

CreateFile2 函式可以建立通訊資源的句柄,例如序列埠 COM1。 針對通訊資源,dwCreationDisposition 參數必須 OPEN_EXISTINGdwShareMode 參數必須是零(獨佔存取),而且 hTemplateFile 參數必須 NULL。 您可以指定讀取、寫入或讀取/寫入存取權,而且可以針對重疊的 I/O 開啟句柄。

若要指定大於 9 的 COM 埠號碼,請使用下列語法:“\.\COM10”。 此語法適用於允許指定 COM 埠號碼的所有埠號碼和硬體。

如需通訊的詳細資訊,請參閱 Communications

主控台

CreateFile2 函式可以建立控制台輸入的句柄(CONIN$)。 如果進程因為繼承或重複而有開啟的句柄,它也可以建立使用中畫面緩衝區的句柄(CONOUT$)。 呼叫進程必須附加至繼承的控制台,或由allocConsole 函式 配置的主控台。 針對控制台句柄,請設定 CreateFile2 參數,如下所示。
參數 價值
lpFileName 使用 CONIN$ 值來指定主控台輸入。

使用 CONOUT$ 值來指定主控台輸出。

CONIN$ 會取得主控台輸入緩衝區的句柄,即使 SetStdHandle 函式會重新導向標準輸入句柄。 若要取得標準輸入句柄,請使用 GetStdHandle 函式。

CONOUT$ 會取得使用中畫面緩衝區的句柄,即使 SetStdHandle 重新導向標準輸出句柄也一樣。 若要取得標準輸出句柄,請使用 GetStdHandle

dwDesiredAccess GENERIC_READ | GENERIC_WRITE 是慣用的,但其中一個都可以限制存取。
dwShareMode 開啟 CONIN$時,請指定 FILE_SHARE_READ。 開啟 CONOUT$時,請指定 FILE_SHARE_WRITE

如果呼叫行程繼承主控台,或子行程應該能夠存取主控台,此參數必須 FILE_SHARE_READ | FILE_SHARE_WRITE

dwCreationDisposition 使用 createFile2 開啟主控台時,您應該指定 OPEN_EXISTING
 

設定傳入 pCreateExParams 參數 CREATEFILE2_EXTENDED_PARAMETERS 結構的成員,如下所示。

成員 價值
lpSecurityAttributes 如果您要繼承主控台,SECURITY_ATTRIBUTES 結構的 bInheritHandle 成員必須 TRUE
dwFileAttributes

dwFileFlags

dwSecurityQosFlags

hTemplateFile

忽視。
 

下表顯示 dwDesiredAccesslpFileName的各種設定。

lpFileName dwDesiredAccess 結果
“CON” GENERIC_READ 開啟主控台以進行輸入。
“CON” GENERIC_WRITE 開啟主控台以進行輸出。
“CON” GENERIC_READ | GENERIC_WRITE 導致 createFile2 失敗;GetLastError 會傳回 ERROR_FILE_NOT_FOUND
 

Mailslots

如果 CreateFile2 開啟 mailslot 的用戶端結尾,則如果 mailslot 用戶端嘗試在 mailslot 伺服器使用 createMailSlot 函式建立本機 mailslot 之前嘗試開啟本機 mailslot,則函式會傳回 INVALID_HANDLE_VALUE

如需詳細資訊,請參閱 Mailslots

管道

如果 CreateFile2 開啟命名管道的用戶端端,函式會使用處於接聽狀態之命名管道的任何實例。 開啟進程可以視需要多次複製句柄,但在開啟它之後,另一個用戶端就無法開啟命名管道實例。 開啟管道時所指定的存取必須與 createNamedPipe
函式之 dwOpenMode 參數中指定的存取相容。

如果在這項作業之前未在伺服器上成功呼叫 CreateNamedPipe 函式,則管線將不會存在,而且 CreateFile2 會失敗,ERROR_FILE_NOT_FOUND

如果至少有一個使用中管道實例,但伺服器上沒有可用的接聽程式管道,這表示所有管線實例目前都已連線,CreateFile2 會失敗並 ERROR_PIPE_BUSY

如需詳細資訊,請參閱 Pipes

要求

要求 價值
最低支援的用戶端 Windows 8 [傳統型應用程式 |UWP 應用程式]
支援的最低伺服器 Windows Server 2012 [傳統型應用程式 |UWP 應用程式]
目標平臺 窗戶
標頭 fileapi.h (包括 Windows.h)
連結庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

關於目錄管理

關於磁碟區管理 的

備份

CloseHandle

通訊

CreateDirectory

CreateDirectoryEx

CreateFile

CreateFileTransacted

CreateMailSlot

CreateNamedPipe

建立、刪除和維護檔案

DeleteFile

裝置輸入和輸出控制 (IOCTL)

DeviceIoControl

檔案壓縮和解壓縮

檔案加密

檔案管理功能

檔案安全性和訪問許可權

檔案數據流

函式

GetLastError

I/O 完成埠

I/O 概念

Mailslots

取得和設定檔案資訊

概觀主題

管道

ReadFile

ReadFileEx

使用特殊許可權執行

SetFileAttributes

WriteFile

WriteFileEx