有什么办法可以在不closuresBaseStream的情况下closuresStreamWriter?

我的根本问题是,当在StreamWriterusing调用Dispose时,它也会处理BaseStream (与Close相同的问题)。

我有一个解决方法,但你可以看到,它涉及复制stream。 有没有办法做到这一点,而不复制stream?

这样做的目的是将string(最初从数据库中读取)的内容转换为stream,以便第三方组件可以读取该stream。
注意 :我无法更改第三方组件。

 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重载,通过该重载,您可以要求基本stream在closures写入器时保持打开状态 。

在早于4.5版本的早期版本的.NET Framework中, StreamWriter 假定它拥有该stream。 选项:

  • 不要丢弃StreamWriter ; 只是冲洗它。
  • 创build一个忽略调用Close / Dispose的stream包装器,但代理其他所有东西。 我有一个MiscUtil的实现,如果你想从那里抓住它。

.NET 4.5有新的方法!

http://msdn.microsoft.com/EN-US/library/gg712853(v=VS.110,d=hv.2).aspx

 public StreamWriter( Stream stream, Encoding encoding, int bufferSize, bool leaveOpen ) 

只要不要在StreamWriter上调用Dispose 。 这个类可以丢弃的原因不是因为它拥有非托pipe资源,而是允许处理本身可能拥有非托pipe资源的stream。 如果底层stream的生命在别处处理,则不需要处置作者。

内存stream具有即使在closuresstream时也可以使用的ToArray属性。 数组写入stream内容到一个字节数组,无论Position属性如何。 您可以根据您写入的stream创build新的stream。

 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); } var returnStream = new System.IO.MemoryStream( baseCopy.ToArray()); return returnStream; } 

您需要创buildStreamWriter的后代并覆盖它的dispose方法,通过总是将false传递给disposing参数,它将强制streamwriter不closures,StreamWriter只是在close方法中调用dispose,所以不需要重写它(当然你可以添加所有的构造函数,如果你想,我只有一个):

 public class NoCloseStreamWriter : StreamWriter { public NoCloseStreamWriter(Stream stream, Encoding encoding) : base(stream, encoding) { } protected override void Dispose(bool disposing) { base.Dispose(false); } }