.net - 文件的安全流更新

标签 .net windows

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

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;
}

如果任何东西抛出异常(找不到文件,没有权限),原始文件将保持不变,这就是我们想要的。

但是,代码存在以下问题:

  1. 是否存在 Delete 有效但 Move 失败的真实情况?这将删除原始数据和更新后的数据。这会很糟糕。

  2. 最常见的失败是从另一个应用程序打开源文件,Delete 失败。这意味着所有的更新工作都被丢弃了。有没有办法一开始就查看源文件是否可以删除,如果不能则放弃更新?

  3. 我们有用户将 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/

相关文章:

c# - 如何通过 Javascript 进行回发

c# - 我需要创建一个基于 C# 的 COM 服务器以便在 VBScript 中使用

windows - 如何使 WinHttpCrackUrl 在 64 位中工作

python - 如何将 Pygame 程序编译为 Windows .exe

c# - 系统关闭/重启时的 Windows 服务日志写入

c# - 如何在 VS2008 和 SQL Server CE 上基于现有的 .sdf 文件创建空的本地数据库

.net - 使用 Microsoft.WindowsAzure.StorageClient.TableServicesContext 并检测并发更新冲突

c# - 为性能计数器安装 Total 实例

windows - Heroku 页面 :pull failing to populate schema

c++ - 静态字段初始化顺序