我想在解析 XML 文档之前检测它的编码。所以我在堆栈上找到了overflow这个脚本。
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
正确。但它不是!!!! -.-
例如我有字符串 <test></test>
.
开始:0,结束:13
如果我ReadToEnd
或 MoveToContent
然后成功到达终点。 EndOfStream
那么为真。
如果我通过 Seek
重置位置或 Position
到 0(例如)然后是 new StreamReader
始终显示 EndOfStream
是真实的。
问题是 uploadStream
是一个我无法关闭的流。
它是一个 http 上传流的 SharpZipLib 流。所以我不能关闭这个流。我只能使用它。
坏事只是因为Position
和 Seek
不工作...只是因为ReadToEnd
依靠这个Position
. - 否则它会起作用。我想!
也许你可以帮我解决这个问题:-)
非常感谢您!
最佳答案
这种方法从根本上与某些类型的输入流不兼容。流根本不需要支持 Seek
。其实Stream
有一个属性专门检测Seek
是否可用,叫做CanSeek
.代码需要考虑到 Seek
可能会失败。
简单但内存效率不高的方法是将流的内容复制到 MemoryStream
中。那个确实支持 Seek
,然后你可以用它做任何你想做的事。您正在使用 ReadToEnd()
的事实表明数据不是很大以至于内存使用会导致问题,因此您可能可以继续这样做。
注意:如文档所述,如果不支持 Seek
,则应该抛出 NotSupportedException
。看起来您正在处理的流实现不受支持,但未正确实现。我希望至少 CanSeek
为您返回 false
,这样您仍然可以可靠地检测到这一点。
关于C# EndOfStream 始终为真 - 查找/定位到 0 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896215/