我如何克隆MemoryStream对象?

时间:2012-12-19 22:03:08

标签: c# stream xmlreader 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...

         }
 }

3 个答案:

答案 0 :(得分:5)

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

newMemoryStream.Position = 0;
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确实在您希望的位置。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

您可以使用以下扩展方法克隆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;
}