Share via


交易式 NTFS 的程式設計考慮

如需交易式 NTFS 各種程式設計考慮的描述,請參閱下列各節:

交易的檔案變更

大部分的檔案變更,例如檔案內容的變更、資料流程、重新分析點、屬性和檔案系統命名空間都會交易。 在交易檔案控制代碼上進行其中一項變更時,變更會與其他交易隔離,如果回復交易,則會復原變更。

不會交易不會影響檔案內容、中繼資料或檔案系統命名空間的變更,例如壓縮或重組的變更。 這些變更不會與其他交易隔離,而且如果回復交易,則不會復原這些變更。

壓縮

無法變更在交易中開啟之檔案的壓縮狀態。

建立檔案或目錄

目前交易外部的任何專案都看不到在交易中建立的檔案或目錄。 在此交易之外,任何具有相同名稱的檔案嘗試都會失敗,並出現錯誤 ERROR_TRANSACTIONAL_CONFLICT,有效地在交易認可或回復時保留的檔案名。

刪除檔案

呼叫 DeleteFileTransacted 函式所刪除的檔案或目錄,仍可供所有外部讀取器看見。

注意

所有交易的控制碼都必須在交易結束之前關閉。 如果控制碼未正確關閉,則不會發生刪除。 必須先關閉檔案的所有開啟控制碼,才能執行認可,才能將刪除作業視為交易的一部分。 這是因為系統不會實際刪除檔案,直到關閉它的最後一個控制碼為止,即使作業未交易,也是 Windows 檔案 I/O 子系統的一部分。

刪除目錄

呼叫 RemoveDirectoryTransacted 函式來刪除的目錄仍可供所有外部讀取器看見。

注意

與檔案上相同的交易目錄作業上開啟控制碼的條件約束相同。 如需詳細資訊,請參閱 刪除檔案

目錄鎖定問題

如果在交易中修改檔案,則會將檔案路徑的所有目錄元件稱為 釘選 到重新命名,直到交易結束為止。 也就是說,系統會防止重新命名,直到認可或回復交易為止。 嘗試將上階的目錄重新命名為在進行中交易中已修改的檔案,將會失敗,並出現錯誤 ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY

目錄列舉

列舉因為使用列舉而進行中的 API,例如 FindFirstFileTransactedFindNextFile 函式,即可變更目錄的內容。

交易外部目錄的變更不會與交易隔離,而且會在交易內立即顯示。 例如,如果非交易寫入器將檔案新增至目錄,新檔案就會立即顯示在交易內,如此呼叫 FindFirstFileTransactedFindNextFile 函式就會傳回新的檔案。

交易內對目錄所做的變更會隔離,直到交易認可為止。 例如,在目錄中建立的檔案是交易的一部分。 呼叫 FindFirstFileFindNextFile 函式的非交易讀取器在交易認可之前不會看到新建立的檔案。

記憶體對應檔案

用戶端必須呼叫 FlushViewOfFile 函式、關閉檔案對應物件,並在記憶體對應檔案上認可相關聯的交易之前關閉檔案控制代碼。

具名資料流

具名資料流程是完全交易式的,但鎖定是在檔案層級完成,而不是資料流程層級。 嘗試修改鎖定檔案內任何資料流程的交易外部寫入器會收到錯誤 ERROR_SHARING_VIOLATION

您無法在交易中重新命名次要資料流程。

重新命名檔案或目錄

若要將檔案重新命名為交易作業,請呼叫 MoveFileTransacted 來移動檔案。

重新剖析點

重新分析點的變更會進行交易,這表示如果新的重新分析點指派給交易中的檔案,則其他交易看不到它。 同樣地,在認可之前,不會顯示現有重新分析點的變更或移除。

錯誤碼

核心交易管理員 (KTM) 會使用 6700 到 6799 範圍中的系統錯誤碼。 交易式 NTFS (TxF) 會在 6800 到 6899 的範圍內使用 Windows 錯誤碼。 如需詳細資訊,請參閱 WinError.h 和系統錯誤碼 (6000-8199) 。

加密檔案系統

TxF 不支援 EFS 檔案上的作業。 您無法開啟交易的 EFS 加密檔案。 在 EFS 檔案上呼叫 CreateFileTransacted 函式將會失敗,並出現錯誤 ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION。 同樣地,在交易中的檔案上呼叫 EncryptFile 函式將會失敗,並出現錯誤 ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION

檔案 I/O 函式和交易式 NTFS

TxF 提供採用檔案名的新交易函式,並變更採用檔案控制代碼的現有檔案 I/O API 函式行為。

交易函式

如果您未呼叫下列其中一個交易函式來取代其非交易版本,則不會交易作業:

例如, CreateFile 函式現在有交易版本: CreateFileTransacted

TxF 變更的檔案 I/O 函式

下表列出其行為受到交易式 NTFS 影響的函式。 例如,ReadFile函式的行為會根據hFile 參數是由 CreateFile函式或CreateFileTransacted函式所建立而有所不同。

函式 描述
CloseHandle
應用程式應該在認可交易之前關閉系結至交易的所有控制碼。 應用程式必須先關閉以 FILE_FLAG_DELETE_ON_CLOSE 開啟的交易控制碼,才能認可交易,才能發生刪除作業。
CreateFileMapping
如果有與 hFile相關聯的交易,則此函式所建立的檔案對應物件將會與相同的交易相關聯。 透過這個檔案對應物件的檢視所做的修改會進行交易。 應用程式必須先呼叫 FlushViewOfFile、取消對應所有檢視,並將所有控制碼關閉至檔案對應物件,才能認可交易的變更。
FindNextFile
如果有系結至檔案列舉控制碼的交易,則傳回的檔案受限於交易隔離規則。
FSCTL_SET_COMPRESSION
您無法變更 CreateFileTransacted所開啟檔案的壓縮狀態。
GetFileInformationByHandleGetFileInformationByHandleEx
如果有系結至檔案控制代碼的交易,函式會傳回隔離檔案檢視的資訊。
GetFileSizeGetFileSizeEx
如果有系結至檔案控制代碼的交易,函式會傳回隔離檔案檢視的資訊。
GetVolumeInformation
如果磁片區支援檔案系統交易,函式會在lpFileSystemFlags中傳回FILE_SUPPORTS_TRANSACTIONS
MapViewOfFileMapViewOfFileEx
如果有與檔案控制代碼相關聯的交易,用來建立正在對應的檔案對應物件,則會交易相關聯的檢視。 如果檢視是用來對檔案進行交易變更,則使用者必須先呼叫 FlushViewOfFile、關閉檔案對應物件,然後關閉檔案控制代碼,再認可相關聯的交易。
ReadDirectoryChangesW
如果有系結至目錄控制碼的交易,則通知會反映目錄的隔離檢視。 在目錄交易檢視以外的檔案變更不會包含在通知中。
ReadFileReadFileExReadFileScatter
如果有系結至檔案控制代碼的交易,則函式會從檔案的交易檢視傳回資料。 交易讀取控制碼保證會在控制碼期間顯示檔案的相同檢視。
SetEndOfFile
如果交易系結至控制碼,則會交易檔案結尾位置的變更。
SetFileInformationByHandle
如果交易系結至控制碼,則會針對FileBasicInfo、FileRenameInfoFileAllocationInfoFileEndOfFileInfoFileDispositionInfo等資訊類別進行變更。
SetFileShortName
如果交易系結至控制碼,則會交易檔案簡短名稱中的變更。
SetFileTime
如果交易系結至控制碼,則會交易檔案時間的變更。
WriteFileWriteFileExWriteFileGather
如果有系結至檔案控制代碼的交易,則會交易檔案寫入。