一千萬個為什麽

搜索

有沒有辦法在不關閉BaseStream的情況下關閉StreamWriter?

我的根本問題是當使用StreamWriter 上調用 Dispose 時,它還會處理 BaseStream (同樣的問題與<�代碼>關閉</代碼>)。

我有一個解決方法,但正如你所看到的,它涉及復制流。有沒有辦法這樣做而不復制流?

這樣做的目的是將字符串的內容(最初從數據庫中讀取)放入流中,以便第三方組件可以讀取該流。
NB :我無法更改第三方組件。

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

最佳答案

如果您使用的是.NET Framework 4.5或更高版本,則有一個 StreamWriter重載,使用它可以在編寫器關閉時讓基本流保持打開狀態

在4.5之前的早期版本的.NET Framework中, StreamWriter 假設它擁有該流。選項:

  • 不要丟棄 StreamWriter ;只是沖洗它。
  • 創建一個流包裝器,它忽略對 Close / Dispose 的調用,但代理其他所有內容。我在 MiscUtil 中有一個實現,如果你想從那裏抓取它。

轉載註明原文: 有沒有辦法在不關閉BaseStream的情況下關閉StreamWriter?