Возвращение streamreader для начала



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



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



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

630   6  

6 ответов:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.