How can I clone MemoryStream object?

2019-06-17 14:04发布

I have a MemoryStream object which is passed by Stream type parameter
(Stream is abstract class in C#).

I want to clone him and to create another MemoryStream object a side with current position of the original and to create also a new XMLReader out of it, so I will be able to read its content.

This is what I did, and it's not working (debugging the line marked with //* -> newReader has got {None} value)
Assumption: you are inside a method and have Stream currentStream reference.

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...

         }
 }

3条回答
Root(大扎)
2楼-- · 2019-06-17 14:47

Make sure to reset the position on newMemoryStream like so:

newMemoryStream.Position = 0;

after stream.CopyTo(newMemoryStream); but before creating the XmlReader

So the whole thing should look like this:

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

Also, since you're using another reader on the original stream prior to entering this method, make sure that the Position of the source stream is really where you want it to be.

查看更多
smile是对你的礼貌
3楼-- · 2019-06-17 14:50

You can use the following extension method to clone a MemoryStream, including its current position, and ensure the position of the original MemoryStream is reset to its original position after cloning:

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;
}
查看更多
劫难
4楼-- · 2019-06-17 14:59

I have solved my problem! :)
The things which were missing are marked with //*. Here is the code as it should be:

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...
    }
}
查看更多
登录 后发表回答