Fórum Tratar arquivos em um diretório #381718

19/07/2010

0

Bom dia pessoal,

tenho a seguinte situação:

1) Eu gostaria de obter a lista de todos os arquivos de um determinado diretório.

2) Em seguida eu gostaria de obter desta lista cada nome de arquivo.

3) No meu caso aqui, cada arquivo possui 3 números antes do PONTO para a EXTENSÃO. Exemplo:

ARQUIVO123.EXT
ARQUIVO124.EXT
ARQUIVO125.EXT
ARQUIVO126.EXT
ARQUIVO127.EXT
ARQUIVO132.EXT
ARQUIVO133.EXT
ARQUIVO141.EXT

    Então após obter cada nome do arquivo eu gostaria de obter o arquivo que possui o maior valor em termos dos 3 números. No nosso caso acima seria ARQUIVO141.EXT.

4) Além disso gostaria também de poder utilizar um arquivo pré-determinado por uma entrada do usuário. Exemplo: O usuário gostaria de utilizar o arquivo cujo valores são 125, neste caso eu selecionaria o ARQUIVO125.EXT.

    Alguém poderia me dar uma direção de como prosseguir neste caso? Sugestões são bem-vindas.

Agradeço a todos.

Att,

Abraão
Abraão Monteiro

Abraão Monteiro

Responder

Posts

19/07/2010

Wilson Junior

1) Para listar os arquivos https://www.devmedia.com.br/forum/viewtopic.asp?id=381450
2) Idem 1
3) Utilize a parte do Item 1 que lista o nome do arquivo e faça
Copy( 'ARQUIVO123', Length('ARQUIVO123') - 2, 3)

4) Utilize o Item 3 com o Item 1.

Espero ter colaborado.
Responder

Gostei + 0

21/07/2010

Abraão Monteiro

Bom dia Wilson,

eu sou iniciante em Delphi e fiz até o momento o seguinte source baseado na minha dúvida:

procedure TForm1.analisarVersao();
var
   arq: TStringList;
   versao: String;
   i: integer;

begin

  // COMENTARIO: Analisando os arquivos de um diretorio especifico
  arq := TStringList.Create;
  arq.addstrings(diretorio.items);
  diretorio.items.addstrings(arq);

  for i := 0 to diretorio.Count-1 do
  begin
      // COMENTARIO: Retirando todo o conteúdo após o PONTO
      versao := LeftStr(arq.ValueFromIndex[i], PosEx('.', arq.ValueFromIndex[i]) - 1);
      // COMENTARIO: Obtendo apenas os 3 caracteres numéricos
      versao := AnsiMidStr(versao, Length(versao)-3, Length(versao));
  end;

end;

Sendo que:    diretorio: TFileListBox;

Eu gostaria agora baseado nesse source de colocar primeiramente o nome do arquivo e sua respectiva versão em uma matriz de 2 colunas(poderia até mesmo ser um ListView). Exemplo:

:: Nome do Arquivo ::                                  :: Versão ::
ARQUIVO123                                               1.23
ARQUIVO234                                               2.34

Assim quando o usuário selecionar a linha do ListView e pressionar o botão DOWNLOAD eu automaticamente pegaria como string o nome do arquivo e passaria para as outras rotinas que possuo.

Agradeço a resposta e fico aguardando novas sugestões.

Att,

Abraão
Responder

Gostei + 0

21/07/2010

Abraão Monteiro

    Só lembrando também que o diretório que estou utilizando para analisar os arquivos é travado para somente um endereço no HD, o usuário não irá fazer nenhum tipo de seleção.

    Então dentro do FormCreate, por exemplo, automaticamente eu vou setar um caminho para este diretorio.

Exemplo: String diretorio := 'C:\WINDOWS\SYSTEM32\FILES';

Agradeço a todos.

Att,

Abraão
Responder

Gostei + 0

21/07/2010

Wilson Junior

Veja se isto pode lhe ajudar
procedure butAbrirClick(Sender: TObject);
begin
  if  OpenDialog1.Execute then
      ListaArquivos( ExtractFileDir(OpenDialog1.FileName) )
  ;
end;

function TemAtributo(Attr, Val: Integer): Boolean;
begin
  Result := Attr and Val = Val;
end;

procedure ListaArquivos(Diretorio: String);
var
  srArquivo: TSearchRec;
  Retorno: integer;
  Novo: TListItem;
  Versao: string;
begin
  ListView1.Clear;

  if  Diretorio[ Length(Diretorio) ] <> '\' then
      Diretorio := Diretorio + '\'
  ;

  Retorno := FindFirst( Diretorio + '\*.*', faAnyFile, srArquivo );

  try
    while Retorno = 0 do
    begin
      if  (srArquivo.Name <> '.') and (srArquivo.Name <> '..')
      and (not TemAtributo(srArquivo.Attr, faDirectory) )then
        begin
          Novo := ListView1.Items.Add;
          Novo.Caption := ExtractFileName( srArquivo.Name );

          Versao := Copy( Novo.Caption, Length(Novo.Caption) - 2, 3 );

          Novo.SubItems.Add( Copy(Versao, 1, 1) + '.' +  Copy(Versao, 2, 2) );
        end
      ;

      Retorno := FindNext( srArquivo );
    end;
  finally
    FindClose( srArquivo );
  end;
end;


Espero ter colaborado.
Responder

Gostei + 0

21/07/2010

Abraão Monteiro

Bom dia Wilson, funcionou esse source:

procedure TForm1.FormCreate(Sender: TObject);
begin

  ListaArquivos( 'C:\' );

end;

function TForm1.TemAtributo(Attr, Val: Integer): Boolean;
begin
  Result := Attr and Val = Val;
end;

procedure TForm1.ListaArquivos(Diretorio: String);
var
  srArquivo: TSearchRec;
  Retorno: integer;
  lista_coluna: TListItem;

  versao: string;

begin
  ListView1.Clear;

  if  Diretorio[ Length(Diretorio) ] <> '\' then
      Diretorio := Diretorio + '\'
  ;

  Retorno := FindFirst( Diretorio + '\*.*', faAnyFile, srArquivo );

  try
    while Retorno = 0 do
    begin
      if  (srArquivo.Name <> '.') and (srArquivo.Name <> '..')
      and (not TemAtributo(srArquivo.Attr, faDirectory) )then
        begin

          lista_coluna := ListView1.Items.Add;
          lista_coluna.Caption := ExtractFileName( srArquivo.Name );
          // COMENTARIO: Retirando todo o conteúdo após o PONTO
          versao := LeftStr(lista_coluna.Caption, PosEx('.', lista_coluna.Caption) - 1);
          // COMENTARIO: Obtendo apenas os 3 caracteres numéricos
          versao := AnsiMidStr(versao, Length(versao)-2, Length(versao));
          // COMENTARIO: Trocando 432 por 4.32
          Insert('.', versao, 2);
          lista_coluna.SubItems.Add( versao );

        end
      ;

      Retorno := FindNext( srArquivo );
    end;
  finally
    FindClose( srArquivo );
  end;
end;

    Gostaria de saber se é possível listar no listview agora o nome dos arquivos da versão menor para a versão maior. Assim ao marcar um checkbox, descrito como Última versão, o programa iria no listview na maior versão e automaticamente pegaria o arquivo correspondente ao mesmo. Exemplo:

Checkbox marcado(Pegar última versão) -> Listview(maior versão 5.67) -> Arquivo correspondente -> ARQUIVOXXY.EXE

Agradeço!

Abraão
Responder

Gostei + 0

21/07/2010

Wilson Junior

No seu ListView, altere a propriedade "SortType=stText", asim a sua última versão será o último registro.

Espero ter colaborado.
Responder

Gostei + 0

21/07/2010

Abraão Monteiro

Blz.

Executei o procedimento acima e adicionei:

 ShowMessage('Última Versão: ' + ListView1.Items[ListView1.Items.Count - 1].Caption);

Com isso eu obtenho sempre uma string com o nome do arquivo.

Grato!

Abraão
Responder

Gostei + 0

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

Aceitar