Alternativas ao uso de NTFS Transacional

Dado que a Microsoft temNTFS transacional obsoleto (TxF):

A Microsoft recomenda enfaticamente que os desenvolvedores utilizem meios alternativos para atender às necessidades do seu aplicativo. Muitos cenários para os quais o TxF foi desenvolvido podem ser alcançados através de técnicas mais simples e prontamente disponíveis. Além disso, o TxF pode não estar disponível em versões futuras do Microsoft Windows.

Embora o TxF seja um poderoso conjunto de APIs, tem havido um interesse extremamente limitado do desenvolvedor nesta plataforma de API desde o Windows Vista, principalmente devido à sua complexidade e várias nuances que os desenvolvedores precisam considerar como parte do desenvolvimento de aplicativos. Como resultado, a Microsoft está considerando a suspensão de uso de APIs TxF em uma versão futura do Windows para concentrar esforços de desenvolvimento e manutenção em outros recursos e APIs que tenham mais valor para uma grande maioria de clientes.

Isso significa que eu preciso de uma alternativa para:

CreateTransactionMoveFileTransactedCommitTransaction

Meus requisitos transacionados são bastante simples - mova dois arquivos:

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);
}

Eu pensei em transformarMoveFile para dentroCopyFile + DeleteFile:

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

DeleteFile(testResults);
DeleteFile(cdcResponse);

Mas eu estava esperando por umBoa solução, não uma solução com bugs. Então eu tento novamente:

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);
}

Exceto eu estava esperando por umBoa solução, não um buggy.

questionAnswers(2)

yourAnswerToTheQuestion