MemoryStream麻烦

Joh*_*ell 5 .net c# memorystream stream

我在使用MemoryStream时遇到了一些麻烦

我们正在使用第三方电子表格组件(类似于excel),我正在尝试将数据保存为他们通过以下SaveHtml方法支持的html .根据他们的文档看起来非常简单.这是我的代码:

using (var memoryStream = new MemoryStream())
{
   this.ActiveSheet.SaveHtml(memoryStream);

   memoryStream.Position = 0;

   using (var streamReader = new StreamReader(memoryStream))
   {
       var htmlData = streamReader.ReadToEnd();
   }
}
Run Code Online (Sandbox Code Playgroud)

当我设置时,我得到一个例外memoryStream.Position = 0:

System.ObjectDisposedException: Cannot access a closed Stream.

快速浏览一下Reflector中的SaveHtml方法,可以看到以下相关内容:

public void SaveHtml(Stream stream)
{
    StreamWriter writer = null;

    try
    {
        writer = new StreamWriter(stream) { AutoFlush = true };

        writer.Write(str);
    }   
    finally
    {
        if (writer != null)
        {
            writer.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜是因为streamWriter被他们的代码关闭了,我们运气不好.关闭streamWriter,关闭底层Stream,对吧?

有办法解决这个问题吗?

谢谢.

use*_*188 6

它似乎有效,因此您可以创建另一个内存流.提取缓冲区时不会复制任何字节.

using (var memoryStream = new MemoryStream()) {
    this.ActiveSheet.SaveHtml(memoryStream);
    var buffer = memoryStream.GetBuffer();
    using (var memoryStream2 = new MemoryStream(buffer))
    using (var streamReader = new StreamReader(memoryStream2)) {
        var htmlData = streamReader.ReadToEnd();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以推出自己的不可关闭的MemoryStream并将其提供给SaveHtml.这也会阻止它的处理,因为Dispose只是调用Close.再次,imho:

class MemoryStream2 : MemoryStream {
    public override void Close() { }
}
Run Code Online (Sandbox Code Playgroud)