CreateFileTransactedW 函式 (winbase.h)
[Microsoft強烈建議開發人員利用替代方法來達成應用程式的需求。 TxF 開發的許多案例都可以透過更簡單且更容易使用的技術來達成。 此外,未來版本的 Microsoft Windows 可能無法使用 TxF。 如需詳細資訊和 TxF 的替代方案,請參閱使用交易式 NTFS的替代專案
建立或開啟檔案、檔案數據流或目錄做為交易作業。 函式會傳回可用來存取物件的句柄。
若要以非交易作業的方式執行這項作業,或存取檔案以外的物件(例如命名管道、實體裝置、mailslots),請使用 CreateFile 函式。
如需交易的詳細資訊,請參閱本主題的一節。
語法
HANDLE CreateFileTransactedW(
[in] LPCWSTR lpFileName,
[in] DWORD dwDesiredAccess,
[in] DWORD dwShareMode,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[in] DWORD dwCreationDisposition,
[in] DWORD dwFlagsAndAttributes,
[in, optional] HANDLE hTemplateFile,
[in] HANDLE hTransaction,
[in, optional] PUSHORT pusMiniVersion,
PVOID lpExtendedParameter
);
參數
[in] lpFileName
要建立或開啟的物件名稱。
對象必須位於本機計算機上;否則,函式會失敗,且最後一個錯誤碼會設定為 ERROR_TRANSACTIONS_UNSUPPORTED_REMOTE。
根據預設,名稱限製為MAX_PATH個字元。 若要將此限制延伸至 32,767 寬字元,請在路徑前面加上 “\\?\”。 如需詳細資訊,請參閱 命名檔案、路徑和命名空間。
提示
從 Windows 10 版本 1607 開始,您可以選擇移除MAX_PATH限制,而不需預先加上 “\\?\”。 如需詳細資訊,請參閱 命名檔案、路徑和命名空間 的一節。
若要建立檔案數據流,請指定檔名、冒號,然後指定數據流的名稱。 如需詳細資訊,請參閱 檔案資料流。
[in] dwDesiredAccess
物件的存取權,可以摘要為讀取、寫入、兩者或兩者(零)。 最常使用的值是 GENERIC_READ、GENERIC_WRITE或兩者(GENERIC_READ | GENERIC_WRITE)。 如需詳細資訊,請參閱 一般存取權限 和 檔案安全性和存取權限。
如果此參數為零,應用程式可以查詢檔案、目錄或裝置屬性,而不需要存取該檔案或裝置。 如需詳細資訊,請參閱本主題的一節。
您無法要求與開啟要求中具有開啟句柄之共用模式衝突的存取模式。 如需詳細資訊,請參閱 建立和開啟檔案。
[in] dwShareMode
對象的共用模式,可以是讀取、寫入、兩者、刪除、全部或無(請參閱下表)。
如果此參數為零且 CreateFileTransacted 成功,則對象無法共用,而且在句柄關閉之前無法再次開啟。 如需詳細資訊,請參閱本主題的一節。
您無法要求與開啟句柄之開啟要求中指定的存取模式衝突的共用模式,因為這會導致下列共用違規:ERROR_SHARING_VIOLATION。 如需詳細資訊,請參閱 建立和開啟檔案。
若要讓進程在另一個進程開啟物件時共享物件,請使用下列一或多個值的組合來指定可以要求開啟物件的存取模式。
[in, optional] lpSecurityAttributes
包含選擇性 安全性描述元 之 SECURITY_ATTRIBUTES 結構的指標,也會決定子進程是否可以繼承傳回的句柄。 參數可以 NULL。
如果 lpSecurityAttributes 參數 NULL,則 CreateFileTransacted 所傳回的句柄無法由應用程式建立的任何子進程繼承,且與傳回句柄相關聯的物件會取得預設的安全性描述元。
bInheritHandle 結構的成員會指定是否可以繼承傳回的句柄。
結構的 lpSecurityDescriptor 成員會為物件指定 安全性描述元,但也可能 NULL。
如果 lpSecurityDescriptor 成員 NULL,則會將與傳回句柄相關聯的物件指派為預設安全性描述元。
CreateFileTransacted 在開啟現有檔案時會忽略 lpSecurityDescriptor 成員,但會繼續使用 bInheritHandle 成員。
如需詳細資訊,請參閱本主題的一節。
[in] dwCreationDisposition
針對存在且不存在的檔案採取動作。
如需詳細資訊,請參閱本主題的一節。
此參數必須是下列其中一個值,無法合併。
[in] dwFlagsAndAttributes
檔案屬性和旗標,FILE_ATTRIBUTE_NORMAL 為最常見的預設值。
此參數可以包含可用檔案屬性的任何組合(FILE_ATTRIBUTE_*)。 所有其他檔案屬性都會覆寫 FILE_ATTRIBUTE_NORMAL。
此參數也可以包含旗標的組合(FILE_FLAG_),以控制緩衝行為、存取模式和其他特殊用途旗標。 這些會與任何 FILE_ATTRIBUTE_ 值結合。
此參數也可以藉由指定 SECURITY_SQOS_PRESENT 旗標來包含安全性服務品質 (SQOS) 資訊。 其他 SQOS 相關旗標資訊會顯示在屬性和旗標數據表之後的表格中。
CreateFileTransacted 開啟現有的檔案時,通常會將檔案旗標與現有檔案的檔案屬性合併,並忽略 dwFlagsAndAttributes隨附的任何檔案屬性。 建立和開啟檔案中詳述特殊案例。
屬性 | 意義 |
---|---|
|
檔案應該封存。 應用程式會使用此屬性來標記檔案以進行備份或移除。 |
|
檔案或目錄已加密。 對於檔案,這表示檔案中的所有數據都會加密。 對於目錄,這表示加密是新建立檔案和子目錄的預設值。 如需詳細資訊,請參閱 檔案加密。
如果同時指定 FILE_ATTRIBUTE_SYSTEM,這個旗標就不會有任何作用。 |
|
檔案已隱藏。 請勿將其包含在一般目錄清單中。 |
|
檔案沒有設定其他屬性。 此屬性只有在單獨使用時才有效。 |
|
檔案的數據無法立即取得。 這個屬性表示檔案數據會實際移至離線記憶體。 遠端記憶體是階層式記憶體管理軟體,使用這個屬性。 應用程式不應該任意變更此屬性。 |
|
檔案是唯讀的。 應用程式可以讀取檔案,但無法寫入或刪除檔案。 |
|
檔案是操作系統獨佔或獨佔使用的一部分。 |
|
檔案正用於暫存記憶體。 如果有足夠的快取記憶體可用,檔案系統可避免將數據寫回大量記憶體,因為應用程式會在句柄關閉后刪除暫存盤。 在此情況下,系統完全可以避免寫入數據。 否則,數據會在句柄關閉之後寫入。 |
旗 | 意義 |
---|---|
|
檔案正在開啟或建立以進行備份或還原作業。 當進程具有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 許可權時,系統可確保呼叫進程會覆寫檔案安全性檢查。 如需詳細資訊,請參閱在令牌中變更許可權 您必須設定此旗標,才能取得目錄的句柄。 目錄句柄可以傳遞至某些函式,而不是檔案句柄。 如需詳細資訊,請參閱 目錄句柄。 |
|
在關閉檔案的最後一個交易寫入器句柄之後,檔案將會立即刪除,前提是交易仍在使用中。 如果檔案已標示為要刪除,且交易完成之後仍開啟交易寫入器句柄,則不會刪除檔案。
如果檔案有現有的開啟句柄,除非呼叫全都以 FILE_SHARE_DELETE 共用模式開啟,否則呼叫會失敗。 除非指定 FILE_SHARE_DELETE 共用模式,否則檔案的後續開啟要求會失敗。 |
|
檔案正在開啟,且沒有系統快取。 此旗標不會影響硬碟快取或記憶體對應檔案。 結合 FILE_FLAG_OVERLAPPED時,旗標會提供最大異步效能,因為 I/O 不依賴記憶體管理員的同步作業。
不過,某些 I/O 作業需要更多時間,因為數據不會保留在快取中。 此外,仍可快取檔案元數據。 若要將元數據排清到磁碟,請使用 flushFileBuffers 函式 使用以 FILE_FLAG_NO_BUFFERING開啟的檔案時,應用程式必須符合特定需求:
|
|
要求檔案數據,但應該會繼續位於遠端記憶體中。 它不應該傳輸回本機記憶體。 此旗標可供遠端儲存系統使用。 |
|
一般 重新分析點 處理不會發生;CreateFileTransacted 會嘗試開啟重新分析點。 開啟檔案時,會傳回檔句柄,不論控制重新分析點的篩選是否正常運作。 此旗標不能與 CREATE_ALWAYS 旗標搭配使用。 如果檔案不是重新分析點,則會忽略此旗標。 |
|
檔案正在開啟或建立給異步 I/O。 作業完成時,在重 迭 如果指定此旗標,則檔案可用於同時讀取和寫入作業。 系統不會維護檔案指標,因此您必須將檔案位置傳遞至 重疊 結構中的讀取和寫入函式,或更新檔案指標。 如果未指定此旗標,則即使讀取和寫入函式的呼叫指定 了重疊 結構,I/O 作業也會串行化。 |
|
檔案會根據 POSIX 規則進行存取。 這包括允許多個具有名稱的檔案,只有在支援該命名的文件系統時才有所不同。 使用此選項時請小心,因為針對 MS-DOS 或16位 Windows 所撰寫的應用程式可能無法存取以這個旗標建立的檔案。 |
|
檔案會隨機存取。 系統可以使用此功能作為優化檔案快取的提示。 |
|
檔案或裝置正以會話感知開啟。 如果未指定此旗標,則會話 0 中執行的處理程式無法開啟個別會話裝置(例如使用 RemoteFX USB 重新導向的裝置)。
此旗標對不在會話 0 中的呼叫端沒有任何作用。 只有伺服器版本的 Windows 才支援此旗標。
Windows Server 2008 R2 和 Windows Server 2008:Windows Server 2012 之前不支援此旗標。 |
|
檔案是從頭到尾循序存取。 系統可以使用此功能作為優化檔案快取的提示。 如果應用程式移動檔案指標進行隨機存取,則可能不會發生最佳快取。 不過,仍會保證正確的作業。
指定此旗標可以提升使用循序存取讀取大型檔案的應用程式效能。 對於大部分循序讀取大型檔案的應用程式,效能提升可能更為明顯,但偶爾會略過少量位元組範圍。 如果文件系統不支援快取的 I/O,且 FILE_FLAG_NO_BUFFERING,這個旗標就沒有作用。 |
|
寫入作業不會經歷任何中繼快取,它們會直接移至磁碟。
如果未同時指定 FILE_FLAG_NO_BUFFERING,讓系統快取生效,則數據會寫入系統快取,但不會延遲地排清到磁碟。 如果也指定了 FILE_FLAG_NO_BUFFERING,因此系統快取不會生效,則數據會立即排清到磁碟,而不會通過系統快取。 操作系統也會要求寫入硬碟快取至永續性媒體。 不過,並非所有硬體都支援此寫入功能。 |
dwFlagsAndAttributes 參數也可以指定服務品質資訊的安全性品質。 如需詳細資訊,請參閱 模擬層級。 當呼叫的應用程式將 SECURITY_SQOS_PRESENT 旗標指定為 dwFlagsAndAttributes的一部分時,它也可以包含下列一或多個值。
[in, optional] hTemplateFile
具有 GENERIC_READ 訪問許可權之範本檔案的有效句柄。 範本檔案會提供所建立檔案的檔案屬性和擴充屬性。 此參數可以是 NULL
開啟現有的檔案時,CreateFileTransacted 會忽略範本檔案。
開啟新的EFS 加密檔案時,檔案會從其父目錄繼承 DACL。
[in] hTransaction
交易的句柄。 此句柄是由 createTransaction 函式
[in, optional] pusMiniVersion
要開啟的迷你版本。 如果 hTransaction 中指定的交易不是正在修改檔案的交易,則此參數應該 NULL。 否則,此參數可以是 FSCTL_TXFS_CREATE_MINIVERSION 控件程式代碼所傳回的迷你版本標識碼,或下列其中一個值。
價值 | 意義 |
---|---|
|
檔案檢視,自上次認可起。 |
|
異動正在修改檔案的檢視。 |
|
視內容而定,檔案的已認可或已變更檢視。 正在修改檔案的交易會取得臟檢視,而未修改檔案的交易則取得認可的檢視。 |
lpExtendedParameter
此參數是保留的,而且必須 NULL。
傳回值
如果函式成功,傳回值就是指定檔案、裝置、命名管道或郵件位置的開啟句柄。
如果函式失敗,傳回值會 INVALID_HANDLE_VALUE。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
言論
使用 CreateFileTransacted傳回的句柄時,請使用檔案 I/O 函式的交易版本,而不是適當的標準檔案 I/O 函式。 如需詳細資訊,請參閱交易式NTFS
開啟交易句柄至目錄時,該句柄必須具有 FILE_WRITE_DATA (FILE_ADD_FILE) 和 FILE_APPEND_DATA (FILE_ADD_SUBDIRECTORY) 許可權。 這些包含在 FILE_GENERIC_WRITE 許可權中。 如果您只是使用句柄來建立檔案或子目錄,則應該開啟具有較少許可權的目錄;否則,可能會發生共享違規。
當該檔案是另一筆交易的一部分時,您無法開啟具有 FILE_EXECUTE 存取層級的檔案(也就是說,另一個應用程式藉由呼叫 CreateFileTransacted來開啟它)。 這表示如果指定存取層級 FILE_EXECUTE 或 FILE_ALL_ACCESS,CreateFileTransacted 會失敗
當非交易的應用程式呼叫 CreateFileTransacted,並針對 lpSecurityAttributes指定 MAXIMUM_ALLOWED 時,每次都會使用相同的存取層級開啟句柄。 當交易的應用程式呼叫 CreateFileTransacted,並針對 lpSecurityAttributes指定 MAXIMUM_ALLOWED 時,會根據交易鎖定檔案,以不同的存取量開啟句柄。 例如,如果呼叫的應用程式具有檔案的存取層級 FILE_EXECUTE,則只有在開啟的檔案未由交易鎖定,或由交易鎖定,而且應用程式已經是該檔案的交易交易讀取器時,才會取得此存取權。
如需交易式作業的完整描述,請參閱 交易式NTFS。
使用 CloseHandle 函式,關閉不再需要句柄時,CreateFileTransacted 傳回的物件句柄,以及在認可或回復交易之前。
某些文件系統,例如 NTFS 檔案系統,支援個別檔案和目錄的壓縮或加密。 在針對該類型檔系統格式化的磁碟區上,新檔案會繼承其目錄的壓縮和加密屬性。
您無法使用 CreateFileTransacted 來控制檔案或目錄的壓縮。 如需詳細資訊,請參閱 檔案壓縮和解壓縮和 檔案加密。
符號連結行為— 如果呼叫此函式會建立新的檔案,則行為不會有任何變更。
如果指定 FILE_FLAG_OPEN_REPARSE_POINT:
- 如果已開啟現有的檔案,而且它是符號連結,傳回的句柄就是符號連結的句柄。
- 如果指定 TRUNCATE_EXISTING 或 FILE_FLAG_DELETE_ON_CLOSE,受影響的檔案就是符號連結。
- 如果已開啟現有的檔案,而且它是符號連結,則傳回的句柄是目標的句柄。
- 如果指定 CREATE_ALWAYS、TRUNCATE_EXISTING或 FILE_FLAG_DELETE_ON_CLOSE,受影響的檔案就是目標。
如先前所述,如果 lpSecurityAttributes 參數 NULL,則應用程式可能建立的任何子進程都無法繼承由 createFileTransacted 所傳回的句柄。 此參數的下列資訊也適用:
- 如果 bInheritHandle 未 FALSE,這是任何非零值,則可以繼承句柄。 因此,如果您不想要繼承句柄,請務必正確初始化此結構成員,以 FALSE。
- 檔案或目錄的預設安全性描述元中的訪問控制清單 (ACL) 會繼承自其父目錄。
- 目標文件系統必須支援檔案和目錄的安全性,
lpSecurityDescriptor 才能對其產生影響,這可以使用 getVolumeInformation
科技 | 支援 |
---|---|
伺服器消息塊 (SMB) 3.0 通訊協定 | 不 |
SMB 3.0 透明故障轉移 (TFO) | 不 |
具有向外延展檔案共用的SMB 3.0(SO) | 不 |
叢集共用磁碟區檔案系統 (CsvFS) | 不 |
復原檔案系統 (ReFS) | 不 |
請注意,SMB 3.0 不支援 TxF。
檔案
如果您嘗試在沒有磁碟驅動器的磁碟驅動器或沒有CD的 CD-ROM 磁碟驅動器上建立檔案,系統會顯示一則訊息,讓使用者插入磁碟或CD。 若要防止系統顯示此訊息,請使用 SEM_FAILCRITICALERRORS呼叫 SetErrorMode 函式。如需詳細資訊,請參閱 建立和開啟檔案。
如果您重新命名或刪除檔案,然後在不久之後加以還原,系統會搜尋快取以取得要還原的檔案資訊。 快取的資訊包含其簡短/長名稱組和建立時間。
如果您在擱置刪除的檔案上呼叫 CreateFileTransacted,因為先前呼叫 DeleteFile,則函式會失敗。 操作系統會延遲刪除檔案,直到檔案的所有句柄都關閉為止。 GetLastError 會傳回 ERROR_ACCESS_DENIED。
dwDesiredAccess 參數可以是零,可讓應用程式在沒有存取檔案的情況下查詢檔案屬性,如果應用程式執行時具有足夠的安全性設定。 這適用於測試檔案是否存在,而不需開啟檔案以進行讀取和/或寫入存取,或取得檔案或目錄的其他統計數據。 請參閱 取得和設定檔案資訊 和 GetFileInformationByHandle。
當應用程式跨網路建立檔案時,最好使用 GENERIC_READ | GENERIC_WRITE,而不是單獨使用 GENERIC_WRITE。 產生的程式代碼較快,因為重新導向器可以使用快取管理員,並傳送較少具有更多數據的SMB。 這種組合也避免了跨網路寫入檔案可能會偶爾傳回 ERROR_ACCESS_DENIED的問題。
檔案數據流
在 NTFS 文件系統上,您可以使用 CreateFileTransacted 在檔案中建立個別的數據流。如需詳細資訊,請參閱 檔案資料流。
目錄
應用程式無法使用 createFileTransacted若要使用 CreateFileTransacted開啟目錄,請將 FILE_FLAG_BACKUP_SEMANTICS 旗標指定為 dwFlagsAndAttributes的一部分。 在不使用 SE_BACKUP_NAME 和 SE_RESTORE_NAME 許可權的情況下使用此旗標時,仍適用適當的安全性檢查。
使用 CreateFileTransacted 在 FAT 或 FAT32 檔系統磁碟區重組期間開啟目錄時,請勿指定 MAXIMUM_ALLOWED 訪問許可權。 如果這樣做,就會拒絕存取目錄。 請改為指定 GENERIC_READ 存取權。
如需詳細資訊,請參閱 關於目錄管理。
注意
winbase.h 標頭會根據 UNICODE 預處理器常數的定義,將 CreateFileTransacted 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winbase.h (包括 Windows.h) |
連結庫 | Kernel32.lib |
DLL | Kernel32.dll |
另請參閱
函式
概觀主題
交易式NTFS 的