我有一个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...
}
}
答案 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;
}