Рекомендации по программированию для транзакционной NTFS
Описание различных аспектов программирования для transactional NTFS см. в следующих разделах:
- С какими изменениями файлов выполняется транзакция
- Сжатие
- Создание файла или каталога
- Удаление файла
- Удаление каталога
- Проблемы с блокировкой каталога
- Перечисление каталогов
- Файлы, сопоставленные с памятью
- Именованные потоки
- Переименование файла или каталога
- Точки повторного синтаксического анализа
- Код ошибки
- Зашифрованная файловая система
- Функции файлового ввода-вывода и транзакционные NTFS
С какими изменениями файлов выполняется транзакция
Большинство изменений файлов, таких как изменение содержимого файла, потоков, точек повторного анализа, атрибутов и пространства имен файловой системы, выполняется транзакция. При внесении одного из этих изменений в дескрипторе файла транзакций это изменение изолируется от других транзакций и отменяется при откате транзакции.
Изменения, которые не влияют на содержимое файла, метаданные или пространство имен файловой системы, такие как изменения сжатия или дефрагментации, не обрабатываются. Эти изменения не изолированы от других транзакций и не будут отменены при откате транзакции.
Сжатие
Состояние сжатия файла, открытого в транзакции, изменить нельзя.
Создание файла или каталога
Файл или каталог, созданные в транзакции, не видны ничего за пределами текущей транзакции. Вне этой транзакции любая попытка создать файл с тем же именем завершается сбоем с ошибкой ERROR_TRANSACTIONAL_CONFLICT, фактически резервируя имя файла для фиксации или отката транзакции.
Удаление файла
Файл или каталог, удаленный путем вызова функции DeleteFileTransacted , остается видимым для всех внешних читателей.
Примечание
Все дескрипторы для файла должны быть закрыты до окончания транзакции. Если дескрипторы не были должным образом закрыты, удаление не выполняется. Все открытые дескрипторы файла должны быть закрыты перед выполнением фиксации, чтобы операция удаления считалась частью транзакции. Это связано с тем, что система фактически не удаляет файл, пока последний дескриптор для него не будет закрыт, даже если операция не выполняется в рамках подсистемы файлового ввода-вывода Windows.
Удаление каталога
Каталог, который удаляется путем вызова функции RemoveDirectoryTransacted , остается видимым для всех внешних читателей.
Примечание
Для открытых дескрипторов при транзакциях с каталогом существуют те же ограничения, что и для файлов. Дополнительные сведения см. в разделе Удаление файла.
Проблемы с блокировкой каталога
Если файл изменяется в транзакции, все компоненты каталога пути к файлу называются закрепленными при переименовании до тех пор, пока транзакция не завершится. То есть система не позволяет переименовать их до тех пор, пока транзакция не будет зафиксирована или не будет откатена. Попытка переименовать каталог, который является предком, в файл, измененный в ходе текущей транзакции, завершится ошибкой ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.
Перечисление каталогов
Содержимое каталога может быть изменено во время выполнения перечисления в результате использования интерфейсов API, которые перечисляют, например функций FindFirstFileTransacted и FindNextFile .
Изменения каталога за пределами транзакции не изолируются от транзакции и сразу видны в ней. Например, если модуль записи без транзакций добавляет файл в каталог, новый файл сразу же отображается внутри транзакции, поэтому вызов функции FindFirstFileTransacted или FindNextFile вернет новый файл.
Изменения, внесенные в каталог внутри транзакции, изолируются до фиксации транзакции. Например, файл, созданный в каталоге как часть транзакции. Средство чтения без транзакций, вызывающее функцию FindFirstFile или FindNextFile , не будет видеть только что созданный файл, пока транзакция не будет зафиксирована.
Сопоставленные в памяти файлы
Клиент должен вызвать функцию FlushViewOfFile , закрыть объект сопоставления файлов и закрыть дескриптор файла перед фиксацией связанной транзакции в сопоставленном в памяти файле.
Именованные потоки
Именованные потоки полностью транзакционные, но блокировка выполняется на уровне файла, а не на уровне потока. Записи извне транзакции, которые пытаются изменить любой поток в заблокированном файле, получают ошибку ERROR_SHARING_VIOLATION.
Нельзя переименовать вторичный поток в транзакции.
Переименование файла или каталога
Чтобы переименовать файл как транзакцию, вызовите Метод MoveFileTransacted для перемещения файла.
Точки повторного синтаксического анализа
Изменения точек повторного анализа выполняются сделок. Это означает, что если новая точка повторного анализа назначается файлу в транзакции, она не будет видна для других транзакций. Аналогичным образом изменения или удаление существующей точки повторного просмотра не отображаются до фиксации.
Коды ошибок
Диспетчер транзакций ядра (KTM) использует системные коды ошибок в диапазоне от 6700 до 6799. Транзакционная ntfs (TxF) использует коды ошибок Windows в диапазоне от 6800 до 6899. Дополнительные сведения см. в разделах WinError.h и Коды системных ошибок (6000–8199).
Зашифрованная файловая система
TxF не поддерживает операции с файлами EFS. Вы не можете открыть файл с шифрованием EFS для транзакций. Вызов функции CreateFileTransacted для файла EFS завершится ошибкой ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Аналогичным образом вызов функции EncryptFile для файла в транзакции завершится ошибкой ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.
Функции файлового ввода-вывода и транзакционные NTFS
TxF предоставляет новые функции с транзакцией, которые принимают имя файла и изменяют поведение существующих функций API ввода-вывода файлов, которые принимают дескриптор файла.
Функции с транзакцией
Если вы не вызовете одну из следующих транзакций функций вместо ее версии, не являющейся транзакцией, операция не будет выполняться:
- CopyFileTransacted
- CreateDirectoryTransacted
- CreateFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- DeleteFileTransacted
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- GetCompressedFileSizeTransacted
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
Например, функция CreateFile теперь имеет транзакционные версии: CreateFileTransacted.
Функции файлового ввода-вывода, измененные TxF
В следующей таблице перечислены функции, поведение которых зависит от транзакционной NTFS. Например, поведение функции ReadFile будет зависеть от того, был ли параметр hFile создан функцией CreateFile или Функцией CreateFileTransacted .
Функция | Описание |
---|---|
CloseHandle |
Приложения должны закрыть все дескрипторы, привязанные к транзакции, прежде чем транзакция будет зафиксирована. Приложение должно закрыть транзакционный дескриптор, открытый FILE_FLAG_DELETE_ON_CLOSE перед фиксацией транзакции, чтобы выполнить операцию удаления. |
CreateFileMapping |
Если с hFile связана транзакция, то объект сопоставления файлов, создаваемый этой функцией, будет связан с той же транзакцией. Изменения, внесенные через представления этого объекта сопоставления файлов, выполняются с транзакциями. Приложения должны вызывать FlushViewOfFile, отменять сопоставление всех представлений и закрывать все дескрипторы для объекта сопоставления файлов перед фиксацией транзакций изменений. |
FindNextFile |
Если транзакция привязана к дескриптору перечисления файлов, то к возвращаемым файлам применяются правила изоляции транзакций. |
FSCTL_SET_COMPRESSION |
Невозможно изменить состояние сжатия файла, открытого с помощью CreateFileTransacted. |
GetFileInformationByHandle и GetFileInformationByHandleEx |
Если к дескрипторе файла привязана транзакция, функция возвращает сведения для изолированного представления файла. |
GetFileSize и GetFileSizeEx |
Если к дескрипторе файла привязана транзакция, функция возвращает сведения для изолированного представления файла. |
GetVolumeInformation |
Если том поддерживает транзакции файловой системы, функция возвращает FILE_SUPPORTS_TRANSACTIONS в lpFileSystemFlags. |
MapViewOfFile и MapViewOfFileEx |
Если с дескриптором файла связана транзакция, используемая для создания сопоставляемого объекта сопоставления файлов, то выполняется транзакция связанного представления. Если представление используется для внесения транзакционных изменений в файл, пользователь должен вызвать FlushViewOfFile, закрыть объект сопоставления файлов и закрыть дескриптор файла перед фиксацией связанной транзакции. |
ReadDirectoryChangesW |
Если к дескрипторе каталога привязана транзакция, уведомления отражают изолированное представление каталога. Изменения в файлах за пределами транзакционного представления каталога не включаются в уведомления. |
ReadFile, ReadFileEx и ReadFileScatter |
Если к дескрипторе файла привязана транзакция, то функция возвращает данные из представления файла с транзакциями. Дескриптор чтения с транзакцией гарантированно отображает одно и то же представление файла на протяжении всего дескриптора. |
SetEndOfFile |
Если к дескрипторе привязана транзакция, то выполняется транзакция изменения в позиции конца файла. |
SetFileInformationByHandle |
Если к дескрипторе привязана транзакция, то внесенные изменения будут выполняться для классов сведений FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo и FileDispositionInfo. |
SetFileShortName |
Если к дескрипторе привязана транзакция, то выполняется транзакция по изменению короткого имени файла. |
SetFileTime |
Если к дескрипторе привязана транзакция, то выполняется транзакция по изменению времени файла. |
WriteFile, WriteFileEx и WriteFileGather |
Если к дескрипторе файла привязана транзакция, то выполняется транзакция записи файла. |