Возвращение streamreader для начала
Я читаю файл в строке за строкой, и я хочу иметь возможность перезапустить чтение, вызвав метод Rewind().
как я могу манипулировать моим System.IO.StreamReader и / или его основной System.IO.FileStream начать с чтения файла?
у меня есть умная идея, чтобы использовать FileStream.Seek(long, SeekOffset) для перемещения по файлу, но это не имеет никакого эффекта прилагая System.IO.StreamReader. Я мог бы Close() и переназначить как поток, так и читатель referecnes, но я надеюсь, что есть лучший способ.
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.если вы не можете (пример
HttpWebResponsestream) тогда хорошим вариантом было бы скопировать поток вMemoryStream...там вы можете установитьPosition0 и перезапустить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