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:
CreateTransaction
MoveFileTransacted
CommitTransaction
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.