当抛出OutOfMemoryException时,下一行有时会破坏xml文件并创建零长度xml。如何防止文件损坏?
xmlDoc.Save(filename)
抛出了类型'System.OutOfMemoryException'的异常 - 异常。 保存在System.IO.FileStream.Write(Byte []数组,Int32偏移量,Int32 count)at System.IO.StreamWriter.Flush(Boolean flushStream,Boolean flushEncoder)在System.IO.StreamWriter.Write(Char值)处 System.Xml.XmlTextWriter.Indent(Boolean beforeEndElement)at System.Xml.XmlTextWriter.AutoComplete(令牌令牌)at System.Xml.XmlTextWriter.WriteStartElement(String prefix,String localName,String ns)at System.Xml.XmlDOMTextWriter.WriteStartElement(String prefix,String System.Xml.XmlElement.WriteTo(XmlWriter w)中的localName,String ns) 在System.Xml.XmlElement.WriteContentTo(XmlWriter w)at System.Xml.XmlElement.WriteTo(XmlWriter w)at System.Xml.XmlDocument.WriteContentTo(XmlWriter xw)at System.Xml.XmlDocument.WriteTo(XmlWriter w)at System.Xml.XmlDocument.Save(String filename)at MainOptions.Save(String filename,ItemOptions options)
答案 0 :(得分:6)
当您将文件保存到filename
时,您将覆盖该文件。
要备份旧副本,
filename.bak
)
之后将其删除或 filename.new
),并在成功时将其重命名抛出异常时,您可以轻松恢复旧版/旧版xml文件。
答案 1 :(得分:2)
同意Matten。替代解决方案可以在将xml字符串保存到文件之前生成xml字符串:
Using ms As New MemoryStream
xmlDoc.Save(ms)
Using outStream As FileStream = File.Open(filename,
FileMode.Create, FileAccess.Write, FileShare.Read)
ms.WriteTo(outStream)
End Using
End Using
使用流来匹配xmlDoc.Save(filename)
答案 2 :(得分:1)
当没有足够的内存分配用于内部目的或新对象实例时,公共语言运行库可以抛出此异常。为避免此异常,避免编写消耗64或更多千字节内存的大型方法。
因此,一个可能的原因可能是您保存XML文档的方法是尝试分配超过64KB。
为了避免腐败,“Matten”的答案也足够好,Jon skeet也建议同样here。
但是我想在执行此操作时使用锁来添加进一步的安全检查
private static readonly object locker = new object();
public static void OnlyOneCallerAllowed()
{
lock (locker)
{
string tempFileName = System.IO.Path.GetTempFileName();
xmlDoc.Save(tempFileName);
File.Move(original_file, original_file.old);
File.Move(tempFileName,original_file);
File.Delete( tempFileName);
}
}
答案 3 :(得分:0)
解决OutOfMemory异常......
如果您的文档很大并且子元素的深度很深,那么缩进可能会使文件大小膨胀。我发现XmlDocument与XmlTextWriter使用空格缩进。我已经
了请参阅:http://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.formatting%28v=vs.71%29.aspx
尝试禁用所有缩进,看看这是否有帮助。如果它确实考虑了1个字符缩进和重组文件。