Fórum Minha aplicação tá lenta demais na busca com FindFirst #413774
06/03/2012
0
Pessoal, gostaria de uma opinião em como eu faço para melhorar a performance da minha aplicação. É sistema de busca de arquivos(.pas e .dfm). O que eu quero é saber em quais arquivos eu uso determinadas Tabelas, SP, View e etc... Funciona assim:Dou um select na Sysobjects, trazendo as informaçoes e guardando em clientdataset. Aí em um loop no CDS, eu chamo a funcção que faz a busca e carrega um ListBox. Depois de feito, eu descarrego os itens do ListBox em um arquivo .CSV. Porem tudo isso tá lento, com certeza está na minha lógica. O que busco aqui é uma idéia e como fazer diferente. Abaixo meus códigos:
procedure TForm1.BuscaTexto(path: string; const FileMask, tipo, tabela: string);
var
SR: TSearchRec;
txt: TextFile;
Row: string;
Found: Boolean;
i: Integer;
NroExt: TStrings;
begin
NroExt:= TStringList.Create;
try
Varrer.Enabled := False;
NroExt.Delimiter:= ;;
NroExt.DelimitedText:= FileMask;
path := IncludeTrailingPathDelimiter(path);
for i:= 0 to NroExt.Count - 1 do
begin
if FindFirst(path + NroExt[i], faAnyFile - faDirectory, SR) = 0 then
repeat
Application.ProcessMessages;
AssignFile(txt,path + SR.Name);
Reset(txt);
Found:= False;
while not Eof(txt) and not Found do
begin
Readln(txt, Row);
if Pos(tabela, Row) > 0 then
begin
ListBox1.Items.Add(tipo + ; + tabela + ; + SR.Name);
Found:= True
end
end;
CloseFile(txt);
until FindNext(SR) <> 0
end;
finally
NroExt.Free;
Varrer.Enabled := True;
FindClose(SR);
end;
//end;
if FindFirst(Path + *.*, faDirectory, SR) = 0 then
begin
try
repeat
if (SR.Name <> .) and (SR.Name <> ..) then
TextFoundInFile(Path + SR.Name,*.pas;*.dfm,tipo,tabela);
until FindNext(SR) <> 0;
finally
end;
end;
end;
Minha chamada
procedure TForm1.VarrerClick(Sender: TObject);
begin
ClientDataSet1.Open;
pth := IncludeTrailingPathDelimiter(edtDir.Directory);
while not ClientDataSet1.Eof do
begin
//TextFoundInFile(pth,*.pas;*.dfm,ClientDataSet1.FieldByName(xtype).AsString,ClientDataSet1.FieldByName(name).AsString);
BuscaTexto(pth,*.pas;*.dfm,ClientDataSet1.FieldByName(xtype).AsString,ClientDataSet1.FieldByName(name).AsString);
ClientDataSet1.Next;
end;
ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName) + Fontes.csv);
end;
procedure TForm1.BuscaTexto(path: string; const FileMask, tipo, tabela: string);
var
SR: TSearchRec;
txt: TextFile;
Row: string;
Found: Boolean;
i: Integer;
NroExt: TStrings;
begin
NroExt:= TStringList.Create;
try
Varrer.Enabled := False;
NroExt.Delimiter:= ;;
NroExt.DelimitedText:= FileMask;
path := IncludeTrailingPathDelimiter(path);
for i:= 0 to NroExt.Count - 1 do
begin
if FindFirst(path + NroExt[i], faAnyFile - faDirectory, SR) = 0 then
repeat
Application.ProcessMessages;
AssignFile(txt,path + SR.Name);
Reset(txt);
Found:= False;
while not Eof(txt) and not Found do
begin
Readln(txt, Row);
if Pos(tabela, Row) > 0 then
begin
ListBox1.Items.Add(tipo + ; + tabela + ; + SR.Name);
Found:= True
end
end;
CloseFile(txt);
until FindNext(SR) <> 0
end;
finally
NroExt.Free;
Varrer.Enabled := True;
FindClose(SR);
end;
//end;
if FindFirst(Path + *.*, faDirectory, SR) = 0 then
begin
try
repeat
if (SR.Name <> .) and (SR.Name <> ..) then
TextFoundInFile(Path + SR.Name,*.pas;*.dfm,tipo,tabela);
until FindNext(SR) <> 0;
finally
end;
end;
end;
Minha chamada
procedure TForm1.VarrerClick(Sender: TObject);
begin
ClientDataSet1.Open;
pth := IncludeTrailingPathDelimiter(edtDir.Directory);
while not ClientDataSet1.Eof do
begin
//TextFoundInFile(pth,*.pas;*.dfm,ClientDataSet1.FieldByName(xtype).AsString,ClientDataSet1.FieldByName(name).AsString);
BuscaTexto(pth,*.pas;*.dfm,ClientDataSet1.FieldByName(xtype).AsString,ClientDataSet1.FieldByName(name).AsString);
ClientDataSet1.Next;
end;
ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName) + Fontes.csv);
end;
Pjava
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)