restaurar - ¿Cómo se restablece un cursor de C#.NET TextReader al punto de inicio?
restaurar pc de fabrica windows 10 (4)
Tengo un método que toma una instancia de StringReader
(lectura desde el portapapeles) o una instancia de StreamReader
(lectura de un archivo) y, en la actualidad, TextReader
cualquiera de ellas como una instancia de TextReader
.
Lo necesito para ''leer previamente'' parte de la entrada de la fuente, luego restablecer el cursor al inicio. No necesariamente tengo el nombre original. ¿Cómo hago esto?
Se menciona el método Seek
de System.IO.Stream
pero esto no se implementa en TextReader
, aunque se encuentra en StreamReader
través de la propiedad Basestream
. Sin embargo, StringReader
no tiene una propiedad BaseStream
Busca y encontrarás.
Seek(0, SeekOrigin.Begin);
TextReader
se deriva de StreamReader
. StreamReader
contiene una propiedad BaseStream
Depende del TextReader
. Si es un StreamReader
, puedes usar:
sr.BaseStream.Position = 0;
sr.DiscardBufferedData();
(Suponiendo que la secuencia subyacente es buscable, por supuesto).
Es posible que otras implementaciones de TextReader
no tengan un concepto de "rebobinado", del mismo modo que IEnumerable<T>
no lo tiene. En muchos sentidos, puede pensar en TextReader
como un IEnumerable<char>
glorificado. Tiene métodos para leer fragmentos enteros de datos a la vez, leer líneas, etc., pero es fundamentalmente un tipo de "lectura directa".
EDITAR: no creo que StringReader
admita ningún tipo de rebobinado; sería mejor recrear el StringReader
de la cadena original, si puede. Si eso no es posible, siempre podría crear su propia clase TextReader
que TextReader
todas las llamadas "normales" a otro StringReader
, pero que StringReader
crear esa instancia de proxy cuando sea necesario.
Me topé con tu publicación y me decepcionó que esto no fuera posible. He pirateado algo rápido que funciona: simplemente evita el lector de cuerdas por completo:
Stream stream = new MemoryStream((new System.Text.ASCIIEncoding().GetBytes(mystring)), false);
reader = new StreamReader(stream, new System.Text.ASCIIEncoding());
No es bonito, y usa ASCII (que era lo que necesitaba de todos modos). Tenga en cuenta que, con una codificación diferente, esto no funcionará, ya que buscará el n. ° byte que no tiene el mismo carácter. Si necesitas hacer algo como
Stream stream = new MemoryStream((new System.Text.UTF32Encoding().GetBytes(mystring)), false);
reader = new StreamReader(stream, new System.Text.UTF32Encoding());
Como UTF32 es el único formato Unicode de longitud fija.
Ahora puedes hacer
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();
Si es un StreamReader
, y si esa secuencia soporta la búsqueda, entonces:
reader.BaseStream.Seek(0, SeekOrigin.Begin);
reader.DiscardBufferedData();
Sin embargo, esto no es posible en TextReader
s arbitrario. Tal vez podría leerlo todo como una cadena, ¿entonces puede usar StringReader
repetidamente?