como Procurar diretório
como verificar onde está um determinado diretório, e armazenar o caminho em uma variavel ?
ex:
preciso criar uma função que retorne o path de um determinado diretório, para usar assim:
ex:
neste caso para mostrar no edit: ´C:\Arquivos de Programas\Firebird\Firebird_1_5\´
ex:
function ReturnPath( pDirectory: String ): String; var Directory: String; begin // procurar pelo diretorio passado como parametro e // armazenar em Directory o caminho do diretorio Result := Directory; end;
preciso criar uma função que retorne o path de um determinado diretório, para usar assim:
ex:
EdDiretory.Text := ReturnPath( ´Firebird_1_5´ );
neste caso para mostrar no edit: ´C:\Arquivos de Programas\Firebird\Firebird_1_5\´
Fabiano Góes
Curtidas 0
Respostas
Diviex
06/09/2006
o que vc esta querendo nao da pra faze... pq se vc disser que quer procurar pelo diretorio ´Firebird´ existe uma grande xanse de ser retornado pra vc um outro diretorio que tenha o mesmo nome, porem, que nao seja o diretorio que vc esperava.
para vc consequir o diretorio de instalacao de programas como o firebird eh necessario que vc saiba onde este programa quarda estas informacoes.
no caso do firebird essa informacao fica no registro do windows. Dentro da chave [b:1321c1858b]HKEY_LOCAL_MACHINE\SOFTWARE\Firebird Project\Firebird Server\Instances[/b:1321c1858b], vc ira encontrar o campo [b:1321c1858b]DefaultInstance[/b:1321c1858b]. E é nesse campo que vai estar escrito onde o firebird foi instalado.
para ler o registro do windows faça o sequinte:
o codigo acima retornara pra vc o caminho onde foi instalado o firebird e caso nao tenha a instalcao do fb na makina sera retornardo [b:1321c1858b]´´[/b:1321c1858b] (vazio).
mais se mesmo asssim vc quizer localizar algum diretorio, estou disponibilizando abaixo o codigo para localziacao do diretorio. Existem outras maneiras (ate mais rapida) de se localizar diretorio e arquivos, porem escolhi essa por ser mais facil de entender e manipular. A rotina abaixo executa a busca inclusive dentro dos subdiretorios.
onde
[list:1321c1858b]Dir: é o diretorio raiz onde se deseja fazer a procura
aLista: é a lista onde sera armazenado todos os diretorios encontrados
CaminhoCompleto: informa se vai retornar soh o nome do diretorio ou seu caminho completo
Detalhe: eh uma lista, caso este parametro seja diferente de nil sera retornado detalhes sobre o processo de localizacao dos diretorios[/list:u:1321c1858b]
para vc consequir o diretorio de instalacao de programas como o firebird eh necessario que vc saiba onde este programa quarda estas informacoes.
no caso do firebird essa informacao fica no registro do windows. Dentro da chave [b:1321c1858b]HKEY_LOCAL_MACHINE\SOFTWARE\Firebird Project\Firebird Server\Instances[/b:1321c1858b], vc ira encontrar o campo [b:1321c1858b]DefaultInstance[/b:1321c1858b]. E é nesse campo que vai estar escrito onde o firebird foi instalado.
para ler o registro do windows faça o sequinte:
var Reg: TRegistry; Caminho_FB: String; begin Reg:=TRegistry.Create; with Reg do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey(´SOFTWARE\Firebird Project\Firebird Server\Instances´, False) then if ValueExists(´DefaultInstance´) then Caminho_FB:=ReadString(´DefaultInstance´);//aki pega o caminho do firebird CloseKey; end; FreeAndNil(Reg); end;
o codigo acima retornara pra vc o caminho onde foi instalado o firebird e caso nao tenha a instalcao do fb na makina sera retornardo [b:1321c1858b]´´[/b:1321c1858b] (vazio).
mais se mesmo asssim vc quizer localizar algum diretorio, estou disponibilizando abaixo o codigo para localziacao do diretorio. Existem outras maneiras (ate mais rapida) de se localizar diretorio e arquivos, porem escolhi essa por ser mais facil de entender e manipular. A rotina abaixo executa a busca inclusive dentro dos subdiretorios.
procedure LocalizarDiretorios(Dir: String; var aLista: TStringList; CaminhoCompleto: Boolean; const Detalhe: TStrings = nil); var vArquLoca:TSearchRec; vC, vItem: Integer; vSort: Boolean; vTemp: String; function DirToPath(Dir: String): String; begin if Dir=´´ then Exit; if Dir[Length(Dir)]<>´\´ then Dir:=Dir+´\´; Result:=Dir; end; begin vSort:=aLista.Sorted; aLista.Sorted:=False; FindFirst(PChar(DirToPath(Dir)) ,faAnyFile ,vArquLoca); if (DirectoryExists(DirToPath(Dir)+vArquLoca.Name)=True) and (vArquLoca.Name<>´.´) and (vArquLoca.Name<>´..´) then begin aLista.Add(DirToPath(Dir)+vArquLoca.Name); if Detalhe<>nil then begin Detalhe.Add(aLista[aLista.Count-1]); Application.ProcessMessages; end; end; while FindNext(vArquLoca)=0 do begin Application.ProcessMessages; if (DirectoryExists(DirToPath(Dir)+vArquLoca.Name)=True) and (vArquLoca.Name<>´´) and (vArquLoca.Name<>´.´) and (vArquLoca.Name<>´..´) then begin aLista.Add(DirToPath(Dir)+vArquLoca.Name); if Detalhe<>nil then begin Detalhe.Add(aLista[aLista.Count-1]); Application.ProcessMessages; end; end; end; FindClose(vArquLoca); repeat vItem:=aLista.Count; for vC:=0 to aLista.Count-1 do begin Application.ProcessMessages; FindFirst(PChar(DirToPath(aLista[vC])+´*´), faAnyFile, vArquLoca); if (DirectoryExists(DirToPath(Dir)+vArquLoca.Name)=True) and (vArquLoca.Name<>´´) and (vArquLoca.Name<>´.´) and (vArquLoca.Name<>´..´) then if aLista.IndexOf(DirToPath(aLista[vC])+vArquLoca.Name)=-1 then begin aLista.Add(DirToPath(aLista[vC])+vArquLoca.Name); if Detalhe<>nil then begin Detalhe.Add(aLista[aLista.Count-1]); Application.ProcessMessages; end; end; while FindNext(vArquLoca)=0 do begin Application.ProcessMessages; if (DirectoryExists(DirToPath(aLista[vC])+vArquLoca.Name)=True) and (vArquLoca.Name<>´´) and (vArquLoca.Name<>´.´) and (vArquLoca.Name<>´..´) then begin if aLista.IndexOf(DirToPath(aLista[vC])+vArquLoca.Name)=-1 then begin aLista.Add(DirToPath(aLista[vC])+vArquLoca.Name); if Detalhe<>nil then begin Detalhe.Add(aLista[aLista.Count-1]); Application.ProcessMessages; end; end; end; end; FindClose(vArquLoca); end; until vItem>=aLista.Count; if not CaminhoCompleto then begin for vC:=0 to aLista.Count-1 do begin Application.ProcessMessages; vTemp:=aLista[vC]; Delete(vTemp, 1, Length(Dir)); aLista[vC]:=vTemp; end; end; aLista.Sorted:=vSort; FindClose(vArquLoca); end;
onde
[list:1321c1858b]Dir: é o diretorio raiz onde se deseja fazer a procura
aLista: é a lista onde sera armazenado todos os diretorios encontrados
CaminhoCompleto: informa se vai retornar soh o nome do diretorio ou seu caminho completo
Detalhe: eh uma lista, caso este parametro seja diferente de nil sera retornado detalhes sobre o processo de localizacao dos diretorios[/list:u:1321c1858b]
GOSTEI 0
Fabiano Góes
06/09/2006
Valeu DivieX, funcionou perfeitamente para a minha necessidade !!
GOSTEI 0