Delphirus - прграммирование на delphi
   Все о delphi Delphirus - прграммирование на delphi
blocks.gif
Навигация
 

Главная
Статьи
Базы данных
Графика
Защита
Интернет
Система
Тексты
Мультимедиа
Файлы
Формы и окна
Другое
Советы
Базы данных
Графика
Интернет
Мультимедиа
Система
Тексты
Файлы
Файлы
Исходники
Компоненты
Инфо
Поиск по сайту
Обратная связь
Самое популярное
Аккаунт
Карта сайта

 
 
 

Советы по delphi \ Файловая система \ Файлы \ Быстрый поиск в файле

Быстрый поиск в файле

Стоит сказать то, что если действительно требуется высокая скорость работы, то лучшего всего переводить процедуру StrEQ на Assembler.

function StrEq(Data1,Data2: Pointer; Len: Word; CS: Boolean): Boolean;
type
Arr = array[1..$FFFF] of Char;
var
x: Word;
d1: ^Arr absolute Data1;
d2: ^Arr absolute Data2;
begin
StrEq:=True;
for x:=1 to Len do if d1^[x]<>d2^[x]then
begin
if not CS and (UpCase(d1^[x])=UpCase(d2^[x])) then Continue;
StrEq:=false;
exit;
end;
end;


function FindStr(var f: file; SearchPattern: Pointer; PatternLength: Word;
CS: Boolean): Longint;
const
Size: Word = 16384;
var
Buffer: Pointer;
Position: LongInt;
BufSize,NBlocks,i,j,Fake: Word;
begin
BufSize:=Size+PatternLength;
GetMem(Buffer,BufSize);
NBlocks:=((FileSize(f)-FilePos(f)) div size)+1;
Position:=FilePos(f);
for i:=1 to NBlocks do
begin
BlockRead(f,Buffer^,BufSize,Fake);
for j:=0 to size do
begin
{$IfDef Ver70}
if StrEq(Ptr(Seg(Buffer^),Ofs(Buffer^)+j),SearchPattern,PatternLength,CS)
then
{$EndIf}
{$IfDef VirtualPascal}
if StrEq(Ptr(Ofs(Buffer^)+j),SearchPattern,PatternLength,CS) then
{$EndIf}
begin
FreeMem(Buffer,BufSize);
if Position>FileSize(f)then Position:=-1;
FindStr:=Position;
Seek(f,Position+PatternLength);
Exit;
end;
Inc(Position);
end;
Seek(f,FilePos(f)-PatternLength+1);
end;
FreeMem(Buffer,BufSize);
FindStr:=-1;
end;

Название: Быстрый поиск в файле
Дата публикации: 2004-01-27 (4510 Прочтено)

 
 

 

Page generation 0.033 seconds