代码之家  ›  专栏  ›  技术社区  ›  Jobi Joy

xdocument.save()时出现内存异常

  •  3
  • Jobi Joy  · 技术社区  · 15 年前

    我正在尝试将一个xdcoument保存到一个没有足够可用内存空间的拇指驱动器。(这是应用程序的一个特殊测试条件)尽管应用程序给出了下面这样的异常,但我无法在xdocument.save(filepath)周围的try catch块中获得该异常。看起来是一个延迟的投掷。这是LINQ问题还是我做错了什么?.

    alt text http://img211.imageshack.us/img211/8324/exce.png

     System.IO.IOException was unhandled
     Message="There is not enough space on the disk.\r\n"
     Source="mscorlib"
     StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
       at System.IO.FileStream.FlushWrite(Boolean calledFromFinalizer)
       at System.IO.FileStream.Dispose(Boolean disposing)
       at System.IO.FileStream.Finalize()
    
    4 回复  |  直到 11 年前
        1
  •  5
  •   Hans Passant    12 年前

    您在框架中发现了一个错误。save(string)使用“using”语句确保释放输出流。它取决于您在处理指令中使用的编码,但内部system.xml.xmltf8rawtextreader将是实现文本编写器的常见方法。

    错误:编写该类的Microsoft程序员忘记实现Dispose()方法。只实现close()方法。

    奇怪的是,这个错误还没有在connect.microsoft.com反馈网站上报告。它应该在一般使用中引起问题,因为文件在终结器线程运行之前保持打开状态。虽然这通常不会花那么长的时间,几秒钟左右。除非在您的情况下,您在写入后立即退出程序,并且不幸的是,在缓冲区被刷新的确切时刻磁盘空间不足。

    此bug的一个解决方法是使用xdocument.save(textwriter)重载,而传递一个其编码与XML编码匹配的streamwriter。

        2
  •  1
  •   John Saunders Tony    15 年前

    查看堆栈跟踪。此跟踪以finalize调用开始,该调用执行Dispose,该调用执行FlushWrite,后者调用WriteCore,后者获取错误。

    换句话说,首先刷新数据。

    把你用来写的代码贴出来,我们可以告诉你在哪里进行刷新。

        3
  •  0
  •   shahkalpesh    15 年前

    窥视反射镜,最后几行是

     using (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings))
     {
         this.Save(writer);
     }
    

    这意味着,在释放编写器时引发异常。
    我想,最好在呼叫之前检查一下可用的磁盘空间 Save .

    编辑:有你吗? Dispose d调用之前xdocument实例所依赖的任何对象 保存 ?

        4
  •  0
  •   Daryl Gill    11 年前

    XDocument.Save(string) 没有bug,它实现了Dispose方法。using语句是:—(如上所述)

    使用 (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings)) this.Save(writer);

    而xmlWriter确实有一个 Dispose() ,它实现了 IDisposable 接口。