Как прочитать очень большой файл с конца в C #? [Дубликат]

1

У меня есть текстовый файл размером 4,5 ГБ, который был создан одним из экспериментальных приложений. В моей системе с 8 ГБ оперативной памяти этот файл нельзя открыть (попробуйте с возвышенным текстом). Я просто хочу прочитать содержимое этого файла с конца, скажем, 45 символов с конца, без загрузки всего файла в память. Как это сделать? Встроенные методы, такие как,

StreamReader.ReadBlock(char[] buffer,int index,int count)  

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

  • 4
    пойти в старшую школу? Еореп / FSEEK?
  • 5
    FileStream.Seek(long offset, SeekOrigin origin) ? Дарин Димитров показывает пример, как это сделать: stackoverflow.com/questions/4368857/…
Показать ещё 3 комментария
Теги:
file
file-io
filestream

1 ответ

3
Лучший ответ

Stream имеет long свойства с именем " Position и Length. Вы можете установить Position в любое значение, которое вам нравится, в пределах диапазона [0, Length[, например fileStream.Position = fileStream.Length - 45; ,

Или вы можете использовать функцию Stream.Seek: fileStream.Seek(-45, SeekOrigin.End).

Используйте более читаемый, в зависимости от окружающего кода и ситуации, тот, который наилучшим образом передает ваши намерения.

Вот какой код:

using (var fileStream = File.OpenRead("myfile.txt"))
using (var streamReader = new StreamReader(fileStream, Encoding.ASCII))
{
    if (fileStream.Length >= 45)
        fileStream.Seek(-45, SeekOrigin.End);

    var value = streamReader.ReadToEnd(); // Last 45 chars;
}

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

  • 1
    Проблема в том, что StreamReader не является производным от Stream . Вы должны показать, как они взаимодействуют.
  • 0
    @ Скотт, я предположил, что у ОП уже был поток файлов, но вы правы, здесь уместен пример кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню