【发布时间】:2010-04-20 19:38:31
【问题描述】:
是否有另一个进程监视使用 XMLDocument.Save() 创建的文件可能会遇到部分文件?如果 Save() 覆盖现有文件有什么不同吗?
【问题讨论】:
标签: c# .net xmldocument
是否有另一个进程监视使用 XMLDocument.Save() 创建的文件可能会遇到部分文件?如果 Save() 覆盖现有文件有什么不同吗?
【问题讨论】:
标签: c# .net xmldocument
如果你像这样保存,你应该没有任何问题。
using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
xmlDoc.Save(file);
}
【讨论】:
我不认为有任何原子性保证。你不应该依赖它。
【讨论】:
一般来说,写文件不是原子的。查看Process Monitor 了解操作系统公开的内容。
XmlDocument.Save(string) 使用 FileShare.Read。 ChaosPandion 的解决方案指定 FileShare.None。查看 MSDN 上的 System.IO.FileShare 了解不同之处。
【讨论】:
这个答案https://stackoverflow.com/a/487198/1429390 以易于使用的方式为 AFAIK 提供了某种原子性。原则是写入一个临时文件,并为调用者提供在关闭时重命名文件(以及您想要的任何其他内容)的机会。这样,在创建和填充文件时可能发生的任何事情都不会破坏可能存在的文件。
更新:除了它不是因为 System.IO.File.Move() 拒绝覆盖。请参阅https://stackoverflow.com/a/10305475/1429390 了解解决方法。
【讨论】: