【问题标题】:Atomic file copy under .NET.NET 下的原子文件拷贝
【发布时间】:2011-01-14 09:26:55
【问题描述】:

我正在构建一个使用 System.IO.File.Copy(...) 函数复制文件的服务器应用程序。我的文件可能相当大,因此,如果机器崩溃,它很有可能发生在复制过程中。

重新启动服务后,我应该可以拿起复制任务并继续。如何检测副本是否已成功完成或因服务器崩溃而中断?

我目前的计划是将文件复制到一个临时名称,并在复制完成后将其重命名为最终名称。这样文件命名就能够在崩溃时携带状态信息。

你有什么好的/更好的建议吗?

编辑:目标操作系统是 Win2003,因此事务性 NTFS 不可用

【问题讨论】:

标签: .net file-transfer robustness atomic


【解决方案1】:

查看Background Intelligent Transfer Service in Windows Server 2003。它提供了作业的机制,即使重启也可以暂停和恢复。

以下是一些如何在 .NET 中使用它的示例:

Write Auto-Updating Apps with .NET and the Background Intelligent Transfer Service API

SharpBITS.NET - wrapper for BITS API

【讨论】:

    【解决方案2】:

    其他人建议使用事务性 NTFS,如果您在 Vista 或更高版本上进行部署,这很好。如果您需要支持 XP(或更早版本),那么临时文件后跟一个移动(重命名)是最好的解决方案。

    这个类似问题的答案提供了更多信息: Atomicity of File.Move

    【讨论】:

      【解决方案3】:

      较新版本的 Windows 允许您使用 transactions

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 2020-11-26
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-12
          相关资源
          最近更新 更多