交易式 NTFS 的程式設計考慮
如需交易式 NTFS 各種程式設計考慮的描述,請參閱下列各節:
- 交易的檔案變更
- 壓縮
- 建立檔案或目錄
- 刪除檔案
- 刪除目錄
- 目錄鎖定問題
- 目錄列舉
- 記憶體對應檔案
- 具名資料流
- 重新命名檔案或目錄
- 重新剖析點
- 錯誤碼
- 加密檔案系統
- 檔案 I/O 函式和交易式 NTFS
交易的檔案變更
大部分的檔案變更,例如檔案內容的變更、資料流程、重新分析點、屬性和檔案系統命名空間都會交易。 在交易檔案控制代碼上進行其中一項變更時,變更會與其他交易隔離,如果回復交易,則會復原變更。
不會交易不會影響檔案內容、中繼資料或檔案系統命名空間的變更,例如壓縮或重組的變更。 這些變更不會與其他交易隔離,而且如果回復交易,則不會復原這些變更。
壓縮
無法變更在交易中開啟之檔案的壓縮狀態。
建立檔案或目錄
目前交易外部的任何專案都看不到在交易中建立的檔案或目錄。 在此交易之外,任何具有相同名稱的檔案嘗試都會失敗,並出現錯誤 ERROR_TRANSACTIONAL_CONFLICT,有效地在交易認可或回復時保留的檔案名。
刪除檔案
呼叫 DeleteFileTransacted 函式所刪除的檔案或目錄,仍可供所有外部讀取器看見。
注意
所有交易的控制碼都必須在交易結束之前關閉。 如果控制碼未正確關閉,則不會發生刪除。 必須先關閉檔案的所有開啟控制碼,才能執行認可,才能將刪除作業視為交易的一部分。 這是因為系統不會實際刪除檔案,直到關閉它的最後一個控制碼為止,即使作業未交易,也是 Windows 檔案 I/O 子系統的一部分。
刪除目錄
呼叫 RemoveDirectoryTransacted 函式來刪除的目錄仍可供所有外部讀取器看見。
注意
與檔案上相同的交易目錄作業上開啟控制碼的條件約束相同。 如需詳細資訊,請參閱 刪除檔案。
目錄鎖定問題
如果在交易中修改檔案,則會將檔案路徑的所有目錄元件稱為 釘選 到重新命名,直到交易結束為止。 也就是說,系統會防止重新命名,直到認可或回復交易為止。 嘗試將上階的目錄重新命名為在進行中交易中已修改的檔案,將會失敗,並出現錯誤 ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY。
目錄列舉
列舉因為使用列舉而進行中的 API,例如 FindFirstFileTransacted 和 FindNextFile 函式,即可變更目錄的內容。
交易外部目錄的變更不會與交易隔離,而且會在交易內立即顯示。 例如,如果非交易寫入器將檔案新增至目錄,新檔案就會立即顯示在交易內,如此呼叫 FindFirstFileTransacted 或 FindNextFile 函式就會傳回新的檔案。
交易內對目錄所做的變更會隔離,直到交易認可為止。 例如,在目錄中建立的檔案是交易的一部分。 呼叫 FindFirstFile 或 FindNextFile 函式的非交易讀取器在交易認可之前不會看到新建立的檔案。
記憶體對應檔案
用戶端必須呼叫 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 函式行為。
交易函式
如果您未呼叫下列其中一個交易函式來取代其非交易版本,則不會交易作業:
- CopyFileTransacted
- CreateDirectoryTransacted
- CreateFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- DeleteFileTransacted
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- GetCompressedFileSizeTransacted
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
例如, CreateFile 函式現在有交易版本: CreateFileTransacted。
TxF 變更的檔案 I/O 函式
下表列出其行為受到交易式 NTFS 影響的函式。 例如,ReadFile函式的行為會根據hFile 參數是由 CreateFile函式或CreateFileTransacted函式所建立而有所不同。
函式 | 描述 |
---|---|
CloseHandle |
應用程式應該在認可交易之前關閉系結至交易的所有控制碼。 應用程式必須先關閉以 FILE_FLAG_DELETE_ON_CLOSE 開啟的交易控制碼,才能認可交易,才能發生刪除作業。 |
CreateFileMapping |
如果有與 hFile相關聯的交易,則此函式所建立的檔案對應物件將會與相同的交易相關聯。 透過這個檔案對應物件的檢視所做的修改會進行交易。 應用程式必須先呼叫 FlushViewOfFile、取消對應所有檢視,並將所有控制碼關閉至檔案對應物件,才能認可交易的變更。 |
FindNextFile |
如果有系結至檔案列舉控制碼的交易,則傳回的檔案受限於交易隔離規則。 |
FSCTL_SET_COMPRESSION |
您無法變更 CreateFileTransacted所開啟檔案的壓縮狀態。 |
GetFileInformationByHandle和GetFileInformationByHandleEx |
如果有系結至檔案控制代碼的交易,函式會傳回隔離檔案檢視的資訊。 |
GetFileSize和GetFileSizeEx |
如果有系結至檔案控制代碼的交易,函式會傳回隔離檔案檢視的資訊。 |
GetVolumeInformation |
如果磁片區支援檔案系統交易,函式會在lpFileSystemFlags中傳回FILE_SUPPORTS_TRANSACTIONS。 |
MapViewOfFile和MapViewOfFileEx |
如果有與檔案控制代碼相關聯的交易,用來建立正在對應的檔案對應物件,則會交易相關聯的檢視。 如果檢視是用來對檔案進行交易變更,則使用者必須先呼叫 FlushViewOfFile、關閉檔案對應物件,然後關閉檔案控制代碼,再認可相關聯的交易。 |
ReadDirectoryChangesW |
如果有系結至目錄控制碼的交易,則通知會反映目錄的隔離檢視。 在目錄交易檢視以外的檔案變更不會包含在通知中。 |
ReadFile、 ReadFileEx和 ReadFileScatter |
如果有系結至檔案控制代碼的交易,則函式會從檔案的交易檢視傳回資料。 交易讀取控制碼保證會在控制碼期間顯示檔案的相同檢視。 |
SetEndOfFile |
如果交易系結至控制碼,則會交易檔案結尾位置的變更。 |
SetFileInformationByHandle |
如果交易系結至控制碼,則會針對FileBasicInfo、FileRenameInfo、FileAllocationInfo、FileEndOfFileInfo和FileDispositionInfo等資訊類別進行變更。 |
SetFileShortName |
如果交易系結至控制碼,則會交易檔案簡短名稱中的變更。 |
SetFileTime |
如果交易系結至控制碼,則會交易檔案時間的變更。 |
WriteFile、 WriteFileEx和 WriteFileGather |
如果有系結至檔案控制代碼的交易,則會交易檔案寫入。 |