2012-11-16 6 views
5

Biorąc pod uwagę, że Microsoft ma deprecated Transactional NTFS (TxF):Alternatywy użyciu transakcyjny NTFS

Microsoft zaleca programistom wykorzystać alternatywne środki w celu osiągnięcia potrzeb aplikacji. Wiele scenariuszy, dla których opracowano TxF, można osiągnąć dzięki prostszym i łatwiej dostępnym technikom. Ponadto TxF może nie być dostępny w przyszłych wersjach systemu Microsoft Windows.

O ile TxF to potężny zestaw interfejsów API, to od tej pory platforma API była bardzo ograniczona pod względem zainteresowania programistów od czasu systemu Windows Vista, głównie ze względu na złożoność i różne niuanse, które deweloperzy muszą wziąć pod uwagę przy tworzeniu aplikacji. W związku z tym Microsoft rozważa wycofanie interfejsów API TxF w przyszłej wersji systemu Windows, aby skupić się na pracach nad programowaniem i konserwacją innych funkcji i interfejsów API, które mają większą wartość dla większej większości klientów.

To oznacza, że ​​muszę alternatywę:

Moi transakcji wymagania są dość proste - przenieść dwa pliki:

tx = BeginTransaction(); 
{ 
    MoveFile(testResults, testResultsArchive); //throws if there's a problem 
    MoveFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

    CommitTransaction(tx); 
} 
finally 
{ 
    CloseHandle(tx); 
} 

Myślałem o włączeniu MoveFile do CopyFile + DeleteFile:

CopyFile(testResults, testResultsArchive); //throws if there's a problem 
CopyFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

DeleteFile(testResults); 
DeleteFile(cdcResponse); 

ale miałem nadzieję na dobry rozwiązania, a nie rozwiązanie buggy. Więc spróbuj ponownie:

CopyFile(testResults, testResultsArchive); //throws if there's a problem 
CopyFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

try 
{ 
    DeleteFile(testResults); 
} 
catch (Exception e) 
{ 
    DeleteFile(testResultsArchive); 
    throw e; 
} 
try 
{ 
    DeleteFile(cdcResponse); 
} 
catch (Exception e) 
{ 
    DeleteFile(cdcResponseArchive); 
} 

wyjątkiem miałem nadzieję na rozwiązanie dobry, a nie jeden buggy.

Odpowiedz

3

Spróbuj, aby spróbować .NET Transactional File Manager. Jest dość prosty w obsłudze. Poniższy przykład ze strony pokazuje drogę. Wygląda nawet na to, że autor reaguje i jest w stanie rozszerzyć bibliotekę o nowe przydatne funkcje.

// Wrap a file copy and a database insert in the same transaction 
TxFileManager fileMgr = new TxFileManager(); 
using (TransactionScope scope1 = new TransactionScope()) 
{ 
    // Copy a file 
    fileMgr.Copy(srcFileName, destFileName); 

    // Insert a database record 
    dbMgr.ExecuteNonQuery(insertSql); 

    scope1.Complete(); 
} 

W przypadku zainteresowania w swoim własnym menedżerem transakcyjnej, należy sprawdzić this artykuł. Jeśli dokładnie przejrzysz wyżej wspomnianą bibliotekę, przekonasz się, że jest ona wdrożona właśnie w ten sposób.

+1

Zajrzałam do źródła. "Cofanie" nadal sprowadza się do "File.Delete (path);'; który cierpi na problem, być może nie może usunąć pliku. Rozwiązanie * "prawdziwe" * polega na użyciu 'CreateFile' i ponownym zaimplementowaniu' CopyFile', dzięki czemu można [retroaktywnie sygnalizować uchwyt, aby "usunąć plik, gdy uchwyt jest zamknięty"] (http://stackoverflow.com/ pytania/14572272/how-to-un-createfile). Ale jeśli problemy związane z integralnością transakcyjną nie byłyby głównym problemem (i używałem .NET), użyłbym czegoś takiego. Przyjęty. –

3

z linku:

W rezultacie Microsoft rozważa deprecjację API TXF

jeszcze nie jest martwy! Nie wiem, dlaczego mieliby usunąć API systemu plików atomowych dla Windows, nawet jeśli nie jest to jeszcze w dużej mierze obsługiwane. Powinien istnieć .NET BCL dla łatwej obsługi, wykorzystujący TxF na początek. Obsługa stylu TxF dla kopii sieciowych również byłaby świetna.

Jeśli już, Microsoft powinien ulepszyć API!

+2

Zgadzam się. Ale jesteśmy tam, gdzie jesteśmy. –