7

鉴于 Microsoft 已弃用 Transactional NTFS (TxF)

Microsoft 强烈建议开发人员使用替代方法来满足您的应用程序的需求。开发 TxF 的许多场景都可以通过更简单、更容易获得的技术来实现。此外,TxF 可能在 Microsoft Windows 的未来版本中不可用。

虽然 TxF 是一组功能强大的 API,但自 Windows Vista 以来,开发人员对该 API 平台的兴趣极为有限,这主要是由于其复杂性和开发人员在应用程序开发中需要考虑的各种细微差别。因此,Microsoft 正在考虑在未来版本的 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);
}

除了我希望有一个好的解决方案,而不是一个错误的解决方案。

4

2 回答 2

5

从链接:

因此,Microsoft 正在考虑弃用 TxF API

它还没死!我不知道他们为什么要删除 Windows 的原子文件系统 API,即使它还没有得到很大的支持。应该有一个 .NET BCL 以便于使用 TxF 作为初学者。对网络副本的 TxF 样式支持也很棒。

如果有的话,微软应该改进 API!

于 2014-07-08T01:07:54.680 回答
3

试试.NET Transactional File Manager。安全使用它相当简单。页面中的以下示例显示了该方式。甚至看起来作者反应灵敏,并且能够使用新的有用功能扩展库。

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

如果您对自己的事务管理器感兴趣,请务必查看这篇文章。如果你仔细检查上面提到的库,你会发现它是这样实现的。

于 2013-08-08T11:46:50.233 回答