Debería poder leer el carácter carácter por carácter que coincide con cada carácter en la cadena de búsqueda hasta que llegue al final de la cadena de búsqueda en cuyo caso tiene una coincidencia. Si en algún momento el personaje que leyó no coincide con el personaje que está buscando, restablezca el conteo correspondiente a 0 y comience nuevamente. Por ejemplo (**** pseudocódigo/**** no probado):
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;
}
}
}
Ese es uno de los muchos algoritmos que podría utilizar (aunque puede ser apagado por uno con la comprobación de longitud). Solo encontrará la primera coincidencia, por lo que probablemente desee ajustar el ciclo while en otro ciclo para encontrar varias coincidencias.
Además, una cosa a tener en cuenta acerca de la lectura del archivo línea por línea es que si la cadena deseada para hacer coincidir líneas de trazos no la va a encontrar.Si está bien, entonces puede buscar línea por línea, pero si necesita cadenas de búsqueda para abarcar líneas, querrá usar un algoritmo como el detallado anteriormente.
Por último, si está buscando la mejor velocidad, lo que parece que es, querrá migrar el código anterior para usar un StreamReader o algún otro lector de búfer.
¿Ha perfilado su programa? –
¿Este archivo cambia a menudo o es estático? Si es estático, puede hacer un algoritmo fuera de línea e indexarlo para que pueda alcanzar rápidamente la subsección requerida del documento en tiempo de ejecución. – Polaris878
He visto tantas sugerencias de leer el archivo parte por parte en la memoria, pero ¿cómo manejaría el encasillado donde el término de búsqueda comienza en un segmento de archivo y termina en otro? Cargue segmentos superpuestos, tal vez, si este caso sucede, la siguiente parte del fragmento debe contener el término completo – ProfK