Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#EndOfStream始终为真-搜索/定位为0不起作用_C#_C# 4.0_Stream_Inputstream_Sharpziplib - Fatal编程技术网

C#EndOfStream始终为真-搜索/定位为0不起作用

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

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

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

如果I
ReadToEnd
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文档之前检测它的编码。”但没有解释原因,也没有使用除解析之外的编码。