Share via


fileapi.h) (CREATEFILE2_EXTENDED_PARAMETERS結構

包含 CreateFile2的選擇性擴充參數。

語法

typedef struct _CREATEFILE2_EXTENDED_PARAMETERS {
  DWORD                 dwSize;
  DWORD                 dwFileAttributes;
  DWORD                 dwFileFlags;
  DWORD                 dwSecurityQosFlags;
  LPSECURITY_ATTRIBUTES lpSecurityAttributes;
  HANDLE                hTemplateFile;
} CREATEFILE2_EXTENDED_PARAMETERS, *PCREATEFILE2_EXTENDED_PARAMETERS, *LPCREATEFILE2_EXTENDED_PARAMETERS;

成員

dwSize

包含這個 結構的大小。 sizeof(CREATEFILE2_EXTENDED_PARAMETERS)

dwFileAttributes

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

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

注意

CreateFile2 開啟現有的檔案時,通常會結合檔案旗標與現有檔案的檔案屬性,並忽略作為 dwFlagsAndAttributes一部分提供的任何檔案屬性。 建立 和開啟檔案中會詳述特殊案例。

下列部分檔案屬性和旗標只能套用至檔案,不一定是 CreateFile2 可以開啟的所有其他裝置類型。 For additional information, see the Remarks section of the CreateFile2 reference page and Creating and Opening Files.

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

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

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

Windows 家用版、家用進階版、入門版或 ARM 版本不支援此旗標。

從 Windows 市集應用程式呼叫時,不支援此旗標。

FILE_ATTRIBUTE_HIDDEN
2 (0x2)
檔案被隱藏起來。 請勿將它包含在一般目錄清單中。
FILE_ATTRIBUTE_INTEGRITY_STREAM
32768 (0x8000)
已設定完整性的檔案或目錄。 對於檔案,檔案中的所有資料流程都有完整性。 若為目錄,除非呼叫端另有指定,否則新建立檔案和子目錄的完整性是預設值。

只有 ReFS 檔案系統才支援此旗標。

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)
檔案正用於暫存檔。

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

dwFileFlags

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

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

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

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

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

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

FILE_FLAG_IGNORE_IMPERSONATED_DEVICEMAP
0x00020000
裝置對應是 DOS 裝置名稱和系統中裝置之間的對應,並在解析 DOS 名稱時使用。 系統中每個使用者都有個別的裝置對應,使用者可以管理自己的裝置對應。 模擬期間通常會使用模擬使用者的裝置對應。 不過,設定此旗標時,會改用進程使用者的裝置對應。
FILE_FLAG_NO_BUFFERING
0x20000000
檔案或裝置正在開啟,且不會快取資料讀取和寫入的系統快取。 此旗標不會影響硬碟快取或記憶體對應檔案。

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

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

這個旗標不能與 CREATE_ALWAYS 旗標搭配使用。

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

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

FILE_FLAG_OPEN_REQUIRING_OPLOCK
0x00040000
檔案正在開啟,而檔案上 (oplock) 的商機鎖定會要求為單一不可部分完成的作業。 檔案系統在執行建立作業之前會先檢查 oplock,如果結果會中斷現有的 oplock,則會讓建立失敗,並出現最後一個錯誤碼 ERROR_CANNOT_BREAK_OPLOCK

如果您使用這個旗標並成功傳回 CreateFile2 函式的呼叫,您應該在檔案控制代碼上執行的第一個作業是呼叫 DeviceIOControl 函式來要求 oplock,然後傳入 FSCTL_REQUEST_OPLOCK 或另一個 Opportunistic Lock 作業。 如果您在要求 oplock 之前使用檔案控制代碼執行其他檔案系統作業,可能會發生死結。

注意 您可以在檔案控制代碼上安全地呼叫 CloseHandle 函式,而不需要先要求 oplock。

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

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

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

如果未指定此旗標,則即使讀取和寫入函式的呼叫指定 了 OVERLAPPED 結構,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
寫入作業不會經歷任何中繼快取,它們會直接移至磁片。

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

dwSecurityQosFlags

dwSecurityQosFlags參數會指定 SQOS 資訊。 如需詳細資訊,請參閱 模擬層級

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

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

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

lpSecurityAttributes

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

此參數可以是 Null

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

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

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

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

如需詳細資訊,請參閱 CreateFile2 主題的一節。

hTemplateFile

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

此參數可以是 Null

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

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

備註

若要編譯使用 CREATEFILE2_EXTENDED_PARAMETERS 結構的應用程式,請將 _WIN32_WINNT0x0602 定義為 或更新版本。 如需詳細資訊,請參閱 使用 Windows 標頭

快取行為

dwFileFlags成員的數個可能值可用來控制或影響與控制碼相關聯的資料如何由系統快取。 其中包括:

  • 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 屬性會告知系統在系統快取中盡可能保留,而不會寫入,因此可能會對某些應用程式感到擔心。

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

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

需求

   
最低支援的用戶端 Windows 8 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2012 [傳統型應用程式 |UWP 應用程式]
標頭 fileapi.h (包含 Windows.h)

另請參閱

CreateFile2

檔案管理結構