Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per una descrizione delle varie considerazioni di programmazione per NTFS transazionale, vedere le sezioni seguenti:
- quali modifiche ai file vengono transazionate
- Compressione
- Creazione di un file o di una directory
- Eliminazione di un file
- L'eliminazione di una directory
- Problemi di blocco delle directory
- di enumerazione directory
- Memory-Mapped File
- flussi denominati
- Ridenominazione di file o directory
- Punti di Ricomposizione
- Codici di Errore
- file system crittografato
- Funzioni di I/O dei file e NTFS transazionale e
- Funzioni di Transazione
- Le funzioni di I/O dei file modificate da TxF
Quali modifiche ai file vengono transazionate
La maggior parte delle modifiche ai file, come modifiche al contenuto del file, ai flussi, ai punti di reparse, agli attributi e allo spazio dei nomi del file system, avviene tramite transazioni. Quando una di queste modifiche viene apportata su un handle di file transazionale, la modifica viene isolata da altre transazioni e la modifica viene annullata se viene eseguito il rollback della transazione.
Le modifiche che non influiscono sul contenuto, sui metadati o sullo spazio dei nomi del file system, ad esempio le modifiche alla compressione o alla deframmentazione, non vengono transazionate. Queste modifiche non sono isolate da altre transazioni e non vengono annullate se viene eseguito il rollback della transazione.
Compressione
Impossibile modificare lo stato di compressione di un file aperto in una transazione.
Creazione di un file o di una directory
Un file o una directory creata in una transazione non è visibile a nulla all'esterno della transazione corrente. All'esterno di questa transazione, qualsiasi tentativo di creare un file con lo stesso nome ha esito negativo con l'errore ERROR_TRANSACTIONAL_CONFLICT, riservando effettivamente il nome del file quando la transazione esegue il commit o viene eseguito il rollback.
Eliminazione di un file
Un file o una directory eliminata chiamando la funzione DeleteFileTransacted rimane visibile a tutti i lettori esterni.
Nota
Tutti gli handle transazionati nel file devono essere chiusi prima della fine della transazione. Se gli handle non sono chiusi correttamente, la cancellazione non avviene. Tutti gli handle aperti sul file devono essere chiusi prima di eseguire il commit affinché l'operazione di eliminazione sia considerata parte della transazione. Ciò è dovuto al fatto che il sistema non elimina effettivamente un file fino a quando non viene chiuso l'ultimo handle, anche quando l'operazione non è soggetta a transazione, come parte del sottosistema I/O di file di Windows.
Eliminazione di una directory
Una directory eliminata chiamando la funzione RemoveDirectoryTransacted rimane visibile a tutti i lettori esterni.
Nota
Esistono gli stessi vincoli per gli handle aperti nelle operazioni di directory transazionate come nei file. Per altre informazioni, vedere Eliminazione di un file.
Problemi di blocco della directory
Se un file viene modificato in una transazione, tutti i componenti della directory del percorso del file sono bloccati contro la rinomina fino al termine della transazione. Ovvero, il sistema impedisce di rinominarli finché non viene eseguito il commit o il rollback della transazione. Un tentativo di rinominare una directory che è un antenato di un file che è stato modificato durante una transazione in corso avrà esito negativo con l'errore ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.
Esplorazione directory
Il contenuto di una directory può essere modificato mentre è in corso un'enumerazione in seguito all'uso di API che enumera, ad esempio le funzioni FindFirstFileTransacted e FindNextFile.
Le modifiche apportate a una directory all'esterno di una transazione non sono isolate dalla transazione e sono immediatamente visibili all'interno della transazione. Ad esempio, se un writer non transazionale aggiunge un file a una directory, il nuovo file è immediatamente visibile all'interno della transazione in modo che la chiamata al FindFirstFileTransacted o alla funzione FindNextFile restituirà il nuovo file.
Le modifiche apportate a una directory all'interno di una transazione vengono isolate fino al commit della transazione. Ad esempio, un file creato nella directory come parte della transazione. Un lettore non transazionale che chiama la funzione FindFirstFile o , funzione FindNextFile, non visualizzerà il file appena creato fino al consolidamento della transazione.
Memory-Mapped file
Il client deve chiamare la funzione FlushViewOfFile, chiudere l'oggetto di mapping dei file e chiudere l'handle di file prima di eseguire il commit della transazione associata in un file mappato alla memoria.
Flussi denominati
I flussi denominati sono completamente transazionali, ma il blocco viene eseguito a livello di file, non a livello di flusso. Gli utenti esterni a una transazione che tentano di modificare qualsiasi flusso all'interno di un file bloccato ricevono l'errore ERROR_SHARING_VIOLATION.
Non è possibile rinominare un flusso secondario in una transazione.
Ridenominazione di un file o di una directory
Per rinominare un file come operazione transazionata, chiamare MoveFileTransacted per spostare il file.
Reparse Points
Le modifiche ai punti di rianalisi sono soggette a transazione, il che significa che se a un file viene assegnato un nuovo punto di rianalisi in una transazione, non è visibile alle altre transazioni. Analogamente, le modifiche o la rimozione di un punto reparse esistente non sono visibili fino al commit.
Codici di errore
Kernel Transaction Manager (KTM) usa i codici di errore di sistema compresi nell'intervallo compreso tra 6700 e 6799. NTFS transazionale (TxF) usa codici di errore di Windows compresi nell'intervallo compreso tra 6800 e 6899. Per altre informazioni, vedere Codici errore di sistema e WinError.h (6000-8199).
File system crittografato
TxF non supporta le operazioni sui file EFS. Non è possibile aprire un file crittografato EFS per le transazioni. La chiamata alla funzione diCreateFileTransactedin un file EFS avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Analogamente, la chiamata alla funzione EncryptFile su un file in una transazione avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.
Funzioni di I/O dei file e NTFS transazionale
TxF fornisce nuove funzioni transazionate che accettano un nome file e modificano il comportamento delle funzioni API di I/O di file esistenti che accettano un handle di file.
Funzioni transazionate
Se non si chiama una delle funzioni transazionate seguenti al posto della versione non transazionata, l'operazione non verrà eseguita:
- CopiaFileTransato
- CreateDirectoryTransacted
- CreaFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- EliminaFileTransazionale
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- OttieniDimensioneFileCompressaTransazionata
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
Ad esempio, la funzione CreateFile ha ora una versione transazionale: CreateFileTransacted.
Funzioni di I/O dei file modificate da TxF
Nella tabella seguente sono elencate le funzioni il cui comportamento è interessato da NTFS transazionale. Ad esempio, il comportamento della funzioneReadFilevaria a seconda che il parametro hFile sia stato creato dalla funzioneCreateFileo dalla funzione CreateFileTransacted.
| Funzione | Descrizione |
|---|---|
|
CloseHandle |
Le applicazioni devono chiudere tutti gli handle associati a una transazione prima del commit della transazione. Un'applicazione deve chiudere un handle transazionale aperto con FILE_FLAG_DELETE_ON_CLOSE prima di eseguire il commit della transazione affinché l'operazione di eliminazione venga eseguita. |
|
CreateFileMapping |
Se è presente una transazione associata a hFile, l'oggetto di mapping di file creato da questa funzione verrà associato alla stessa transazione. Le modifiche apportate tramite le viste di questo oggetto di mapping di file vengono transazionate. Le applicazioni devono chiamare FlushViewOfFile, annullare il mapping di tutte le viste e chiudere tutti gli handle all'oggetto di mapping dei file prima di eseguire il commit delle modifiche transazionate. |
|
FindNextFile |
Se è presente una transazione associata all'handle di enumerazione file, i file restituiti sono soggetti a regole di isolamento delle transazioni. |
|
FSCTL_SET_COMPRESSION |
Non è possibile modificare lo stato di compressione di un file aperto da CreateFileTransacted. |
|
GetFileInformationByHandle e GetFileInformationByHandleEx |
Se è presente una transazione associata all'handle di file, la funzione restituisce informazioni per la visualizzazione file isolata. |
|
GetFileSize e GetFileSizeEx |
Se è presente una transazione associata all'handle di file, la funzione restituisce informazioni per la visualizzazione file isolata. |
|
GetVolumeInformation |
Se il volume supporta le transazioni di file system, la funzione restituisce FILE_SUPPORTS_TRANSACTIONS in lpFileSystemFlags. |
|
MapViewOfFile e MapViewOfFileEx |
Se esiste una transazione associata all'handle di file utilizzato per creare l'oggetto di mapping del file, allora anche la vista associata è transazionata. Se la vista viene usata per apportare modifiche transazionali a un file, l'utente deve chiamare FlushViewOfFile, chiudere l'oggetto di mappatura del file e chiudere l'handle del file prima di eseguire il commit della transazione associata. |
|
ReadDirectoryChangesW |
Se è presente una transazione associata all'handle di directory, le notifiche riflettono la visualizzazione isolata della directory. Le modifiche apportate ai file all'esterno della visualizzazione transazionata della directory non sono incluse nelle notifiche. |
|
ReadFile, ReadFileExe ReadFileScatter |
Se è presente una transazione associata all'handle di file, la funzione restituisce i dati dalla vista transazionale del file. È garantito che un handle di lettura transazionato mostri la stessa visione di un file per tutta la durata dell'handle. |
|
SetEndOfFile |
Se è presente una transazione associata all'handle, viene eseguita la modifica nella posizione di fine del file. |
|
SetFileInformationByHandle |
Se è presente una transazione associata all'handle, le modifiche apportate verranno transazionate per le classi di informazioni FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfoe FileDispositionInfo. |
|
ImpostaNomeBreveFile |
Se è presente una transazione associata all'handle, viene eseguita la modifica nel nome breve del file. |
|
SetFileTime |
Se è presente una transazione associata all'handle, la modifica dell'ora del file viene eseguita in modo transazionale. |
|
WriteFile, WriteFileExe WriteFileGather |
Se è presente una transazione associata all'handle di file, viene eseguita la transazione di scrittura del file. |