У меня есть текстовый файл размером 4,5 ГБ, который был создан одним из экспериментальных приложений. В моей системе с 8 ГБ оперативной памяти этот файл нельзя открыть (попробуйте с возвышенным текстом). Я просто хочу прочитать содержимое этого файла с конца, скажем, 45 символов с конца, без загрузки всего файла в память. Как это сделать? Встроенные методы, такие как,
StreamReader.ReadBlock(char[] buffer,int index,int count)
имеет тип int для индекса, но индекс для моего случая выходит за пределы диапазона для значения int. Если бы была только перегрузка с длинной. Как преодолеть это? Благодарю.
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. В противном случае вам нужно будет прочитать немного текста с самого начала файла с помощью считывателя, чтобы он мог определить кодировку (если имеется спецификация), и только затем найдите позицию, которую вы хотите прочитать.
StreamReader
не является производным от Stream
. Вы должны показать, как они взаимодействуют.
FileStream.Seek(long offset, SeekOrigin origin)
? Дарин Димитров показывает пример, как это сделать: stackoverflow.com/questions/4368857/…