Devuelva StreamReader al principio

Estoy leyendo un archivo en línea por línea y quiero poder reiniciar la lectura llamando a un método Rewind() .

¿Cómo puedo manipular mi System.IO.StreamReader y / o su System.IO.FileStream subyacente para comenzar de nuevo con la lectura del archivo?

FileStream.Seek(long, SeekOffset) la ingeniosa idea de utilizar FileStream.Seek(long, SeekOffset) para desplazarme por el archivo, pero no tiene ningún efecto el System.IO.StreamReader adjunto. Podría Close() y reasignar tanto el flujo como los comentarios del lector, pero espero que haya una mejor manera.

Necesita buscar en la transmisión, como lo hizo, luego llame a DiscardBufferedData en StreamReader . Documentación aquí :

Editar: agregar un ejemplo de código:

 Stream s = new MemoryStream(); StreamReader sr = new StreamReader(s); // later... after we read stuff s.Position = 0; sr.DiscardBufferedData(); // reader now reading from position 0 

Yo uso este método:

 System.IO.StreamReader reader = new System.IO.StreamReader("file.txt") //end of reading reader.DiscardBufferedData(); reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 

Todo esto es bueno si BaseStream realmente se puede establecer la propiedad Position en 0.

Si no puede (por ejemplo, una secuencia HttpWebResponse ), una buena opción sería copiar la secuencia a un MemoryStream … allí puede establecer la Position en 0 y reiniciar la Stream tanto como desee.

La respuesta de Amy funcionará en algunos archivos, pero dependiendo de la encoding del flujo subyacente, puede obtener resultados inesperados.

Por ejemplo, si la transmisión es UTF-8 y tiene un preámbulo, StreamReader lo utilizará para detectar la encoding y luego apagará algunos indicadores internos que le indican que detecte la encoding y verifique el preámbulo. Si restablece la posición del flujo hasta el comienzo, el lector de flujo ahora consumirá el preámbulo nuevamente, pero lo incluirá en el resultado la segunda vez. No hay métodos públicos para restablecer este estado de encoding y preámbulo así que lo más seguro que debe hacer si necesita “rebobinar” un lector de flujo es buscar el flujo subyacente al principio (o establecer la posición) como se muestra y crear un nuevo StreamReader. Simplemente llamando a DiscardBufferedData () en StreamReader no será suficiente.

 public long ReadList(string fileName, Action action,long position=0) { if (!File.Exists(fileName)) return 0; using (var reader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),System.Text.Encoding.Unicode)) { if (position > 0)reader.BaseStream.Position = position; while (!reader.EndOfStream) { action(reader.ReadLine()); } return reader.BaseStream.Position; } } 

La pregunta es buscar algún tipo de método StreamReader.Rewind() . Está buscando StreamReader.BaseStream.Position = 0; que vuelve al lector de nuevo para que pueda volver a leerse.

 StreamReader sr = new StreamReader("H:/kate/rani.txt"); Console.WriteLine(sr.ReadToEnd()); sr.BaseStream.Position = 0; Console.WriteLine("----------------------------------"); while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); }