XMLDocument.Save是一个原子操作吗?

时间:2010-04-20 19:38:32

标签: c# .net xmldocument

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

编写文件通常不是原子的。查看Process Monitor以了解操作系统公开的内容。

XmlDocument.Save(string)使用 FileShare.Read 。 ChaosPandion的解决方案指定 FileShare.None 。查看MSDN上的System.IO.FileShare以获得差异。

答案 3 :(得分:0)

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

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