.NET下的原子文件复制
我正在构建一个使用 System.IO.File.Copy(...) 函数复制文件的服务器应用程序。我的文件可能相当大,因此,如果机器崩溃,很有可能是在复制过程中发生的。
重新启动服务后,我应该能够拾取复制任务并继续。如何检测复制是否已成功完成或因服务器崩溃而中断?
我当前的计划是将文件复制到临时名称,复制完成后将其重命名为最终名称。这样,文件命名就能够携带崩溃时的状态信息。
您有什么好的/更好的建议吗?
编辑:目标操作系统是 Win2003,因此事务性 NTFS 不可用
I am building a server app that copies files using System.IO.File.Copy(...) function. My files can be rather large, therefore, it has a fair chance that if the machine crashes, it happens during copying.
After restarting the service, I should be able to pick up the copy tasks and continue. How can I detect if a copy has been successfully completed or interrupted by server crash?
My current plan is to copy the files to a temporary name and once copying completed rename it to the final name. This way the file naming is able to carry the state information over the crash.
Do you have any good/better suggestions?
EDIT: Target OS is Win2003, therefore transactional NTFS is not available
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
其他人建议使用事务性 NTFS,如果您在 Vista 或更高版本上部署,则可以使用该 NTFS。如果您需要支持 XP(或更早版本),那么临时文件然后移动(重命名)是最好的解决方案。
这个类似问题的答案提供了更多信息:
File.Move 的原子性
Other have suggested transactional NTFS which is fine if you're deploying on Vista or later. If you need to support XP (or earlier) then temporary file followed by a move (rename) is the best solution.
The answer to this similar question provides more info:
Atomicity of File.Move
事务性文件系统。
Transactional file system.
较新版本的 Windows 允许您使用事务。
Newer versions of Windows allow you to use transactions .
请查看Windows Server 2003 中的后台智能传输服务。它提供了作业的机制,即使重启后也可以暂停和恢复作业。
以下是如何在 .NET 中使用它的一些示例:
编写自动更新应用程序使用 .NET 和后台智能传输服务 API
SharpBITS.NET - 包装器比特API
Check out Background Intelligent Transfer Service in Windows Server 2003. It provides the mechanism of jobs, which can be paused and resumed even after restart.
Here are a few samples how to use it with .NET:
Write Auto-Updating Apps with .NET and the Background Intelligent Transfer Service API
SharpBITS.NET - wrapper for BITS API