Udostępnij przez


Zagadnienia dotyczące programowania dla transakcyjnego systemu plików NTFS

Opis różnych zagadnień programistycznych dotyczących transakcyjnego systemu plików NTFS można znaleźć w następujących sekcjach:

Które zmiany plików są przetwarzane w ramach transakcji

Większość zmian plików, takich jak zmiany zawartości plików, strumieni, punktów ponownej analizy, atrybutów i przestrzeni nazw systemu plików, jest objęta transakcjami. Gdy jedna z tych zmian zostanie wprowadzona w transakcyjnym dojściu pliku, zmiana jest odizolowana od innych transakcji, a zmiana zostanie cofnięta, jeśli transakcja zostanie wycofana.

Zmiany, które nie wpływają na zawartość pliku, metadane ani przestrzeń nazw systemu plików, takie jak zmiany związane z kompresją lub defragmentacją, nie są objęte transakcjami. Te zmiany nie są odizolowane od innych transakcji i nie są cofane, jeśli transakcja zostanie wycofana.

Kompresja

Nie można zmienić stanu kompresji pliku otwartego w transakcji.

Tworzenie pliku lub katalogu

Plik lub katalog utworzony w transakcji nie jest widoczny dla żadnych elementów spoza bieżącej transakcji. Poza tą transakcją każda próba utworzenia pliku o tej samej nazwie kończy się niepowodzeniem z powodu błędu ERROR_TRANSACTIONAL_CONFLICT, skutecznie rezerwując nazwę pliku dla momentu zatwierdzenia transakcji lub wycofania.

Usuwanie pliku

Plik lub katalog usunięty przez wywołanie funkcji DeleteFileTransacted pozostaje widoczna dla wszystkich czytników zewnętrznych.

Notatka

Wszystkie transakcje dojścia do pliku muszą być zamknięte przed końcem transakcji. Jeśli uchwyty nie są prawidłowo zamknięte, usunięcie nie zostanie wykonane. Wszystkie otwarte dojścia do pliku muszą zostać zamknięte przed wykonaniem zatwierdzenia operacji usuwania, aby została uznana za część transakcji. Dzieje się tak dlatego, że system nie usuwa pliku do czasu zamknięcia ostatniego dojścia, nawet jeśli operacja nie jest przeprowadzana w sposób transakcyjny, jako część podsystemu I/O plików systemu Windows.

Usuwanie katalogu

Katalog usunięty przez wywołanie funkcji RemoveDirectoryTransacted pozostaje widoczny dla wszystkich czytników zewnętrznych.

Notatka

Istnieją te same ograniczenia dla otwartych uchwytów przy operacjach katalogu transakcyjnego, tak jak w przypadku plików. Aby uzyskać więcej informacji, zobacz Usuwanie pliku.

Problemy z blokowaniem katalogów

Jeśli plik jest modyfikowany w transakcji, wszystkie składniki katalogu ścieżki do pliku są określane jako przypięte przed zmianą nazwy do momentu zakończenia transakcji. Oznacza to, że system uniemożliwia zmianę nazw, dopóki transakcja nie zostanie zatwierdzona lub wycofana. Próba zmiany nazwy katalogu, który jest przodkiem pliku zmodyfikowanego w bieżącej transakcji, zakończy się niepowodzeniem z błędem ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Enumeracja katalogów

Zawartość katalogu można zmienić, gdy wyliczenie jest w toku w wyniku użycia interfejsów API, które wyliczają, na przykład funkcje FindFirstFileTransacted i FindNextFile.

Zmiany w katalogu spoza transakcji nie są odizolowane od transakcji i są natychmiast widoczne w ramach transakcji. Na przykład, jeśli pisarz bez transakcji doda plik do katalogu, nowy plik jest natychmiast widoczny wewnątrz transakcji, co powoduje, że wywołanie funkcji FindFirstFileTransacted lub funkcji FindNextFile zwróci nowy plik.

Zmiany wprowadzone w katalogu wewnątrz transakcji są izolowane do momentu zatwierdzenia transakcji. Na przykład plik utworzony w katalogu w ramach transakcji. Bez-transakcyjny czytnik wywołujący funkcję FindFirstFile lub funkcję FindNextFile nie zobaczy nowo utworzonego pliku do momentu zatwierdzenia transakcji.

Memory-Mapped pliki

Klient musi wywołać funkcję FlushViewOfFile, zamknąć obiekt mapowania plików i zamknąć uchwyt pliku przed zatwierdzeniem skojarzonej transakcji w pliku mapowanym na pamięć.

Nazwane strumienie

Nazwane strumienie danych są w pełni transakcyjne, ale blokowanie odbywa się na poziomie pliku, a nie samych strumieni. Autorzy spoza transakcji, którzy próbują zmodyfikować dowolny strumień w zablokowanym pliku, otrzymują błąd ERROR_SHARING_VIOLATION.

Nie można zmienić nazwy strumienia pomocniczego w transakcji.

Zmiana nazwy pliku lub katalogu

Aby zmienić nazwę pliku jako operacji transakcyjnej, wywołaj MoveFileTransacted, aby przenieść plik.

Punkty ponownego analizowania

Zmiany punktów ponownego analizowania są transakcyjne, co oznacza, że jeśli nowy punkt ponownego analizowania zostanie przypisany do pliku w transakcji, nie jest widoczny dla innych transakcji. Podobnie zmiany lub usunięcie istniejącego punktu ponownej analizy nie są widoczne do momentu zatwierdzenia.

Kody błędów

Menedżer transakcji jądra (KTM) używa kodów błędów systemowych w zakresie od 6700 do 6799. Transakcyjny NTFS (TxF) używa kodów błędów systemu Windows w zakresie od 6800 do 6899. Aby uzyskać więcej informacji, zobacz WinError.h i System Error Codes (6000-8199).

Zaszyfrowany system plików

TxF nie obsługuje operacji na plikach EFS. Nie można otworzyć pliku zaszyfrowanego przez system szyfrowania plików (EFS) na potrzeby transakcji. Wywołanie funkcji CreateFileTransacted w pliku EFS zakończy się niepowodzeniem z powodu błędu ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Podobnie wywołanie funkcjiEncryptFile w pliku w transakcji zakończy się niepowodzeniem z powodu błędu ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Funkcje we/wy plików i transakcyjny system plików NTFS

TxF udostępnia nowe funkcje transakcyjne, które przyjmują nazwę pliku, i zmieniają zachowanie istniejących funkcji interfejsu API we/wy plików, które przyjmują dojście do pliku.

Przeprowadzone funkcje

Jeśli nie wywołasz jednej z następujących funkcji transakcyjnych zamiast wersji nietransakcyjnej, operacja nie będzie miała charakteru transakcji.

Na przykład funkcja CreateFile ma teraz wersję transakcyjną: CreateFileTransacted.

Funkcje we/wy plików zmienione przez TxF

W poniższej tabeli wymieniono funkcje, których zachowanie ma wpływ na transakcyjny system plików NTFS. Na przykład zachowanie funkcji ReadFile będzie się różnić w zależności od tego, czy parametr hFile został utworzony przez funkcję CreateFile lub CreateFileTransacted.

Funkcja Opis
CloseHandle
Aplikacje powinny zamknąć wszystkie dojścia powiązane z transakcją, zanim transakcja zostanie zatwierdzona. Aplikacja musi zamknąć transakcyjny uchwyt otwarty z FILE_FLAG_DELETE_ON_CLOSE przed zatwierdzeniem transakcji, aby operacja usuwania mogła się odbyć.
CreateFileMapping
Jeśli istnieje transakcja skojarzona z hFile, obiekt mapowania plików tworzony przez tę funkcję zostanie skojarzony z tą samą transakcją. Modyfikacje wprowadzone za pośrednictwem widoków tego obiektu mapowania plików są przetwarzane w systemie transakcyjnym. Aplikacje muszą wywoływać FlushViewOfFile, odmapować wszystkie widoki i zamknąć wszystkie dojścia do obiektu mapowania plików przed zatwierdzeniem transakcji zmian.
FindNextFile
Jeśli istnieje transakcja powiązana z uchwytem enumeracji plików, zwracane pliki podlegają regułom izolacji transakcji.
FSCTL_SET_COMPRESSION
Nie można zmienić stanu kompresji pliku otwartego przez CreateFileTransacted.
GetFileInformationByHandle i GetFileInformationByHandleEx
Jeśli istnieje transakcja powiązana z dojściem do pliku, funkcja zwraca informacje dla izolowanego widoku pliku.
GetFileSize i GetFileSizeEx
Jeśli istnieje transakcja powiązana z dojściem do pliku, funkcja zwraca informacje dla izolowanego widoku pliku.
GetVolumeInformation
Jeśli wolumin obsługuje transakcje systemu plików, funkcja zwraca FILE_SUPPORTS_TRANSACTIONS w lpFileSystemFlags.
MapViewOfFile i MapViewOfFileEx
Jeśli istnieje transakcja skojarzona z uchwytem pliku użytym do utworzenia mapowanego obiektu, to skojarzony widok jest objęty transakcją. Jeśli widok jest używany do wprowadzania zmian transakcyjnych w pliku, użytkownik musi wywołać FlushViewOfFile, zamknąć obiekt mapowania plików i zamknąć uchwyt pliku przed zatwierdzeniem skojarzonej transakcji.
ReadDirectoryChangesW
Jeśli istnieje transakcja powiązana z dojściem do katalogu, powiadomienia odzwierciedlają izolowany widok katalogu. Zmiany w plikach spoza widoku transakcyjnego katalogu nie są uwzględniane w powiadomieniach.
ReadFile, ReadFileExi ReadFileScatter
Jeśli istnieje transakcja powiązana z dojściem do pliku, funkcja zwraca dane z widoku transakcyjnego pliku. Uchwyty do odczytu transakcyjnego gwarantują wyświetlenie tego samego widoku pliku przez cały okres działania uchwytu.
SetEndOfFile
Jeśli istnieje transakcja powiązana z dojściem, zmiana pozycji końca pliku jest transaktoryzowana.
SetFileInformationByHandle
Jeśli istnieje transakcja powiązana z dojściem, zmiany zostaną przeprowadzone dla klas informacji FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfoi FileDispositionInfo.
SetFileShortName
Jeśli istnieje transakcja powiązana z uchwytem, zmiana krótkiej nazwy pliku jest przeprowadzana w ramach transakcji.
SetFileTime
Jeśli istnieje transakcja powiązana z uchwytem, zmiana czasu pliku jest przeprowadzana w ramach transakcji.
WriteFile, WriteFileExi WriteFileGather
Jeśli istnieje transakcja powiązana z dojściem do pliku, zapis pliku jest transakcyjny.