C# EndOfStream 始终为真 - 查找/定位到 0 不起作用

标签 c# c#-4.0 stream inputstream sharpziplib

我想在解析 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

如果我ReadToEndMoveToContent然后成功到达终点。 EndOfStream那么为真

如果我通过 Seek 重置位置或 Position到 0(例如)然后是 new StreamReader始终显示 EndOfStream真实的

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

它是一个 http 上传流的 SharpZipLib 流。所以我不能关闭这个流。我只能使用它。

坏事只是因为PositionSeek不工作...只是因为ReadToEnd依靠这个Position . - 否则它会起作用。我想!

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

非常感谢您!

示例: Example of <code>EndOfStream</code> is true - but the Position is not at the end!

最佳答案

这种方法从根本上与某些类型的输入流不兼容。流根本不需要支持 Seek。其实Stream有一个属性专门检测Seek是否可用,叫做CanSeek .代码需要考虑到 Seek 可能会失败。

简单但内存效率不高的方法是将流的内容复制到 MemoryStream 中。那个确实支持 Seek,然后你可以用它做任何你想做的事。您正在使用 ReadToEnd() 的事实表明数据不是很大以至于内存使用会导致问题,因此您可能可以继续这样做。

注意:如文档所述,如果不支持 Seek,则应该抛出 NotSupportedException。看起来您正在处理的流实现不受支持,但未正确实现。我希望至少 CanSeek 为您返回 false,这样您仍然可以可靠地检测到这一点。

关于C# EndOfStream 始终为真 - 查找/定位到 0 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896215/

相关文章:

c# - 32 位整数按位与

c# - Recaptcha 在 asp.net 中不起作用

javascript - Page.ResolveClientUrl

c# - 通过 C# 控制 VLC

c# - 是否可以检索Word中所有可用的图表模板

mysql - 从使用不同数据库的 DbConnection 派生类

prolog中的流推理/响应式(Reactive)编程?

c# - 联播 .NET 流

java - Elasticsearch 可以流式传输 SearchResponse 吗?

c# - 当ID为GUID时如何从数据库获取最新行