Мое простое требование: чтение огромного ( > миллионного) тестового файла линии (для этого примера предположим, что это CSV-ролик) и сохранение ссылки на начало этой строки для более быстрого поиска в будущем (прочитайте строку, начиная с X).
Сначала я попробовал наивный и легкий путь, используя StreamWriter
и получив доступ к базовому BaseStream.Position
. К сожалению, это не работает, как я предполагал:
Для файла, содержащего следующие
Foo
Bar
Baz
Bla
Fasel
и этот очень простой код
using (var sr = new StreamReader(@"C:\Temp\LineTest.txt")) {
string line;
long pos = sr.BaseStream.Position;
while ((line = sr.ReadLine()) != null) {
Console.Write("{0:d3} ", pos);
Console.WriteLine(line);
pos = sr.BaseStream.Position;
}
}
вывод:
000 Foo
025 Bar
025 Baz
025 Bla
025 Fasel
Я могу представить, что поток пытается быть полезным/эффективным и, вероятно, читает (большие) фрагменты, когда нужны новые данные. Для меня это плохо..
Вопрос, наконец: любой способ получить смещение (byte, char) при чтении файла по строкам без использования базового потока и беспорядка с помощью \r\n\r\n и строковой кодировки и т.д. вручную? На самом деле, не очень важно, мне просто не нравится строить вещи, которые могут существовать уже.