Как подсчитать количество байтов, прочитанных textreader.readline ()?

StackOverflow https://stackoverflow.com/questions/2963652

  •  23-10-2019
  •  | 
  •  

Вопрос

Я анализирую очень большой файл записей (по одному на строку, каждая из различной длины), и я хотел бы отслеживать количество байтов, которые я прочитал в файле, чтобы я мог восстановиться в случае отказ.

Я написал следующее:

using (TextReader myTextReader = CreateTextReader())
{
    string record = myTextReader.ReadLine();
    bytesRead += record.Length;
    ParseRecord(record);
}

Однако это не работает с ReadLine() Снимите любые символы CR/LF в линии. Кроме того, строка может быть прекращена символами CR, LF или CRLF, что означает, что я не могу просто добавить 1 в bytesRead.

Есть ли простой способ получить реальную длину линии, или я напишу свою собственную ReadLine() метод с точки зрения гранулированного Read() операции?

Это было полезно?

Решение

Получение текущей позиции базового потока не поможет, так как StreamRearder будет буферировать данные, считываемые из потока.

По сути, вы не можете сделать это, не написав свой собственный стригчик. Но вам действительно нужно?

Я бы просто посчитал количество прочитанных строк.

Конечно, это означает, что для определения определенной строки вам нужно будет прочитать n строк, а не просто стремиться к смещению, но что с этим не так? Вы определили, что производительность будет неприемлемой?

Другие советы

Texstreader читает строки, которые являются персонажами, которые [в зависимости от кодирования] не равны байтам.

Как насчет того, чтобы просто хранение количества строк и просто пропустить столько строк при восстановлении? Я предполагаю, что все дело в том, чтобы не обрабатывать эту линию, не обязательно избегать читать их из потока.

Если подумать, я могу использовать StreamReader и получить текущую позицию базового потока следующим образом.

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top