Sempre que estamos desenvolvendo um programa e precisamos de uma função ou procedimento que requer tempo para desenvolver e testar, ficamos entre o código bem escrito e a pressa de resolver o problema e quase sempre optamos pelo meio termo: pegamos um pronto e deixamos bem escrito (bem escrito para nós - adaptado às nossas necessidades).
Mas a melhor saída é desenvolver procedimentos e funções
com propósito geral, para que sejam reaproveitadas.
Seguindo esta linha, quando estava desenvolvendo um programa de backup para
uso pessoal, me deparei com a necessidade de desenvolver uma função
para localizar arquivo em uma árvore, e desenvolvi a função
chamada FindFiles:
Function FindFiles(aFiles: string; FindProc: TFindFilesProc; Recursive: Boolean=True):Integer ;
Var
FD : TWin32findData ;
WildCard : string ;
n: Integer ;
stoped : Boolean ;
procedure _FindFile(aPath: String);
Var H: Thandle ;
Begin
H := FindFirstFile(Pchar(aPath+WildCard),fd);
If h <> INVALID_HANDLE_VALUE then
Repeat
If (copy(FD.cFileName,1,1) <> '.') then
Begin
Inc(n);
If Assigned(FindProc) then
FindProc(FD, aPath+fd.cFileName,Stoped);
End ;
until (not (FindNextFile(h,fd))) or (Stoped = True);
Windows.FindClose(h);
End ;
Procedure _FindDir(aPath: String) ;
Var H : THandle ;
Begin
_findFile(aPath);
If Stoped then Exit ;
H := FindFirstFile(Pchar(aPath+'*.*'),FD);
If H <> INVALID_HANDLE_VALUE THEN
Repeat
If (Copy(FD.cFileName,1,1) <> '.') and
((FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)<> 0) then
_FindDir(apath+fd.cfilename+'\') ;
until not (FindNextFile(h,fd)) ;
windows.FindClose(h);
End ;
Begin
WildCard := ExtractFileName(aFiles);
n := 0 ;
If Recursive then
_findDir(ExtractFilePath(aFiles))
Else
_findFile(ExtractFilePath(aFiles));
Result := n ;
End;
Sobre a Função
Parâmetros:
aFiles: String - Nome do arquivo ou pasta com o
caminho completo. Podemos usar WildCard tal qual o Windows, exemplo: 'C:\teste\a*.*',
'C:\teste\*.txt' e
assim por diante.
FindProc: TfindFilesProc - é um procedimento
CallBack que deve ser declarado da seguinte forma:
TfindFilesProc = procedure(FindData: TWin32FindData; FileName:
TfileName; var Stoped: Boolean);
Este parâmetro, pode ser passado também como 'nil'
Recursive: Boolean=True - Se true, a busca é executada
de forma recursiva. False, não recursiva.
Retorno:
Número de arquivos encontrados.
Sobre o procedimento CallBack
O procedimento CallBack é chamado pela função FindFiles,
cada vez que encontra um arquivo, portando ele pode ser implementado de forma
a extrair qualquer dado da estrutura FindData: TWin32FindData, e o nome completo
do arquivo, através do FileName: TfileName. Através dele, pode-se também
interromper a busca, definindo o parâmetro Stoped como True.
Clique aqui para fazer o download do exemplo e ver o uso da função na prática.
Por: José Maria de Carvalho -
jcarvalho@sercomtel.com.br
|