samsung restaurar resetear reiniciar moto formatear fabrica cursores como celular c# .net file

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?