createFileA 函式 (fileapi.h)

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

若要以交易作業的形式執行此作業,這會導致可用於交易 I/O 的控制碼,請使用 CreateFileTransacted 函式

語法

HANDLE CreateFileA(
  [in]           LPCSTR                lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);

參數

[in] lpFileName

要建立或開啟之檔案或裝置的名稱。 您可以使用此名稱中的正斜線 (/) 或反斜線 (\) 。

根據預設,名稱限制為MAX_PATH個字元。 若要將此限制延伸至 32,767 寬字元,請在路徑前面加上 「\\?\」。 如需詳細資訊,請參閱命名檔案、路徑與命名空間

提示

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

如需特殊裝置名稱的資訊,請參閱 定義 MS-DOS 裝置名稱

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

[in] dwDesiredAccess

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

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

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

您無法在已開啟控制碼的開啟要求中,要求與 dwShareMode 參數所指定的共用模式衝突的存取模式。

For more information, see the Remarks section of this topic and Creating and Opening Files.

[in] dwShareMode

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

如果此參數為零且 CreateFile 成功,則無法共用檔案或裝置,而且在關閉檔案或裝置的控制碼之前無法再次開啟。 如需詳細資訊,請參閱<備註>一節。

您無法要求與現有要求中具有開啟控制碼之存取模式衝突的共用模式。 CreateFile 會失敗,而且 GetLastError 函 式會 傳回ERROR_SHARING_VIOLATION

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

注意 不論進程內容為何,每個開啟控制碼的共用選項都會維持有效狀態,直到該控制碼關閉為止。
 
意義
0
0x00000000
如果其他進程要求刪除、讀取或寫入存取權,則防止其他進程開啟檔案或裝置。
FILE_SHARE_DELETE
0x00000004
啟用檔案或裝置上的後續開啟作業,以要求刪除存取權。

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

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

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

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

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

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

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

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

[in, optional] lpSecurityAttributes

包含兩個個別但相關資料成員 之SECURITY_ATTRIBUTES 結構的指標:選擇性的安全性描述元,以及判斷子進程是否可以繼承傳回控制碼的布林值。

此參數可以是 Null

如果此參數為 Null,則應用程式可建立的任何子進程無法繼承 CreateFile 傳回的控制碼,且與傳回控制碼相關聯的檔案或裝置會取得預設的安全性描述元。

結構的 lpSecurityDescriptor 成員會指定檔案或裝置 的SECURITY_DESCRIPTOR 。 如果這個成員是 Null,則會將與傳回控制碼相關聯的檔案或裝置指派為預設的安全性描述元。

CreateFile 會在開啟現有的檔案或裝置時忽略 lpSecurityDescriptor 成員,但會繼續使用 bInheritHandle 成員。

結構的 bInheritHandle 成員會指定是否可繼承傳回的控制碼。

如需詳細資訊,請參閱<備註>一節。

[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] dwFlagsAndAttributes

檔案或裝置屬性和旗標, FILE_ATTRIBUTE_NORMAL 是檔案最常見的預設值。

此參數可以包含可用檔案屬性的任何組合, (FILE_ATTRIBUTE_*) 。 所有其他檔案屬性都會覆寫 FILE_ATTRIBUTE_NORMAL

此參數也可以包含旗標的組合 (FILE_FLAG_*) ,以控制檔案或裝置快取行為、存取模式和其他特殊用途旗標。 這些會與任何 FILE_ATTRIBUTE_* 值結合。

此參數也可以藉由指定 SECURITY_SQOS_PRESENT 旗標來包含安全性服務品質 (SQOS) 資訊。 下表顯示其他 SQOS 相關旗標資訊,如下表的屬性和旗標資料表。

注意當 CreateFile開啟現有的檔案時,通常會將檔案旗標與現有檔案的檔案屬性結合,並忽略作為dwFlagsAndAttributes一部分提供的任何檔案屬性。 特殊案例詳述于 建立和開啟檔案中。
 
下列部分檔案屬性和旗標只能套用至檔案,而且不一定是 CreateFile 可以開啟的所有其他裝置類型。 如需詳細資訊,請參閱本主題的一節和

如需檔案屬性的進階存取權,請參閱 SetFileAttributes。 如需所有檔案屬性及其值和描述的完整清單,請參閱 檔案屬性常數

屬性 意義
FILE_ATTRIBUTE_ARCHIVE
32 (0x20)
檔案應封存。 應用程式會使用這個屬性來標記要備份或移除的檔案。
FILE_ATTRIBUTE_ENCRYPTED
16384 (0x4000)
檔案或目錄已加密。 對檔案而言,這表示檔案中的所有資料都被加密。 對於目錄,這表示加密是新建立的檔案和子目錄的預設值。 如需詳細資訊,請參閱 檔案加密

如果同時指定 FILE_ATTRIBUTE_SYSTEM, 此旗標就不會有任何作用。

在家用版、家用版、入門版或 ARM 版本的 Windows 上不支援此旗標。

FILE_ATTRIBUTE_HIDDEN
2 (0x2)
檔案被隱藏起來。 請勿將其包含在一般目錄清單中。
FILE_ATTRIBUTE_NORMAL
128 (0x80)
檔案沒有設定其他屬性。 這個屬性只有在單獨使用時才有效。
FILE_ATTRIBUTE_OFFLINE
4096 (0x1000)
檔案的資料無法立即使用。 這個屬性工作表示檔案資料實際上會移至離線儲存體。 遠端儲存體會使用這個屬性,這是階層式儲存體管理軟體。 應用程式不應該任意變更這個屬性。
FILE_ATTRIBUTE_READONLY
1 (0x1)
檔案是唯讀的。 應用程式可以讀取檔案,但無法寫入或刪除檔案。
FILE_ATTRIBUTE_SYSTEM
4 (0x4)
檔案是作業系統的一部分或獨佔使用。
FILE_ATTRIBUTE_TEMPORARY
256 (0x100)
檔案正用於暫存儲存體。

如需詳細資訊,請參閱本主題的 快取行為 一節。

 
旗標 意義
FILE_FLAG_BACKUP_SEMANTICS
0x02000000
正在開啟或建立備份或還原作業的檔案。 當進程具有 SE_BACKUP_NAMESE_RESTORE_NAME 許可權時,系統可確保呼叫進程會覆寫檔案安全性檢查。 如需詳細資訊,請參閱 變更權杖中的許可權

您必須設定此旗標,才能取得目錄的控制碼。 目錄控制碼可以傳遞至某些函式,而不是檔案控制碼。 如需詳細資訊,請參閱<備註>一節。

FILE_FLAG_DELETE_ON_CLOSE
0x04000000
檔案會在其所有控制代碼關閉之後立即刪除,其中包括指定的控制代碼和任何其他開啟或重複的控制代碼。

如果檔案有現有的開啟控制碼,除非呼叫全都以 FILE_SHARE_DELETE共用 模式開啟,否則呼叫會失敗。

除非指定了 FILE_SHARE_DELETE 共用模式,否則檔案的後續開啟要求會失敗。

FILE_FLAG_NO_BUFFERING
0x20000000
檔案或裝置正在開啟,沒有系統快取資料讀取和寫入。 此旗標不會影響硬碟快取或記憶體對應檔案。

使用FILE_FLAG_NO_BUFFERING旗標成功使用CreateFile開啟的檔案有嚴格的需求,如需詳細資訊,請參閱檔案緩衝

FILE_FLAG_OPEN_NO_RECALL
0x00100000
要求檔案資料,但應該會繼續位於遠端儲存體中。 它不應該傳輸回本機儲存體。 此旗標可供遠端儲存系統使用。
FILE_FLAG_OPEN_REPARSE_POINT
0x00200000
不會進行一般 重新分析點 處理; CreateFile 會嘗試開啟重新分析點。 開啟檔案時,會傳回檔案控制碼,不論控制重新分析點的篩選是否正常運作。

此旗標不能與 CREATE_ALWAYS 旗標搭配使用。

如果檔案不是重新分析點,則會忽略此旗標。

如需詳細資訊,請參閱<備註>一節。

FILE_FLAG_OVERLAPPED
0x40000000
正在開啟或建立異步 I/O 的檔案或裝置。

在此控制碼上完成後續的 I/O 作業時, 迭結構中指定的事件將會設定為訊號狀態。

如果指定此旗標,則檔案可用於同時讀取和寫入作業。

如果未指定此旗標,則即使讀取和寫入函式的呼叫指定 重迭 結構,I/O 作業也會序列化。

如需使用此旗標建立之檔案控制碼時考慮的資訊,請參閱本主題的 同步和非同步 I/O 控制碼 一節。

FILE_FLAG_POSIX_SEMANTICS
0x01000000
存取權會根據 POSIX 規則進行。 這包括針對支援該命名的檔案系統,只允許具有名稱的多個檔案,而不同。 使用此選項時請小心,因為針對 MS-DOS 或 16 位 Windows 所撰寫的應用程式可能無法存取以這個旗標建立的檔案。
FILE_FLAG_RANDOM_ACCESS
0x10000000
存取是隨機的。 系統可使用這個做為最佳化檔案快取的提示。

如果檔案系統不支援快取的 I/O 和 FILE_FLAG_NO_BUFFERING,則此旗標沒有任何作用。

如需詳細資訊,請參閱本主題的 快取行為 一節。

FILE_FLAG_SESSION_AWARE
0x00800000
檔案或裝置正以會話感知開啟。 如果未指定此旗標,則每個會話裝置 (例如使用 RemoteFX USB 重新導向的裝置,) 無法由會話 0 中執行的進程開啟。 此旗標對於不在會話 0 中的呼叫端沒有任何作用。 只有伺服器版本的 Windows 才支援此旗標。

Windows Server 2008 R2 和 Windows Server 2008:Windows Server 2012之前不支援此旗標。

FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
存取的目的是要從頭到尾循序。 系統可使用這個做為最佳化檔案快取的提示。

如果讀取後置 (即會使用反向掃描) ,則不應該使用此旗標。

如果檔案系統不支援快取的 I/O 和 FILE_FLAG_NO_BUFFERING,則此旗標沒有任何作用。

如需詳細資訊,請參閱本主題的 快取行為 一節。

FILE_FLAG_WRITE_THROUGH
0x80000000
寫入作業不會經歷任何中繼快取,它們會直接移至磁片。

如需詳細資訊,請參閱本主題的 快取行為 一節。

 

dwFlagsAndAttributes參數也可以指定 SQOS 資訊。 如需詳細資訊,請參閱 模擬層級。 當呼叫應用程式將 SECURITY_SQOS_PRESENT 旗標指定為 dwFlagsAndAttributes的一部分時,它也可以包含下列一或多個值。

安全性旗標 意義
SECURITY_ANONYMOUS
模擬匿名模擬層級的用戶端。
SECURITY_CONTEXT_TRACKING
安全性追蹤模式是動態的。 如果未指定此旗標,則安全性追蹤模式是靜態的。
SECURITY_DELEGATION
模擬委派模擬層級的用戶端。
SECURITY_EFFECTIVE_ONLY
只有用戶端安全性內容的啟用層面可供伺服器使用。 如果您未指定此旗標,則可以使用用戶端安全性內容的所有層面。

這可讓用戶端限制伺服器在模擬用戶端時可以使用的群組和許可權。

SECURITY_IDENTIFICATION
模擬識別模擬層級的用戶端。
SECURITY_IMPERSONATION
在模擬層級模擬用戶端。 如果沒有指定其他旗標以及 SECURITY_SQOS_PRESENT 旗標,這是預設行為。

[in, optional] hTemplateFile

具有 GENERIC_READ 存取權限之範本檔案的有效控制碼。 範本檔案會提供所建立檔案的檔案屬性和擴充屬性。

此參數可以是 Null

開啟現有的檔案時, CreateFile 會忽略此參數。

開啟新的加密檔案時,檔案會從其父目錄繼承任意存取控制清單。 如需詳細資訊,請參閱 檔案加密

傳回值

如果函式成功,傳回值會是指定檔案、裝置、具名管道或郵件位置的開啟控制碼。

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

備註

CreateFile 最初是專為檔案互動而開發,但已擴充並增強,以包含 Windows 開發人員可用的大部分其他類型的 I/O 裝置和機制。 本節會嘗試涵蓋開發人員在不同內容中使用 CreateFile 以及不同 I/O 類型時可能會遇到的各種問題。 只有在特別參照儲存在檔案系統上實際檔案中的資料時,文字才會嘗試 使用文字檔案 。 不過,某些 檔案 的使用方式可能會更普遍地參考支援類似檔案機制的 I/O 物件。 由於先前提及的歷程記錄原因, 這個詞彙檔案 的使用在常數名稱和參數名稱中特別普遍。

當應用程式使用 CreateFile傳回的物件控制碼完成時,請使用 CloseHandle 函式來關閉控制碼。 這不僅釋放系統資源,還可以對共用檔案或裝置及認可資料至磁片等專案產生更廣泛的影響。 本主題中會適當地說明細節。

Windows Server 2003 和 Windows XP: 如果嘗試在 dwDesiredAccess 參數的值是 DELETE 存取旗標 (0x00010000) 或使用任何其他存取旗標開啟遠端檔案或目錄,而且遠端檔案或目錄尚未以 FILE_SHARE_DELETE開啟時,就會發生共用違規。 若要避免在此案例中發生共用違規,請只以 DELETE 存取權限開啟遠端檔案或目錄,或呼叫 DeleteFile 而不先開啟檔案或目錄進行刪除。

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

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

Windows Server 2003 和 Windows XP:基於回溯相容性的目的,當您在lpSecurityAttributes中指定安全性描述項時,CreateFile不會套用繼承規則。 為了支援繼承,稍後查詢此檔案之安全性描述元的函式可能會啟發式判斷並報告繼承生效。 如需詳細資訊,請參閱 可繼承 ACE 的自動傳播

如先前所述,如果 lpSecurityAttributes 參數為 Null,則應用程式可能建立的任何子進程都無法繼承 CreateFile 所傳回的控制碼。 此參數的下列資訊也適用于:

  • 如果 bInheritHandle 成員變數不是 FALSE,這是任何非零值,則可以繼承控制碼。 因此,如果您不想要繼承控制碼,此結構成員必須正確地初始化為 FALSE
  • 存取控制清單 (ACL) 檔案或目錄的預設安全性描述項繼承自其父目錄。
  • 目的檔案系統必須支援檔案和目錄的安全性, lpSecurityDescriptor 成員才能對它們產生影響,這可以使用 GetVolumeInformation來決定。
在Windows 8和Windows Server 2012中,下列技術支援此函式。
技術 支援
伺服器訊息區 (SMB) 3.0 通訊協定 Yes
SMB 3.0 透明容錯移轉 (TFO) 請參閱備註
具有向外延展檔案共用的 SMB 3.0 (SO) 請參閱備註
叢集共用磁片區檔案系統 (CsvFS) Yes
彈性檔案系統 (ReFS) Yes
 

請注意,如果在已經有開啟的替代資料流程的檔案上執行,具有取代處置的 CreateFile 將會失敗。

符號連結行為

如果呼叫此函式會建立檔案,則行為不會有任何變更。 此外,請考慮下列 有關FILE_FLAG_OPEN_REPARSE_POINT的資訊:
  • 如果指定 FILE_FLAG_OPEN_REPARSE_POINT
    • 如果開啟現有的檔案,而且它是符號連結,則傳回的控制碼是符號連結的控制碼。
    • 如果指定 TRUNCATE_EXISTINGFILE_FLAG_DELETE_ON_CLOSE ,受影響的檔案會是符號連結。
  • 如果未指定 FILE_FLAG_OPEN_REPARSE_POINT
    • 如果開啟現有的檔案,而且它是符號連結,則傳回的控制碼是目標的控制碼。
    • 如果指定 CREATE_ALWAYSTRUNCATE_EXISTINGFILE_FLAG_DELETE_ON_CLOSE ,受影響的檔案就是目標。

快取行為

CreateFile會使用dwFlagsAndAttributes參數的數個可能值來控制或影響與控制碼相關聯的資料如何由系統快取。 分別是:
  • FILE_FLAG_NO_BUFFERING
  • FILE_FLAG_RANDOM_ACCESS
  • FILE_FLAG_SEQUENTIAL_SCAN
  • FILE_FLAG_WRITE_THROUGH
  • FILE_ATTRIBUTE_TEMPORARY
如果未指定這些旗標,系統會使用預設的一般用途快取配置。 否則,系統快取的行為會依照每個旗標所指定。

其中一些旗標不應該合併。 例如,結合 FILE_FLAG_RANDOM_ACCESSFILE_FLAG_SEQUENTIAL_SCAN 是自我破壞。

指定 FILE_FLAG_SEQUENTIAL_SCAN 旗標可提高使用循序存取讀取大型檔案的應用程式效能。 對於大部分依序讀取大型檔案的應用程式,效能提升可能更明顯,但偶爾會略過少量位元組範圍。 如果應用程式移動檔案指標以進行隨機存取,則可能不會發生最佳快取效能。 不過,仍保證正確的作業。

旗標 FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING 是獨立的,而且可以合併。

如果使用 FILE_FLAG_WRITE_THROUGH未指定FILE_FLAG_NO_BUFFERING ,因此系統快取生效,則資料會寫入系統快取,但不會延遲排清到磁片。

如果同時指定FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING,因此系統快取不會生效,則資料會立即排清到磁片,而不會通過 Windows 系統快取。 作業系統也會要求硬碟本機硬體快取的寫入至永續性媒體。

注意 並非所有硬碟硬體都支援此寫入功能。
 
正確使用 FILE_FLAG_NO_BUFFERING 旗標需要特殊應用程式考慮。 如需詳細資訊,請參閱 檔案緩衝

透過 FILE_FLAG_WRITE_THROUGH 的寫入要求也會造成 NTFS 排清任何中繼資料變更,例如時間戳記更新或重新命名作業,而導致處理要求。 基於這個理由, FILE_FLAG_WRITE_THROUGH 旗標通常會與 FILE_FLAG_NO_BUFFERING 旗標搭配使用,以取代每次寫入之後呼叫 FlushFileBuffers 函式,這可能會導致不必要的效能負面影響。 將這些旗標一起使用可避免這些懲罰。 如需有關檔案和中繼資料快取的一般資訊,請參閱 檔案快取

當FILE_FLAG_NO_BUFFERINGFILE_FLAG_OVERLAPPED結合時,旗標會提供最大的非同步效能,因為 I/O 不會依賴記憶體管理員的同步作業。 不過,某些 I/O 作業需要更多時間,因為資料不會保留在快取中。 此外,建立空檔案) 時,檔案中繼資料可能仍會快取 (。 若要確保中繼資料已排清到磁片,請使用 FlushFileBuffers 函式。

指定 FILE_ATTRIBUTE_TEMPORARY 屬性會導致檔案系統避免在有足夠的快取記憶體可用時將資料寫回大量儲存體,因為應用程式會在控制碼關閉之後刪除暫存檔。 在此情況下,系統可以完全避免寫入資料。 雖然它不會以與先前提及旗標相同的方式直接控制資料快取, 但FILE_ATTRIBUTE_TEMPORARY 屬性會告知系統在系統快取中盡可能保留,而不會寫入,因此可能會對某些應用程式感到擔心。

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

如果您在先前呼叫 DeleteFile 時擱置刪除的檔案上呼叫 CreateFile,則函式會失敗。 作業系統會延遲檔案刪除,直到檔案的所有控制碼都關閉為止。 GetLastError 會傳回 ERROR_ACCESS_DENIED

dwDesiredAccess參數可以是零,允許應用程式查詢檔案屬性,而不需要存取檔案,如果應用程式正在執行適當的安全性設定。 這很適合用來測試檔案是否存在,而不需開啟檔案以進行讀取和/或寫入存取,或取得檔案或目錄的其他統計資料。 請參閱 取得和設定檔案資訊和GetFileInformationByHandle

如果指定了CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL則 CreateFile會失敗,並在檔案存在且具有 FILE_ATTRIBUTE_HIDDEN 或 FILE_ATTRIBUTE_SYSTEM 屬性,將最後一個錯誤設定為ERROR_ACCESS_DENIED。 若要避免錯誤,請指定與現有檔案相同的屬性。

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

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

同步和非同步 I/O 控制碼

CreateFile 提供建立同步或非同步檔案或裝置控制碼。 同步控制碼的行為會讓使用該控制碼的 I/O 函式呼叫遭到封鎖,直到完成為止,非同步檔案控制代碼可讓系統立即從 I/O 函式呼叫傳回,無論它們是否完成 I/O 作業。 如先前所述,這個同步與非同步行為是由在 dwFlagsAndAttributes參數內指定FILE_FLAG_OVERLAPPED來決定。 使用非同步 I/O 時,有數個複雜度和潛在陷阱;如需詳細資訊,請參閱 同步和非同步 I/O

檔案資料流程

在 NTFS 檔案系統上,您可以使用 CreateFile 在檔案內建立個別的資料流程。 如需詳細資訊,請參閱 檔案資料流程

目錄

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

若要使用 CreateFile開啟目錄,請將 FILE_FLAG_BACKUP_SEMANTICS 旗標指定為 dwFlagsAndAttributes的一部分。 使用此旗標而不 需SE_BACKUP_NAMESE_RESTORE_NAME 許可權時,仍適用適當的安全性檢查。

使用 CreateFile 在 FAT 或 FAT32 檔案系統磁片區的重組期間開啟目錄時,請勿指定 MAXIMUM_ALLOWED 存取權限。 如果完成此動作,則會拒絕對目錄的存取。 請改為指定 GENERIC_READ 存取權。

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

實體磁片和磁片區

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

Windows Server 2003 和 Windows XP: 直接存取磁片或磁片區的方式不受限制。

您可以使用 CreateFile 函式來開啟實體磁片磁碟機或磁片區,這會傳回直接存取存放裝置 (DASD) 控制碼,可與 DeviceIoControl 函式搭配使用。 這可讓您直接存取磁片或磁片區,例如磁片區資料表之類的磁片中繼資料。 不過,這種類型的存取也會將磁片磁碟機或磁片區公開給潛在的資料遺失,因為使用此機制對磁片的寫入不正確,可能會讓作業系統無法存取其內容。 為了確保資料完整性,請務必熟悉 DeviceIoControl ,以及其他 API 與直接存取控制碼的行為不同,而不是檔案系統控制碼。

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

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

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

如需開啟實體磁片磁碟機的範例,請參閱 呼叫 DeviceIoControl

例如,開啟磁片區或卸載式媒體磁碟機 (時,磁片磁碟機或快閃記憶體指紋磁片磁碟機 ) ,lpFileName 字串的格式應如下:「\.\X:」。 請勿使用尾端反斜線 (\) ,這表示磁片磁碟機的根目錄。 下表顯示磁片磁碟機字串的一些範例。

String 意義
「\\.\A:」 開啟磁片磁碟機 A。
「\\.\C:」 開啟 C: 磁片區。
「\\.\C:\」 開啟 C: 磁片區的檔案系統。
 

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

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

即使資料未快取,檔案系統也可能不需要緩衝區對齊。 不過,如果在開啟磁片區時指定了非快取選項,則不論磁片區上的檔案系統為何,都會強制執行緩衝區對齊。 建議您在所有開啟磁片區控制碼為非快取的檔案系統上,並遵循非快取的 I/O 限制。

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

變更器裝置

DeviceIoControl的IOCTL_CHANGER_*控制代碼接受變更裝置的控制碼。 若要開啟變更裝置,請使用下列格式的檔案名:「\\.\Changerx」,其中 x 是數位,指出要開啟的裝置,開頭為零。 若要在以 C 或 C++ 撰寫的應用程式中開啟 changer 裝置零,請使用下列檔案名:「\\.\Changer0」。

磁帶機

您可以使用下列格式的檔案名開啟磁帶機:「\\.\TAPEx」,其中 x 是一個數位,指出要開啟的磁片磁碟機,從磁帶機零開始。 若要在以 C 或 C++ 撰寫的應用程式中開啟磁帶機零,請使用下列檔案名:「\\.\TAPE0」。

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

通訊資源

CreateFile函式可以建立通訊資源的控制碼,例如序列埠 COM1。 對於通訊資源,dwCreationDisposition參數必須OPEN_EXISTING,dwShareMode參數必須是零 (獨佔存取) ,而hTemplateFile參數必須是Null 您可以指定讀取、寫入或讀取/寫入存取權,而且可以針對重迭的 I/O 開啟控制碼。

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

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

CreateFile函式可以建立主控台輸入的控制碼, (CONIN$) 。 如果進程因為繼承或重複而有開啟的控制碼,也可以建立使用中螢幕緩衝區的控制碼, (CONOUT$) 。 呼叫進程必須附加至繼承的主控台或 AllocConsole 函式所配置的主控台。 針對主控台控制碼,請設定 CreateFile 參數,如下所示。
參數
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

lpSecurityAttributes 如果您想要繼承主控台,SECURITY_ATTRIBUTES結構的bInheritHandle成員必須是TRUE
dwCreationDisposition 使用CreateFile開啟主控台時,您應該指定OPEN_EXISTING
dwFlagsAndAttributes 忽略。
hTemplateFile 忽略。
 

下表顯示 dwDesiredAccesslpFileName的各種設定。

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

Mailslots

如果 CreateFile 開啟 mailslot 的用戶端結尾,則此函式會傳回 INVALID_HANDLE_VALUE 如果 mailslot 用戶端嘗試在 mailslot 伺服器使用 CreateMailSlot 函式建立它之前開啟本機郵件集。

如需詳細資訊,請參閱 Mailslots

管道

如果 CreateFile 開啟具名管道的用戶端結尾,函式會使用處于接聽狀態之具名管道的任何實例。 開啟進程可以視需要多次重複控制碼,但在開啟該控制碼之後,另一個用戶端就無法開啟具名管道實例。 開啟管道時所指定的存取權必須與CreateNamedPipe函式之 dwOpenMode參數中指定的存取相容。

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

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

如需詳細資訊,請參閱 管道

範例

下列主題顯示範例檔案作業:

下列主題將示範實體裝置 I/O: 使用具名管道的範例位於 具名管道用戶端

使用 mailslot 會顯示 在寫入 Mailslot中。

您可以在 建立備份應用程式中找到磁帶備份程式碼片段。

注意

fileapi.h 標頭會將 CreateFile 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

   
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 fileapi.h (包含 Windows.h)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

關於目錄管理

關於磁片區管理

備份

CloseHandle

通訊

CreateDirectory

CreateDirectoryEx

CreateFileTransacted

CreateMailSlot

CreateNamedPipe (CreateNamedPipe 函式)

建立、刪除和維護檔案

DeleteFile

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

DeviceIoControl

檔案壓縮和解壓縮

檔案加密

檔案管理功能

檔案安全性和存取權限

檔案資料流程

函式

GetLastError

I/O 完成埠

I/O 概念

Mailslots

取得和設定檔案資訊

概觀主題

管道

ReadFile

ReadFileEx

以特殊許可權執行

SetFileAttributes

WriteFile

WriteFileEx