我有一個二進制文件(2.5 MB),我想找到這個字節序列的位置:CD 09 D9 F5。然後我想在這個位置之後寫入一些數據,並用零覆蓋舊數據(4 KB)。德爾福如何更快地搜索二進制文件?
下面是我如何做,但它有點慢。
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;
哪部分代碼慢?你表演過嗎?你怎麼知道它很慢?它是什麼速度,你期望能達到什麼? – 2013-03-27 14:58:47
顯而易見讀寫文件char-by-char的速度很慢。至少通過更大的塊將數據提取到緩衝區中(請參閱BlockRead)。 – OnTheFly 2013-03-27 15:12:42
@DavidHeffernan,是的,它正在搜索序列位置的部分很慢。現在大約需要15秒才能完成5個文件,我希望最多隻需1-3秒。如果我評論它,並將StartIndex設置爲9999,那麼它是即時的。我認爲這並不是最好的解決方案來逐字節讀取所有文件內容作爲字符+將其複製到字符串。 – AlexP11223 2013-03-27 15:23:08