我们通过将新记录写入临时文件来执行大型文本文件的更新,然后用临时文件替换旧文件。一个大大简化的版本:
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 资源管理器摘要属性(如标题或评论)放在文件上。当我们删除文件时,这些将被丢弃。有没有办法将旧文件的摘要属性复制到新文件?我们应该这样做吗?
最佳答案
避免“删除然后移动失败问题”的正常方法是:
- 写入file.new
- 将 file.current 移动到 file.old
- 将 file.new 移动到 file.current
- 删除文件.new
然后当你来阅读时,如果 file.current 丢失,则使用 file.new,如果你看到它,则删除 file.old。
检查文件是否可用:尝试打开它进行写入,但附加到末尾。当然,您需要先关闭 handle ,然后再移动它,中间其他人可以打开它 - 但这至少是一个合理优化。
我不确定是否要复制摘要等。
关于.net - 文件的安全流更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324670/