Показать сообщение отдельно
Старый 04.07.2013, 20:51   #1
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
StreamReader Position

Читаю построково тестовый файл. В файле данные в произвольном порядке. Т.е. чтобы не пропустить нужно каждую порцию искать с начала файла. Методы чтения строки (ReadLine) есть в StreamReader и StringReader (больше не нашел). Вернуться в начало файла принципиально можно в StreamReader.
Инициализирую его из файла. Пытаюсь изменить позицию.
StreamReader sr = new StreamReader(file);
sr.BaseStream.Seek(0, SeekOrigin.Begin)
В дебаге вижу, что sr.BaseStreamPosition изменился, но читает все равно не в начале файла, а там где было предыдущее чтение. Нашел, что StreamReader использует внутренний буфер, хоть это и не BufferedStream, и для того чтобы изменение позиции сработало нужно вызваеть DiscardBufferedData. Однако "Этот метод отрицательно влияет на быстродействие". Т.е. скорее всего производится повторное чтение файла с диска в буфер. Лажа. С тем же успехом можно просто повторно открывать поток.
Можно, конечно, сначала считать файл в свой буфер, типа:
FileStream fs = new FileStream(file, FileMode.Open);
byte[] buf = new byte[fs.Length];
fs.Read(buf, 0, fs.Length);
Затем из этого буфера создать MemoryStream:
MemoryStream ms = new MemoryStream(buf);
И уже из него при необходимости считывать с начала файла каждый раз создавать StreamReader. Ну или в данном случае можно сбрасывать буфер, т.к. тут не будет повторной загрузки с диска - просто заполнение буфера из MemoryStream.
Однако это все же как -то неправильно.

Вопрос. Я что-то не знаю, не понимаю и можно проще реализовать многократное чтение с начала файла без повторной загрузки его с диска. Или все же можно только через ж...
(Offline)
 
Ответить с цитированием