5

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();
   }
}

次を設定すると例外が発生します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();
        }
    }
}

streamWriter がコードによって閉じられているため、運が悪いと思います。streamWriter を閉じると、基になるストリームが閉じられますよね?

これを回避する方法はありますか?

ありがとう。

4

2 に答える 2

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();
    }
}

または、独自の閉鎖不可能な MemoryStream をロールアウトして、それを SaveHtml にフィードすることもできます。Dispose は単に Close を呼び出すだけなので、これにより破棄も防止されます。繰り返しますが、私見:

class MemoryStream2 : MemoryStream {
    public override void Close() { }
}
于 2012-07-20T21:00:33.460 に答える