保存xml文件时防止文件损坏

时间:2011-12-29 09:04:56

标签: c# .net

当抛出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)

4 个答案:

答案 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)

OutOfMemory Exception

当没有足够的内存分配用于内部目的或新对象实例时,公共语言运行库可以抛出此异常。为避免此异常,避免编写消耗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个字符缩进和重组文件。