【发布时间】:2008-11-27 21:22:07
【问题描述】:
我们通过将新记录写入临时文件来执行大型文本文件的更新,然后用临时文件替换旧文件。一个高度缩写的版本:
var tpath = Path.GetTempFileName();
try
{
using (var sf = new StreamReader(sourcepath))
using (var tf = new StreamWriter(tpath))
{
string line;
while ((line = sf.ReadLine()) != null)
tf.WriteLine(UpdateLine(line));
}
File.Delete(sourcepath);
File.Move(tpath, sourcepath);
}
catch
{
File.Delete(tpath);
throw;
}
如果有任何东西抛出异常(找不到文件,没有权限),原始文件保持不变,这就是我们想要的。
但是,代码存在以下问题:
是否存在
Delete有效但Move失败的实际情况?这将删除原始数据和更新数据。这会很糟糕。最常见的故障是从另一个应用程序打开源文件,
Delete失败。这意味着所有更新工作都将被丢弃。有没有办法一开始就查看源文件是否可以删除,如果不可以就放弃更新?我们有用户将 Windows 资源管理器摘要属性(如标题或评论)放在文件上。当我们删除文件时,这些将被丢弃。有没有办法将旧文件的摘要属性复制到新文件?我们应该这样做吗?
【问题讨论】: