如何克隆MemoryStream对象?

我有一个MemoryStream对象,它由Stream类型参数传递
Stream是C#中的抽象类)。

我想克隆他,并创建另一个MemoryStream对象的一侧与原始的当前位置,并创建一个新的XMLReader ,所以我将能够阅读其内容。

这就是我做的,它不起作用(调试标有// * – > newReader{None}值)
假设 :您在方法内部并具有Stream currentStream引用。

 var x = new XmlReaderSettings(); x.IgnoreWhitespace = true; using (var newMemoryStream = new MemoryStream()) { stream.CopyTo(newMemoryStream); using (var newReader = XmlReader.Create(newMemoryStream,x)) //* { Doing some stuff... } } 

确保重置newMemoryStream上的位置, newMemoryStream所示:

 newMemoryStream.Position = 0; 

stream.CopyTo(newMemoryStream);之后stream.CopyTo(newMemoryStream); 但在创建XmlReader之前

所以整个事情应该是这样的:

 var x = new XmlReaderSettings(); x.IgnoreWhitespace = true; using (var newMemoryStream = new MemoryStream()) { stream.CopyTo(newMemoryStream); newMemoryStream.Position = 0; using (var newReader = XmlReader.Create(newMemoryStream,x)) //* { Doing some stuff... } } 

此外,由于您在输入此方法之前在原始流上使用其他阅读器,请确保源流的Position确实在您希望的Position

我解决了我的问题! 🙂
缺少的东西标有//* 。 这是应该是的代码:

 var xmlReaderSettings = new XmlReaderSettings(); stream.Position = 0;//* xmlReaderSettings.IgnoreWhitespace = true; using (var newMemoryStream = new MemoryStream()) { stream.CopyTo(newMemoryStream); newMemoryStream.Position = 0; //* using (var newReader = XmlReader.Create(newMemoryStream, xmlReaderSettings)) { newReader.MoveToContent(); //* Doing some stuff... } } 

您可以使用以下扩展方法克隆MemoryStream ,包括其当前位置,并确保克隆后原始MemoryStream的位置重置为其原始位置:

 public static MemoryStream Clone(this MemoryStream ms) { var pos = ms.Position; var ms2 = new MemoryStream(); ms.CopyTo(ms2); ms.Position = pos; ms2.Position = pos; return ms2; }