Consideraciones de programación para NTFS transaccional
Para obtener una descripción de varias consideraciones de programación para NTFS transaccional, consulte las secciones siguientes:
- ¿Qué cambios de archivo se realizan en las transacciones?
- Compresión
- Crear un archivo o directorio
- Eliminar un archivo
- Eliminación de un directorio
- Problemas de bloqueo de directorios
- Enumeración de directorios
- Archivos asignados a memoria
- Flujos con nombre
- Cambiar el nombre de un archivo o directorio
- Puntos de análisis
- Códigos de error
- Sistema de archivos cifrado
- Funciones de E/S de archivos y NTFS transaccional
¿Qué cambios de archivo se realizan en las transacciones?
La mayoría de los cambios de archivo, como los cambios en el contenido del archivo, las secuencias, los puntos de reanálisis, los atributos y el espacio de nombres del sistema de archivos, se realizan transacciones. Cuando se realiza uno de estos cambios en un identificador de archivo de transacción, el cambio se aísla de otras transacciones y el cambio se deshace si la transacción se revierte.
Los cambios que no afectan al contenido del archivo, los metadatos o el espacio de nombres del sistema de archivos, como los cambios en la compresión o desfragmentación, no se realizan transacciones. Estos cambios no están aislados de otras transacciones y no se deshacen si la transacción se revierte.
Compresión
No se puede cambiar el estado de compresión de un archivo abierto en una transacción.
Crear un archivo o directorio
Un archivo o directorio que se crea en una transacción no es visible para nada fuera de la transacción actual. Fuera de esta transacción, cualquier intento de crear un archivo con el mismo nombre produce un error ERROR_TRANSACTIONAL_CONFLICT, reservando eficazmente el nombre de archivo para cuando la transacción se confirma o se revierte.
Eliminar un archivo
Un archivo o directorio que se elimina llamando a la función DeleteFileTransacted permanece visible para todos los lectores externos.
Nota
Todos los identificadores de transacción en el archivo deben cerrarse antes del final de la transacción. Si los identificadores no están cerrados correctamente, no se produce la eliminación. Todos los identificadores abiertos en el archivo deben cerrarse antes de realizar la confirmación para que la operación de eliminación se considere parte de la transacción. Esto se debe a que el sistema no elimina realmente un archivo hasta que se cierra el último identificador, incluso cuando la operación no se realiza, como parte del subsistema de E/S de archivos de Windows.
Eliminación de un directorio
Un directorio que se elimina llamando a la función RemoveDirectoryTransacted permanece visible para todos los lectores externos.
Nota
Existen las mismas restricciones para los identificadores abiertos en las operaciones de directorio de transacciones que en los archivos. Para obtener más información, consulte Eliminación de un archivo.
Problemas de bloqueo de directorios
Si se modifica un archivo en una transacción, todos los componentes de directorio de la ruta de acceso al archivo se denominan anclados con el cambio de nombre hasta que finaliza la transacción. Es decir, el sistema impide cambiarles el nombre hasta que la transacción se confirma o se revierte. Si intenta cambiar el nombre de un directorio que es un antecesor a un archivo modificado en una transacción en curso, se producirá el error ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.
Enumeración de directorios
El contenido de un directorio se puede cambiar mientras una enumeración está en curso como resultado del uso de las API que enumeran, por ejemplo, las funciones FindFirstFileTransacted y FindNextFile .
Los cambios en un directorio fuera de una transacción no están aislados de la transacción y son visibles inmediatamente dentro de la transacción. Por ejemplo, si un escritor no transaccionado agrega un archivo a un directorio, el nuevo archivo se ve inmediatamente dentro de la transacción de modo que llamar a la función FindFirstFileTransacted o FindNextFile devolverá el nuevo archivo.
Los cambios realizados en un directorio dentro de una transacción están aislados hasta que la transacción se confirma. Por ejemplo, un archivo creado en el directorio como parte de la transacción. Un lector no transaccionado que llame a la función FindFirstFile o FindNextFile no verá el archivo recién creado hasta que se confirme la transacción.
Archivos asignados a memoria
El cliente debe llamar a la función FlushViewOfFile , cerrar el objeto de asignación de archivos y cerrar el identificador de archivo antes de confirmar la transacción asociada en un archivo asignado a memoria.
Flujos con nombre
Las secuencias con nombre son totalmente transaccionales, pero el bloqueo se realiza en el nivel de archivo, no en el nivel de secuencia. Los escritores de fuera de una transacción que intentan modificar cualquier secuencia dentro de un archivo bloqueado reciben el error ERROR_SHARING_VIOLATION.
No se puede cambiar el nombre de una secuencia secundaria en una transacción.
Cambiar el nombre de un archivo o directorio
Para cambiar el nombre de un archivo como una operación de transacción, llame a MoveFileTransacted para mover el archivo.
Puntos de análisis
Los cambios en los puntos de reanálisis se realizan transacciones, lo que significa que si se asigna un nuevo punto de reanálisis a un archivo de una transacción, no es visible para las demás transacciones. De forma similar, los cambios o la eliminación de un punto de reanálisis existente no son visibles hasta la confirmación.
Códigos de error
El Administrador de transacciones de kernel (KTM) usa los códigos de error del sistema en el intervalo comprendido entre 6700 y 6799. NTFS transaccional (TxF) usa códigos de error de Windows en el intervalo de 6800 a 6899. Para obtener más información, consulta WinError.h y Códigos de error del sistema (6000-8199).
Sistema de archivos cifrado
TxF no admite operaciones en archivos EFS. No se puede abrir un archivo cifrado de EFS para las transacciones. Al llamar a la función CreateFileTransacted en un archivo EFS, se producirá el error ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Del mismo modo, al llamar a la función EncryptFile en un archivo de una transacción, se producirá el error ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.
Funciones de E/S de archivos y NTFS transaccional
TxF proporciona nuevas funciones de transacción que toman un nombre de archivo y cambia el comportamiento de las funciones de API de E/S de archivos existentes que toman un identificador de archivo.
Funciones de transacción
Si no llama a una de las siguientes funciones de transacción en lugar de su versión no transaccionada, no se realizará la operación:
- CopyFileTransacted
- CreateDirectoryTransacted
- CreateFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- DeleteFileTransacted
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- GetCompressedFileSizeTransacted
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
Por ejemplo, la función CreateFile ahora tiene una versión de transacción: CreateFileTransacted.
Funciones de E/S de archivos modificadas por TxF
En la tabla siguiente se enumeran las funciones cuyo comportamiento se ve afectado por NTFS transaccional. Por ejemplo, el comportamiento de la función ReadFile variará en función de si el parámetro hFile se creó mediante la función CreateFile o la función CreateFileTransacted .
Función | Descripción |
---|---|
CloseHandle |
Las aplicaciones deben cerrar todos los identificadores enlazados a una transacción antes de confirmar la transacción. Una aplicación debe cerrar un identificador de transacción abierto con FILE_FLAG_DELETE_ON_CLOSE antes de confirmar la transacción para que se produzca la operación de eliminación. |
CreateFileMapping |
Si hay una transacción asociada a hFile, el objeto de asignación de archivos que crea esta función se asociará con la misma transacción. Las modificaciones realizadas a través de vistas de este objeto de asignación de archivos se realizan transacciones. Las aplicaciones deben llamar a FlushViewOfFile, desasignar todas las vistas y cerrar todos los identificadores del objeto de asignación de archivos antes de confirmar los cambios de transacción. |
FindNextFile |
Si hay una transacción enlazada al identificador de enumeración de archivos, los archivos devueltos están sujetos a reglas de aislamiento de transacciones. |
FSCTL_SET_COMPRESSION |
No puede cambiar el estado de compresión de un archivo abierto por CreateFileTransacted. |
GetFileInformationByHandle y GetFileInformationByHandleEx |
Si hay una transacción enlazada al identificador de archivo, la función devuelve información para la vista de archivo aislada. |
GetFileSize y GetFileSizeEx |
Si hay una transacción enlazada al identificador de archivo, la función devuelve información para la vista de archivo aislada. |
GetVolumeInformation |
Si el volumen admite transacciones del sistema de archivos, la función devuelve FILE_SUPPORTS_TRANSACTIONS en lpFileSystemFlags. |
MapViewOfFile y MapViewOfFileEx |
Si hay una transacción asociada al identificador de archivo que se usa para crear el objeto de asignación de archivos que se está asignando, se realiza la transacción de la vista asociada. Si la vista se usa para realizar cambios de transacción en un archivo, el usuario debe llamar a FlushViewOfFile, cerrar el objeto de asignación de archivos y cerrar el identificador de archivo antes de confirmar la transacción asociada. |
ReadDirectoryChangesW |
Si hay una transacción enlazada al identificador de directorio, las notificaciones reflejan la vista aislada del directorio. Los cambios en los archivos fuera de la vista transaccionada del directorio no se incluyen en las notificaciones. |
ReadFile, ReadFileEx y ReadFileScatter |
Si hay una transacción enlazada al identificador de archivo, la función devuelve datos de la vista transaccionada del archivo. Se garantiza que un identificador de lectura transaccionado muestre la misma vista de un archivo mientras dure el identificador. |
SetEndOfFile |
Si hay una transacción enlazada al identificador, se realiza la transacción del cambio en la posición del final del archivo. |
SetFileInformationByHandle |
Si hay una transacción enlazada al identificador, los cambios realizados se realizarán para las clases de información FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo y FileDispositionInfo. |
SetFileShortName |
Si hay una transacción enlazada al identificador, se realiza la transacción del cambio en el nombre corto del archivo. |
SetFileTime |
Si hay una transacción enlazada al identificador, se realiza la transacción del cambio en el tiempo del archivo. |
WriteFile, WriteFileEx y WriteFileGather |
Si hay una transacción enlazada al identificador de archivo, se realiza una transacción de escritura de archivo. |