Вопрос:

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

c# .net

81790 просмотра

6 ответа

2208 Репутация автора

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

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

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

Автор: Chris Источник Размещён: 12.01.2010 11:19

Ответы (6)


111 плюса

23812 Репутация автора

Решение

Вы должны искать в потоке, как ты, а затем вызвать 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
Автор: Amy Размещён: 12.01.2010 11:24

17 плюса

5748 Репутация автора

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

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

Автор: TheBoyan Размещён: 28.05.2010 03:22

18 плюса

949 Репутация автора

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

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

Автор: Eamon Размещён: 16.07.2015 02:04

36 плюса

361 Репутация автора

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

System.IO.StreamReader reader = new System.IO.StreamReader("file.txt")
//end of reading
reader.DiscardBufferedData();
reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 
Автор: Hance Doofenshmirts Размещён: 09.08.2015 08:50

-1 плюса

436 Репутация автора

Вопрос в поиске какого-то 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());
}
Автор: Md Shahriar Размещён: 08.12.2015 08:02

1 плюс

11 Репутация автора

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;
   }
}
Автор: vyv Размещён: 15.01.2016 06:36
32x32