Fórum como Procurar diretório #328770

06/09/2006

0

como verificar onde está um determinado diretório, e armazenar o caminho em uma variavel ?

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

Fabiano Góes

Responder

Posts

06/09/2006

Diviex

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:
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]


Responder

Gostei + 0

06/09/2006

Fabiano Góes

Valeu DivieX, funcionou perfeitamente para a minha necessidade !!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar