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,对吧?
有办法解决这个问题吗?
谢谢.
它似乎有效,因此您可以创建另一个内存流.提取缓冲区时不会复制任何字节.
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)
| 归档时间: |
|
| 查看次数: |
4289 次 |
| 最近记录: |