当前位置:  开发笔记 > 开发工具 > 正文

安全流更新文件

如何解决《安全流更新文件》经验,为你挑选了1个好方法。

我们通过将新记录写入临时文件,然后用临时文件替换旧文件来执行大型文本文件的更新.一个严重缩写的版本:

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资源管理器摘要属性(如标题或注释)放在文件上.删除文件时会丢弃这些内容.有没有办法将旧文件的Summary属性复制到新文件?我们应该这样做吗?

Jon Skeet.. 5

避免"删除然后移动失败问题"的正常方法是:

写入file.new

将file.current移动到file.old

将file.new移动到file.current

删除file.new

然后当你来阅读时,如果缺少file.current,则使用file.new,如果你看到则删除file.old.

检查文件是否可用:尝试将其打开以进行写入,但附加到结尾.当然,你需要在移动它之前关闭手柄,而在其他人之间可以打开它 - 但这至少是一个合理的优化.

我不敢确定复制摘要等.



1> Jon Skeet..:

避免"删除然后移动失败问题"的正常方法是:

写入file.new

将file.current移动到file.old

将file.new移动到file.current

删除file.new

然后当你来阅读时,如果缺少file.current,则使用file.new,如果你看到则删除file.old.

检查文件是否可用:尝试将其打开以进行写入,但附加到结尾.当然,你需要在移动它之前关闭手柄,而在其他人之间可以打开它 - 但这至少是一个合理的优化.

我不敢确定复制摘要等.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有