11

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

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

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

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

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

4

4 回答 4

11

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

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

于 2010-02-08T14:39:33.140 回答
2

事务文件系统

于 2010-02-08T14:29:56.433 回答
2

较新版本的 Windows 允许您使用事务

于 2010-02-08T14:30:47.377 回答
1

查看Windows Server 2003 中的后台智能传输服务。它提供了作业的机制,即使在重新启动后也可以暂停和恢复。

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

使用 .NET 和后台智能传输服务 API 编写自动更新应用程序

SharpBITS.NET - BITS API 的包装器

于 2010-02-08T16:37:48.007 回答