gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:32:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com