GARANTIR DESCONTO

Fórum Buscar Arquivo dentro da pasta. #466866

14/01/2014

0

Como faço nesse script abaixo para buscar dentro de uma determinada pasta, assim esta buscando somente na raiz do executável.

var
SRec, SearchRec: TSearchRec;
Done: Integer;

begin
Done := FindFirst(ExtractFilePath(
ParamStr(0))+ '*.rtm',0,SRec);
while Done = 0 do
begin
ListBox1.Items.Add(ChangeFileExt(SRec.Name,''));
Done := FindNext(SRec);
end;
FindClose(SRec);
end;
João Françozo

João Françozo

Responder

Posts

14/01/2014

Jaime Santos

Amigo, tenta com a seguinte procedure:

procedure ListaArquivos(DiretorioInicial, Mascara:AnsiString; var ListaDeArquivos:TStrings; CaminhoCompleto:boolean=false; Subdiretorios:boolean=true);
var
  i: integer;
  listatemp: TStrings;

    procedure ListarDiretorios(Folder: AnsiString; lista: Tstrings);
    var
      Rec: TSearchRec;
      i: integer;
      temps: AnsiString;
    begin
      lista.Clear;
      if SysUtils.FindFirst(Folder + '*', faDirectory, Rec) = 0 then
      try
        repeat
          lista.Add(rec.Name);
        until SysUtils.FindNext(Rec) <> 0;
      finally
        if lista.count <> 0 then
        begin
          // deleta o diretorio ..
          lista.Delete(1);
          // deleta o diretorio .
          lista.Delete(0);
          i := 0;
          //deleta os arquivos isto e fica apenas os diretorios
          if lista.count <> 0 then
          begin
            repeat
              temps := lista.Strings[i];
              temps := extractfileext(temps);
              if temps <> '' then
                lista.Delete(i)
              else
                inc(i);
            until i >= lista.Count;
          end;
        end;
      end;
    end;
    procedure ListarAtahos(Folder, mask: AnsiString; Lista: Tstrings);
    var
      Rec: TSearchRec;
    begin
      lista.Clear;
      if SysUtils.FindFirst(Folder + mask, faAnyFile, Rec) = 0 then
      try
        repeat
          lista.Add(rec.Name);
        until SysUtils.FindNext(Rec) <> 0;
      finally
        SysUtils.FindClose(Rec);
      end;
    end;

    procedure AddLIstInOther(ListSource, ListDestino: TStrings);
    var
      f: integer;
    begin
      for f := 0 to ListSource.Count - 1 do
      begin
        ListDestino.Add(ListSource.Strings[f]);
      end;
    end;

begin
  DiretorioInicial := trim(DiretorioInicial);
  if DiretorioInicial[length(DiretorioInicial)] <> '\' then
    DiretorioInicial := DiretorioInicial + '\';
  listatemp := TStringList.Create;
  ListarAtahos(diretorioInicial, mascara, listatemp);
  if CaminhoCompleto then
  begin
    for i := 0 to listatemp.Count - 1 do
    begin
      listatemp.Strings[i] := diretorioInicial + listatemp.Strings[i];
    end;
  end;
  AddLIstInOther(listatemp, ListaDeArquivos);
  if SubDiretorios then
  begin
    ListarDiretorios(diretorioInicial, listatemp);
    for i := 0 to listatemp.Count - 1 do
    begin
      ListaArquivos(DiretorioInicial + listatemp.Strings[i] + '\', Mascara, ListaDeArquivos, CaminhoCompleto, SubDiretorios);
    end;
  end;
  listatemp.Free;
end;


Att.
Rômulo Mayworm
Responder

Gostei + 0

14/01/2014

João Françozo

Não deu.

vamos tentar implantar no código meu acimar.
Responder

Gostei + 0

15/01/2014

Jaime Santos

João, bom dia,

na linha:
Done := FindFirst(ExtractFilePath(ParamStr(0))+ '*.rtm',0,SRec);


no lugar de EXTRACTFILEPATH(PARAMSTR(0)) coloque a path na qual deseja realizar a sua busca.
A função ExtractFilePath retorna uma string com o path do arquivo passado com parâmetro, no seu caso está passando seu próprio executável. Tente colocar no seu form um TDirectoryEdit, e através dele realizar a busca, após selecionar o diretório desejado.

Att.
Rômulo Mayworm
Responder

Gostei + 0

15/01/2014

João Françozo

Deu Certo assim.

SetCurrentDir(diretorio_relat);
Done := FindFirst(ExtractFilePath(diretorio_relat)+'*.rtm',0,SRec);
while Done = 0 do
begin
ListBox1.Items.Add(ChangeFileExt(SRec.Name,''));
Done := FindNext(SRec);
end;
FindClose(SRec);


Obrigado galera.
Responder

Gostei + 0

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

Aceitar