小编典典

有什么方法可以关闭StreamWriter而不关闭其BaseStream吗?

c#

我的根本问题是,在using调用DisposeStreamWriter,它还会处理BaseStream(与相同的问题Close)。

我对此有一个解决方法,但是如您所见,它涉及复制流。有什么方法可以执行此操作而不复制流?

这样做的目的是将字符串的内容(最初从数据库中读取)放入流中,以便可以由第三方组件读取该流。
注意 :我无法更改第三方组件。

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

阅读 309

收藏
2020-05-19

共1个答案

小编典典

如果使用的是.NET Framework
4.5或更高版本,则存在StreamWriter重载,使用该重载可以要求在关闭writer时要求基本流保持打开状态

在4.5之前的.NET Framework的早期版本中,StreamWriter 假定 它拥有流。选项:

  • 不要处理StreamWriter; 冲洗一下即可。
  • 创建一个流包装器,该包装器将忽略对Close/的调用,Dispose但将代理所有其他内容。如果您想从那里获取它,我可以在MiscUtil中实现。
2020-05-19