У меня есть двоичный файл (2.5 MB), и я хочу найти позицию этой последовательности байтов: CD 09 D9 F5. Затем я хочу записать некоторые данные после этой позиции, а также перезаписать старые данные (4 КБ) нулями.Delphi Как быстрее искать в двоичном файле?
Вот как я это делаю сейчас, но это немного медленно.
ProcessFile(dataToWrite: string);
var
fileContent: string;
f: file of char;
c: char;
n, i, startIndex, endIndex: integer;
begin
AssignFile(f, 'file.bin');
reset(f);
n := FileSize(f);
while n > 0 do
begin
Read(f, c);
fileContent := fileContent + c;
dec(n);
end;
CloseFile(f);
startindex := Pos(Char($CD)+Char($09)+Char($D9)+Char($F5), fileContent) + 4;
endIndex := startIndex + 4088;
Seek(f, startIndex);
for i := 1 to length(dataToWrite) do
Write(f, dataToWrite[i]);
c := #0;
while (i < endIndex) do
begin
Write(f, c); inc(i);
end;
CloseFile(f);
end;
Какая часть кода медленная? Вы проводили тайминги? Как вы даже знаете, что это медленно? Какова скорость, и чего вы ожидаете достичь? –
Очевидно, что чтение и запись файла char-by-char происходит медленно. По крайней мере, получить данные в буфер более крупными кусками (см. BlockRead). – OnTheFly
@DavidHeffernan, Да, часть, где он ищет позицию последовательности, медленная. Теперь это занимает около 15 секунд для 5 файлов, я хочу, чтобы оно составляло не более 1-3 секунд. Если я прокомментирую это и просто поставлю StartIndex к 9999, например, тогда это мгновенно. Я думаю, что это не лучшее решение для чтения байта содержимого файла байтом в виде символов + скопировать его в строку. – AlexP11223