2011-12-29 80 views
4

下一页线有时破坏XML文件,并创建一个零长度的xml,OutOfMemoryException异常时抛出了。如何防止文件损坏?类型 'System.OutOfMemoryException的' 的阻止保存XML文件时,文件损坏

xmlDoc.Save(filename) 

保存的异常被抛出。 (System.IO.FileStream.Write(Byte [] array,Int32 offset,Int32 count)在System.IO.StreamWriter.Flush(布尔flushStream,布尔 flushEncoder)在System.IO.StreamWriter.Write(Char值) System.Xml.XmlTextWriter.Indent(布尔beforeEndElement)在 System.Xml.XmlTextWriter.AutoComplete(令牌令牌)在 System.Xml.XmlTextWriter.WriteStartElement(字符串前缀,字符串 的localName,串NS)在 System.Xml.XmlDOMTextWriter.WriteStartElement(前缀字符串,字符串 的localName,串NS)在System.Xml.XmlElement.WriteTo(XmlWriter的W) 在System.Xml.XmlElement.WriteContentTo(XmlWriter的重量)在 System.Xml.XmlElement .WriteTo(XmlWriter w)在 System.Xml.XmlDocument.WriteContentTo(XW的XmlWriter)处 System.Xml.XmlDocument.Save(字符串文件名) System.Xml.XmlDocument.WriteTo(XmlWriter的w)的 MainOptions.Save(字符串文件名,ItemOptions选项)

+0

这取决于许多因素,例如您的文档的大小试图保存或者是否有错误。根据您向我们展示的内容,我们无法告诉您。您需要向我们展示一些代码和您试图保存的XML。 – 2011-12-29 09:09:22

+0

文件不是很大5Kb,并且由于项目选项更新而经常保存;单个选项更新错误不会导致文件损坏;在保存期间只有错误会这样做 – walter 2011-12-29 09:18:32

+0

你想防止什么,覆盖以前的副本或错误本身? – Matten 2011-12-29 09:22:59

回答

6

当您将文件保存到filename时,您正在覆盖该文件。 要备份旧的副本,

  • 将其移动到另一个位置(如filename.bak)保存之前和 删除之后
  • 新的文件保存为其他文件(如filename.new)和将其重命名成功

当引发异常时,您可以轻松地还原旧版本/旧版本的xml文件。

1

OutOfMemory Exception

此异常可以通过公共语言运行库时没有足够的内存来分配供内部使用或新的对象实例抛出。为了避免这种异常,避免编程消耗大于或等于64千字节内存的大型方法。

所以,一个可能的原因是要在其中保存XML文档试图大于64KB分配更多的方法。

为了避免腐败“Matten的回答是不够好也乔恩斯基特表明相同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); 
    } 
    } 
+0

64千字节?不要相信你在互联网上阅读的所有内容!如果有64k限制,则不在_allocation_上。 – 2011-12-29 11:20:25

+0

@JasonWilliams公平点,我们如何证明MSDN说谎;)然后我们可以在MSDN下发布我们的数据在社区内容。 – 2011-12-29 11:59:45

0

解决了内存不足的异常...

如果文档很大,有子元素去几如果级别很深,则缩进可能会膨胀文件大小。我发现使用空格的XmlDocument和XmlTextWriter缩进。我已经

参见:http://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.formatting%28v=vs.71%29.aspx

尝试禁用所有缩进,看看是否有所帮助。如果它确实考虑1个字符缩进和重构文件。

+0

是的,你说得对,应该节省一些空间。但这是更大工作的一部分(解决OutOfMemory异常) – walter 2011-12-31 19:31:27

2

同意Matten。另一种解决方案可以将其保存到一个文件之前生成的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(文件名)