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