Мое простое требование: чтение огромного (> миллиона) тестового файла строки (в этом примере предположим, что это 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, кодированием строки и т. Д. Вручную? Ничего страшного, правда, я просто не люблю строить вещи, которые уже могут существовать ..