StreamReader
с ReadLine
или ReadToEnd
фактически пойдет и прочитает байты в память, даже если вы не обрабатываете эти строки, они будут загружены, что повлияет на производительность приложения в случае большихфайлы (10+ МБ).
Если вы хотите пропустить определенное количество строк, вам нужно знать положение файла, в который вы хотите переместиться, что дает вам два варианта:
- Если вы знаетедлину линии вы можете рассчитать позицию и переместиться туда с помощью Stream.Seek.Это самый эффективный способ пропустить потоковое содержимое, не читая его.Проблема в том, что вы редко можете узнать длину строки.
var linesToSkip = 10;
using(var reader = new StreamReader(fileName) )
{
reader.BaseStream.Seek(lineLength * (linesToSkip - 1), SeekOrigin.Begin);
var myNextLine = reader.ReadLine();
// TODO: process the line
}
Если вы не знаете длину строки, вы должны читать строку за строкой и пропускать их, пока не доберетесь до нужного номера строки.Проблема здесь в том, что номер строки высокий, вы получите удар по производительности
var linesToSkip = 10;
using (var reader = new StreamReader(fileName))
{
for (int i = 1; i <= linesToSkip; ++i)
reader.ReadLine();
var myNextLine = reader.ReadLine();
// TODO: process the line
}
И если вам нужно просто пропустить все, вы должны сделать это, не считывая весь контент в память:
using(var reader = new StreamReader(fileName) )
{
reader.BaseStream.Seek(0, SeekOrigin.End);
// You can wait here for other processes to write into this file and then the ReadLine will provide you with that content
var myNextLine = reader.ReadLine();
// TODO: process the line
}