【问题标题】:Is XMLDocument.Save an atomic operation?XMLDocument.Save 是原子操作吗?
【发布时间】:2010-04-20 19:38:31
【问题描述】:

是否有另一个进程监视使用 XMLDocument.Save() 创建的文件可能会遇到部分文件?如果 Save() 覆盖现有文件有什么不同吗?

【问题讨论】:

    标签: c# .net xmldocument


    【解决方案1】:

    如果你像这样保存,你应该没有任何问题。

    using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
    {
        xmlDoc.Save(file);
    }
    

    【讨论】:

      【解决方案2】:

      我不认为有任何原子性保证。你不应该依赖它。

      【讨论】:

      • 如何保存一个临时文件然后重命名它?重命名可以自动完成,还是文件系统不能以这种方式工作?
      • 我认为重命名就可以了。这取决于你想要多少“保证”。如果您想要一个“真正的”保证,那么您需要在文档中查看操作是原子的声明。您可能需要使用 Reflector 查看 .NET 代码以了解 Win32 调用它的内容,然后研究这些调用是否是原子的。否则,意识到在同一卷上从一个目录重命名到另一个目录实际上只是创建一个新的目录条目并删除旧的目录条目,这可能就足够了。并不复杂,而且可能是原子的。
      【解决方案3】:

      一般来说,写文件不是原子的。查看Process Monitor 了解操作系统公开的内容。

      XmlDocument.Save(string) 使用 FileShare.Read。 ChaosPandion 的解决方案指定 FileShare.None。查看 MSDN 上的 System.IO.FileShare 了解不同之处。

      【讨论】:

        【解决方案4】:

        这个答案https://stackoverflow.com/a/487198/1429390 以易于使用的方式为 AFAIK 提供了某种原子性。原则是写入一个临时文件,并为调用者提供在关闭时重命名文件(以及您想要的任何其他内容)的机会。这样,在创建和填充文件时可能发生的任何事情都不会破坏可能存在的文件。

        更新:除了它不是因为 System.IO.File.Move() 拒绝覆盖。请参阅https://stackoverflow.com/a/10305475/1429390 了解解决方法。

        【讨论】:

          猜你喜欢
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 2016-11-05
          • 2015-01-10
          相关资源
          最近更新 更多