2014-08-29 5 views
1

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

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

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

+4

go старыйschool? Еореп/FSEEK? –

+5

['FileStream.Seek (long offset, originOrigin origin)'] (http://msdn.microsoft.com/en-us/library/system.io.filestream.seek (v = vs.110) .aspx)? Дарин Димитров показывает пример, как это сделать: http://stackoverflow.com/questions/4368857/read-from-a-file-starting-at-the-end-similar-to-tail – birryree

+0

Какая кодировка является текстовым файлом в? Если это UTF-8, вы можете гарантировать, что в файле есть только однобайтовые символы? –

ответ

3

A 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

@Scott, я предположил, что у OP уже был поток файлов, но вы правы, здесь приведен пример кода. –

Смежные вопросы