问题 .NET下的原子文件复制


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

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

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

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

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


7209
2018-02-08 14:18


起源

也可以看看: stackoverflow.com/questions/15274861/file-move-atomic-operation - Uwe Keim


答案:


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

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


10
2018-02-08 14:39





事务性文件系统


2
2018-02-08 14:29





较新版本的Windows允许您使用 交易 。


2
2018-02-08 14:30





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

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

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

SharpBITS.NET - BITS API的包装器


1
2018-02-08 16:37