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.
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. –