Подтвердить что ты не робот

Возврат StreamReader к началу

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

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

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

4b9b3361

Ответ 1

Вам нужно искать в потоке, как и вы, затем наберите 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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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;
   }
}

Ответ 6

Вопрос ищет какой-то метод 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());
}