BaseStream を閉じずに StreamWriter を閉じる方法はありますか? 質問する

BaseStream を閉じずに StreamWriter を閉じる方法はありますか? 質問する

根本的な問題は、が をusing呼び出すと、 も破棄されることです( の場合と同じ問題)。DisposeStreamWriterBaseStreamClose

これに対する回避策はありますが、ご覧のとおり、ストリームのコピーが必要になります。ストリームをコピーせずにこれを行う方法はありますか?

この目的は、文字列の内容 (元々はデータベースから読み取られたもの) をストリームに取得し、そのストリームをサードパーティのコンポーネントで読み取ることができるようにすることです。
注意: サードパーティのコンポーネントを変更できません。

public System.IO.Stream CreateStream(string value)
{
    var baseStream = new System.IO.MemoryStream();
    var baseCopy = new System.IO.MemoryStream();
    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
    {
        writer.Write(value);
        writer.Flush();
        baseStream.WriteTo(baseCopy); 
    }
    baseCopy.Seek(0, System.IO.SeekOrigin.Begin);
    return baseCopy;
}

使用されます

public void Noddy()
{
    System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
    My3rdPartyComponent.ReadFromStream(myStream);
}

理想的には、私は と呼ばれる架空の方法を探していますBreakAssociationWithBaseStream。例えば

public System.IO.Stream CreateStream_Alternate(string value)
{
    var baseStream = new System.IO.MemoryStream();
    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
    {
        writer.Write(value);
        writer.Flush();
        writer.BreakAssociationWithBaseStream();
    }
    return baseStream;
}

ベストアンサー1

.NET Framework 4.5以降を使用している場合は、StreamWriterオーバーロードを使用すると、ライターが閉じられたときにベースストリームを開いたままにすることができます。

.NET Framework 4.5より前のバージョンでは、StreamWriter 想定するストリームを所有します。オプション:

  • 廃棄しないでStreamWriter、そのまま流してください。
  • Close/への呼び出しを無視し、他のすべてをプロキシするストリームラッパーを作成しますDispose。その実装はその他ユーティリティそこから取得したい場合は、

おすすめ記事