.NET Transactional File Manager
Estamos acostumados a usar transações sempre que trabalhamos com banco de dados, mesmo pra quem usa um ORM como o Entity Framework, que cria as transações implicitamente. Isso tudo pra garantir que nossas alterações sejam atomicas, evitando pedidos de compra sem itens, um débito sem um crédito, um pagamento de salário sem marcá-lo como pago, etc.
Esse processo fica mais complicado quando temos arquivos em disco envolvidos, por exemplo, um processo onde se insere uma linha no banco e move um arquivo, principalmente dentro de um laço. Se ocorrer uma exception de disco cheio no 10º arquivo, como fazer pra voltar os 9 anteriores ao local original? Tratar manualmente não parece muito confiável e limpo.
Pra estes casos existe uma biblioteca chamada .NET Transactional File Manager, é bem simples e funciona praticamente sem overhead, implementando a interface IEnlistmentNotification, permitindo participar de uma transação do System.Transactions.Transaction.
A biblioteca não usa o Transactional NTFS, o que permite o uso no Windows XP e Windows Server 2003, por isso também não faz uso do DTC.
Então a biblioteca não é confiavel? Depende! Da maneira que ela funciona não vai garantir o Rollback em caso de falha de hardware ou se o processo for finalizado, ela funciona automatizando o que teriamos que tratar manualmente se a transação for cancelada, movendo de volta os arquivos, apagando o que foi copiado ou criado, etc. No meu caso é o suficiente. Se for necessário usar Transactional NTFS existe a biblioteca AlphaFS.
A utilização é muito simples, parecido com a classe File, só não é static, não sei o motivo.
new TxFileManager().Move(fonte, destino);