Tratar arquivos em um diretório
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
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
Curtidas 0
Respostas
Wilson Junior
19/07/2010
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
4) Utilize o Item 3 com o Item 1.
Espero ter colaborado.
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.
GOSTEI 0
Abraão Monteiro
19/07/2010
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
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
GOSTEI 0
Abraão Monteiro
19/07/2010
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
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
GOSTEI 0
Wilson Junior
19/07/2010
Veja se isto pode lhe ajudar
Espero ter colaborado.
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.
GOSTEI 0
Abraão Monteiro
19/07/2010
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
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
GOSTEI 0
Wilson Junior
19/07/2010
No seu ListView, altere a propriedade "SortType=stText", asim a sua última versão será o último registro.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Abraão Monteiro
19/07/2010
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
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
GOSTEI 0