Вы должны быть в состоянии прочитать символ файла по символу, совпадающему с каждым символом в строке поиска, пока не достигнете конца строки поиска, и в этом случае у вас есть совпадение. Если в какой-то момент прочитанный вами символ не соответствует искомому символу, сбросьте счетчик совпадений до 0 и начните снова. Например (**** псевдокод / не проверен ****):
byte[] lookingFor = System.Text.Encoding.UTF8.GetBytes("hello world");
int index = 0;
int position = 0;
bool matchFound = false;
using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
{
while (fileStream.ReadByte() == lookingFor[index])
{
index++;
if (index == lookingFor.length)
{
matchFound = true;
position = File.position - lookingFor.length;
break;
}
}
}
Это один из многих алгоритмов, которые вы можете использовать (хотя он может быть выключен при проверке длины). Он найдет только первое совпадение, поэтому вы, возможно, захотите заключить цикл while в другой цикл, чтобы найти несколько совпадений.
Кроме того, при построчном чтении файла следует отметить, что если искомая строка совпадает со строками, вы ее не найдете. Если это нормально, то вы можете искать построчно, но если вам нужны строки поиска, чтобы охватить строки, вы захотите использовать алгоритм, как я описал выше.
Наконец, если вы ищете лучшую скорость, которая звучит так, как вы, вам нужно перенести приведенный выше код для использования StreamReader или другого буферизованного читателя.