使用事务性NTFS的替代方案

7
鉴于微软已经废弃了Transactional NTFS (TxF):
微软强烈建议开发者使用替代方法来实现应用程序的需求。许多TxF为之开发的场景可以通过更简单、更易得的技术来实现。此外,TxF可能在未来的Windows版本中不再可用。
虽然TxF是一组强大的API,但自Windows Vista以来,由于其复杂性和各种细微差别,开发人员对这个API平台的兴趣极为有限,这导致微软正在考虑在未来的Windows版本中废弃TxF API,将开发和维护工作集中在其他具有更大价值的功能和API上,以满足更多客户的需求。
这意味着我需要一个替代方案:

我的事务要求非常简单 - 移动两个文件:

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

我考虑将 MoveFile 转化为 CopyFile + DeleteFile

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

DeleteFile(testResults);
DeleteFile(cdcResponse);

但我希望得到一个好的解决方案,而不是有缺陷的解决方案。所以我再试一次:

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

除非我希望得到一个好的解决方案,而不是有漏洞的方案。

2个回答

5

从链接中:

因此,微软正在考虑废弃TxF API

它还没有死!我不知道为什么他们会删除Windows的原子文件系统API,即使它还没有得到广泛支持。首先应该有一个.NET BCL来方便使用TxF。对于网络复制,应该实现类似TxF的支持,这将非常棒。

如果有什么问题,微软应该改进API!


2
我同意。但我们现在所处的位置就是现在。 - Ian Boyd
1
我们目前正在使用这个来实现那个目标。https://github.com/goldfix/Transactional-NTFS-TxF-.NET 它适用于File.Move,这是我们唯一使用它的功能。 - Terence

3
.NET事务性文件管理器一个尝试。它使用起来非常简单且安全。下面是该页面上的示例。甚至作者似乎很负责并能够通过添加新的有用功能来扩展库。
// 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();
} 

如果您有兴趣拥有自己的事务管理器,请务必查看这篇文章。如果您仔细检查上述库,您会发现它是这样实现的。


2
我查看了源代码。 "回滚" 仍然归结为 File.Delete(path);;这可能无法删除文件的问题。 "真正的" 解决方案涉及使用 CreateFile,并重新实现 CopyFile,以便您可以在后期信号处理程序关闭时删除文件。但是,如果与事务完整性相关的问题不是首要考虑因素(而且我正在使用.NET),我会使用类似于此的东西。已接受。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接