Listando arquivos de um diretório

 

Às vezes precisamos listar arquivos de um diretório para fazer algum processamento nos mesmos. Um exemplo disso seria a importação de dados em arquivos textos para o banco de dados. Pense que para isso seria muito mais fácil informar somente o diretório para que todos os arquivos fossem processados.

Então, mãos à obra. Crie uma nova aplicação no Delphi 7 colocando e configurando os seguintes componentes:

 

Label1: Mude o Caption para “Diretório”;

Edit1: Mude o Name para “edtDiretorio” e apague o Text;

CheckBox1: Mude o Caption para “Incluir Subdiretórios” e o Name para “chkSub”;

Label2: Mude o Caption para: “Arquivos”;

Memo1: Mude o Name para “memLista” e apague a propriedade Lines;

Button1: Mude o Caption para “&Listar”.

 

A aparência do software deve ficar conforme a Figura 1.

 

Figura 1. Aparência depois de configurado

Clique duas vezes no botão Listar e coloque o seguinte código:

 

memLista.Lines.Clear;

ListarArquivos(edtDiretorio.Text, chkSub.Checked);

 

Esse é código é responsável por limpar o conteúdo do Memo e chamar um procedimento que irá buscar os arquivos contidos em um diretório, levando em conta se o usuário escolheu procurar também nos subdiretórios.

Para criar o procedimento suba o editor de código até a seção Private. Abra um espaço e coloque o seguinte código:

 

procedure ListarArquivos(Diretorio: string; Sub:Boolean);

 

Com o cursor em cima do último código, pressione CTRL+SHIFT+C para que o Delphi crie a estrutura do procedimento. Dentro desse procedimento coloque o seguinte:

 

var

  F: TSearchRec;

  Ret: Integer;

  TempNome: string;

begin

  Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);

  try

    while Ret = 0 do

    begin

      if TemAtributo(F.Attr, faDirectory) then

      begin

        if (F.Name <> '.') And (F.Name <> '..') then

          if Sub = True then

          begin

            TempNome := Diretorio+'\' + F.Name;

            ListarArquivos(TempNome, True);

          end;

      end

      else

      begin

        memLista.Lines.Add(Diretorio+'\'+F.Name);

      end;

        Ret := FindNext(F);

    end;

  finally

  begin

    FindClose(F);

  end;

  end;

 

Veja que o código chamará uma outra função para verificar se o item encontrado é um diretório. Nesse caso, será chamado novamente o procedimento, informando o diretório encontrado. Isso só irá acontecer se na busca for informado para incluir subdiretórios.

Vá até a seção Private e declare a função:

 

function TemAtributo(Attr, Val: Integer): Boolean;

 

Pressione CTRL+SHIFT+C e coloque o código da função:

 

Result := Attr and Val = Val;

 

Pronto, agora você pode testar, informando um diretório.

 

Figura 2. Software em teste

Pense que, ao invés de colocar o arquivo em um Memo, você pode chamar uma função que leia os arquivos encontrados.