Все же Вы не правы. После выполнения TStream.Read позиция курсора меняется и уже указывает не на начало последовательности, а на её конец. Проведите эксперимент:
Содержимое файла [
123456789]
Паттерн [
23]
Какой результат вернет Ваша функция? Отвечаю:
3. А все потому, что нашли паттерн в позиции 1 (как и полагается), произвели чтение паттерна длиною в 2 байта. Итого 2+1 = 3.
Поправить можно так:
Код:
function PatternSearch(aPattern: TBytes; aFileName: String): LongInt;
var
F: TMemoryStream;
Buf: TBytes;
Len, Step: LongInt;
begin
F := TMemoryStream.Create;
F.LoadFromFile(aFileName);
try
Len := Length(aPattern);
SetLength(Buf, Len);
Step := -1;
try
repeat
Inc(Step);
F.Seek(Step, soFromBeginning);
F.ReadBuffer(Buf, Len);
until CompareMem(Buf, aPattern, Len);
Result := Step;
except
Result := -1;
end;
finally
F.Free;
end;
end;
Да и как-то грубо использовать эксепшен для завершения функции - не находите? Что Вам мешает отслеживать размер файла, количество считанных байт, позицию курсора?