Верните StreamReader в начало - PullRequest
       27

Верните StreamReader в начало

61 голосов
/ 13 января 2010

Я читаю файл построчно, и я хочу иметь возможность возобновить чтение, вызвав метод Rewind().

Как мне манипулировать моим System.IO.StreamReader и / или его базовым System.IO.FileStream, чтобы начать чтение файла?

Мне пришла в голову умная идея использовать FileStream.Seek(long, SeekOffset) для перемещения по файлу, но это никак не сказывается на включении System.IO.StreamReader. Я мог бы Close() и переназначить ссылки на поток и читателя, но я надеюсь, что есть лучший способ.

Ответы [ 6 ]

104 голосов
/ 13 января 2010

Вам нужно искать в потоке, как вы это делали, затем вызвать DiscardBufferedData на StreamReader. Документация здесь :

Редактировать: Пример добавления кода:

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
30 голосов
/ 09 августа 2015

Я использую этот метод:

System.IO.StreamReader reader = new System.IO.StreamReader("file.txt")
//end of reading
reader.DiscardBufferedData();
reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 
18 голосов
/ 16 июля 2015

Ответ Эми будет работать с некоторыми файлами, но в зависимости от кодировки основного потока вы можете получить неожиданные результаты.

Например, если поток имеет формат UTF-8 и имеет преамбулу, то StreamReader будет использовать это для обнаружения кодировки, а затем отключит некоторые внутренние флаги, которые сообщат ему об обнаружении кодировки и проверке преамбулы. Если вы вернете позицию потока в начало, программа чтения потока снова будет использовать преамбулу, но во второй раз включит ее в вывод. Не существует общедоступных методов для сброса этого состояния кодирования и преамбулы, так что, если вам нужно «перемотать» потоковое считыватель, самое безопасное - это найти основной поток в начале (или установить позицию), как показано, и создать новый StreamReader простого вызова DiscardBufferedData () в StreamReader будет недостаточно.

17 голосов
/ 28 мая 2010

Это все хорошо, если BaseStream действительно можно установить для свойства Position значение 0.

Если вы не можете (например, поток HttpWebResponse), то хорошим вариантом будет скопировать поток в MemoryStream ... там вы можете установить Position в 0 и перезапустить Stream как сколько хочешь.

1 голос
/ 15 января 2016
public long ReadList(string fileName, Action<string> 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;
   }
}
0 голосов
/ 08 декабря 2015

Вопрос ищет какой-то StreamReader.Rewind() метод. Вы ищете StreamReader.BaseStream.Position = 0;, который возвращает читателя в начало, чтобы его можно было прочитать снова.

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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...