C#EndOfStream始终为真-搜索/定位为0不起作用
我想在解析XML文档之前检测它的编码。所以我在stackoverflow上找到了这个脚本C#EndOfStream始终为真-搜索/定位为0不起作用,c#,c#-4.0,stream,inputstream,sharpziplib,C#,C# 4.0,Stream,Inputstream,Sharpziplib,我想在解析XML文档之前检测它的编码。所以我在stackoverflow上找到了这个脚本 public static XElement GetXMLFromStream(Stream uploadStream) { /** Remember position */ var position = uploadStream.Position; /** Get encoding */ var xmlReader = new XmlTextReader(uploadSt
public static XElement GetXMLFromStream(Stream uploadStream)
{
/** Remember position */
var position = uploadStream.Position;
/** Get encoding */
var xmlReader = new XmlTextReader(uploadStream);
xmlReader.MoveToContent();
/** Move to remembered position */
uploadStream.Seek(position, SeekOrigin.Begin); // with "pos" = 0 it not works, too
uploadStream.Seek(position, SeekOrigin.Current); // if I remove this I have the same issue!
/** Read content with detected encoding */
var streamReader = new StreamReader(uploadStream, xmlReader.Encoding);
var streamReaderString = streamReader.ReadToEnd();
return XElement.Parse(streamReaderString);
}
但它不起作用。
我总是得到EndOfStream
true。但事实并非如此!!!!--
例如,我有字符串
。
开始:0,结束:13
如果IReadToEnd
或MoveToContent
则成功到达终点。EndOfStream
为真
如果我通过Seek
或position
将位置重置为0(例如),则新的StreamReader
始终显示EndOfStream
为true
问题是,uploadStream
是一个我无法关闭的流
它是http上传流的SharpZipLib流。所以我不能关闭这条流。我只能用它工作
而坏的事情只是因为定位
和搜索
不起作用。。。仅因为ReadToEnd
继电器在此位置上
-否则就行了。我想
也许你能帮我解决这个问题。:-)
提前非常感谢
示例:
这种方法基本上与某些类型的输入流不兼容。流根本不需要支持
Seek
。实际上,Stream
有一个属性专门用于检测Seek
是否可用,称为。代码需要考虑到Seek
可能会失败
最简单但内存效率不高的方法是将流的内容复制到MemoryStream
。它确实支持Seek
,然后你可以用它做任何你想做的事情。您使用的是ReadToEnd()
,这一事实表明,数据并不是太大,内存使用不会导致问题,因此您可以直接使用它
注意:如文档所述,如果不支持Seek
,则应该抛出NotSupportedException
。看起来您正在处理的流实现不受支持,但没有正确实现。我希望至少CanSeek
可以为您返回false
,这样您仍然可以可靠地检测到这一点。选项1:
XElement有一个直接从xml流读取的方法。它将在内部为您管理编码。避免使用不必要的字符串会更有效。那么为什么不使用这个呢
XElement.Load(uploadStream);
备选案文2:
如果您确实想使用字符串,请不要使用新的XmlTextReader()。XmlTextReader.Create()具有更多功能,请改为执行以下操作:
var xmlReader = XmlTextReader.Create(uploadStream);
var streamReaderString = xmlReader.ReadOuterXml();
return XElement.Parse(streamReaderString);
CanSeek
在所有情况下都是正确的。我也不例外。这就是为什么我在这里问你。也许是SharpZipLib的一个bug?@Patrick是的,这就是我担心的,也是为什么我把我的便条包括在内。这看起来确实像是实现中的一个bug,但解决方法是一样的:将所有内容复制到内存流中,它应该可以正常工作。非常感谢@hvd,我发现了同样的问题,等等,它可以工作了!zip流肯定会混淆问题。网络流不支持查找,如果从中读取字节,则它们将无法恢复地丢失。除非你自己用记忆流来缓冲它们。这可能会占用大量内存,您可能需要将其写入临时文件。很好的调用,OP确实会声明“我想在解析XML文档之前检测它的编码。”但没有解释原因,也没有使用除解析之外的编码。