C#EndOfStream始终为true – Seek / Position to 0不起作用

我想在解析之前检测XML文档的编码.所以我在*上找到了这个脚本.

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(例如),则新的StreamReader显示EndOfStream始终为true.

问题是uploadStream是一个我无法关闭的流.

它是http上传流的SharpZipLib流.所以我无法关闭这个流.我只能使用它.

而坏事只是因为Position和Seek不起作用……只是因为ReadToEnd继续这个位置. – 否则它会起作用.我认为!

也许你可以帮我解决这个问题:-)

非常感谢您提前!

例:
C#EndOfStream始终为true  –  Seek / Position to 0不起作用

解决方法:

这种方法从根本上与某些类型的输入流不兼容. Streams根本不需要支持Seek.实际上,Stream有一个专门用于检测Seek是否可用的属性,称为CanSeek. Code需要考虑Seek可能会失败.

简单但不是非常节省内存的方法是将流的内容复制到MemoryStream中.那个人确实支持Seek,然后你可以随心所欲地做任何事情.您使用ReadToEnd()这一事实表明数据不是很大,以至于内存使用会导致问题,因此您可能只需要使用它.

注意:如文档所述,如果不支持Seek,则应该抛出NotSupportedException.它看起来像你正在处理的流实现,它不受支持,但没有正确实现.我希望至少CanSeek会为你返回false,所以你仍然可以可靠地检测到它.

上一篇:使用SharpZIpLib写的压缩解压操作类


下一篇:SharpZipLib压缩中文文件,解压后文件名乱码