如何将C#.NET TextReader光标重置回起点?

我有一个方法,它接受StringReader实例(从剪贴板读取)或StreamReader实例(从文件读取),并且目前,将一个实例转换为TextReader实例。

我需要它来“预读”一些源输入,然后将光标重置回到开始。 我不一定有原始文件名。 我该怎么做?

提到了System.IO.StreamSeek方法,但是这并没有在TextReader实现,尽管它在StreamReader通过Basestream属性实现。 但是StringReader没有BaseStream属性

这取决于TextReader 。 如果它是StreamReader ,您可以使用:

 sr.BaseStream.Position = 0; sr.DiscardBufferedData(); 

(当然,假设底层流是可搜索的。)

TextReader其他实现可能没有“倒带”的概念,就像IEnumerable那样。 在许多方面,您可以将TextReader视为美化的IEnumerable 。 它有方法一次读取整个数据块,读取行等,但它基本上是一种“前向读取”类型。

编辑:我不相信StringReader支持任何类型的倒带 – 如果可以的话,最好从原始字符串重新创建StringReader 。 如果这不可行,您可以始终创建自己的TextReader类,该类代理对另一个StringReader所有“正常”调用,但在需要时重新创建该代理实例。

如果它是StreamReader ,并且该流支持搜索,则:

  reader.BaseStream.Seek(0, SeekOrigin.Begin); reader.DiscardBufferedData(); 

但是,这在任意TextReader上都是不可能的。 您也许可以将其全部读作字符串,然后可以重复使用StringReader

我遇到了你的post,并且相当沮丧,这是不可能的。 我快速破解了一些有用的东西:完全避免使用stringreader:

 Stream stream = new MemoryStream((new System.Text.ASCIIEncoding().GetBytes(mystring)), false); reader = new StreamReader(stream, new System.Text.ASCIIEncoding()); 

它不漂亮,它使用ASCII(这是我需要的)。 请注意,使用不同的编码时,这将不起作用,因为您将寻找不等于第n个字符的第n个字节。 如果你确实需要,你可以做类似的事情

 Stream stream = new MemoryStream((new System.Text.UTF32Encoding().GetBytes(mystring)), false); reader = new StreamReader(stream, new System.Text.UTF32Encoding()); 

因为UTF32是唯一的固定长度unicode格式。

你现在可以做

 reader.BaseStream.Position = wherever; // or wherever * 4 for the UTF32 variety, // in your case, the beginning of the string, // which is always 0 obviously reader.DiscardBufferedData(); 

寻求,你会发现。

 Seek(0, SeekOrigin.Begin); 

TextReader派生自StreamReaderStreamReader包含BaseStream属性