ler nomer de arquivos num diretorio e deletar aqueles conf. critério
saudações amigos sou novo na praia e preciso ler nomes de arquivos num diretório e identificar qual deles devem ser apagador conforme um critério especifico. tenho a seguinte rotina feita e apresenta erro : peço ajuda de amigos com conhecimento maior do que o meu, sem mais agradeço a ateção
var
b: string;
a: string;
d,c: string;
SR: TSearchRec;
I,E: integer;
F: Double;
g: Int64;
begin
a := caminho;//constante declarada
d := (FormatFloat(#####.000, (now)));
b := d + .ini;
I := FindFirst(caminho+*.ini, faAnyFile, SR);
while I = 0 do begin
begin
E:=pos(.ini,(SR.Name));
g:=Trunc(Now);
F:=g-50;
if E<F then
begin
DeleteFile(caminho+ SR.Name) ;
end;
I := FindNext(SR);
end;
end;
var
b: string;
a: string;
d,c: string;
SR: TSearchRec;
I,E: integer;
F: Double;
g: Int64;
begin
a := caminho;//constante declarada
d := (FormatFloat(#####.000, (now)));
b := d + .ini;
I := FindFirst(caminho+*.ini, faAnyFile, SR);
while I = 0 do begin
begin
E:=pos(.ini,(SR.Name));
g:=Trunc(Now);
F:=g-50;
if E<F then
begin
DeleteFile(caminho+ SR.Name) ;
end;
I := FindNext(SR);
end;
end;
Marcio Teles
Curtidas 0
Respostas
Bruno Leandro
31/03/2012
quais tipos de criterios seriam utilizados para exclusao, ex: extensão, conteudo, nome, etc
GOSTEI 0
Marcio Teles
31/03/2012
Seriam arquivos do tipo *.ini com o nome seguindo este padrão 48521,21.ini ( não podendo ser diferente ) então seria feito um comparativo seguindo este critério 48521,21<48522,2 (exemplo) satisfeita esta condição então seria excluido o arquivo do diretório
GOSTEI 0
Sérgio Saibel
31/03/2012
Ola...
Vc não poderia comparar com equals, uma vez que vc tem o nome do arquivo e o padrão de exclusão sendo strings??
Espero ter ajudado.
Vc não poderia comparar com equals, uma vez que vc tem o nome do arquivo e o padrão de exclusão sendo strings??
Espero ter ajudado.
GOSTEI 0
Bruno Leandro
31/03/2012
tenta fazer desta forma
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 48522.2;
while I = 0 do begin
begin
E := StrToFloatDef(Copy(SR.Name,length(SR.Name)-11,8),99999.99);
if E < F then
begin
DeleteFile(caminho + SR.Name);
end;
I := FindNext(SR);
end;
end;
end;
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 48522.2;
while I = 0 do begin
begin
E := StrToFloatDef(Copy(SR.Name,length(SR.Name)-11,8),99999.99);
if E < F then
begin
DeleteFile(caminho + SR.Name);
end;
I := FindNext(SR);
end;
end;
end;
GOSTEI 0
Marcio Teles
31/03/2012
Bom dia Bruno, primeiro obrigado pela sua grande gentileza, eu apliquei a sua sujestão e foi apresentado o seguinte resultado, os nomes dos arquivos foram comparados com um valor cosntante 99999.99 ( apresentado em sua sujestão) sendo que o necessario seria a comparação do valor 48522.2 com o nome do arquivo buscado no diretório e caso satisfeita a condição (if E < F then) o arquivo seria deletado
GOSTEI 0
Marcio Teles
31/03/2012
Bom dia Mandola, eu não conheço esta sua sujestão como seria ?
GOSTEI 0
Marcio Teles
31/03/2012
Bruno não tenho serteza,mas seria necessaria a bosca do nome do arquivo sem a extensão . caso voce possa me ajudar qual seria esse metodo para aplicar sua sujetão
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 48522.2;
while I = 0 do begin
begin
E := StrToFloatDef(Copy(SR.Name,length(SR.Name)-11,8),****NOME DO ARQUIVO*****);
if E < F then
begin
DeleteFile(caminho + SR.Name);
end;
I := FindNext(SR);
end;
end;
end;
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 48522.2;
while I = 0 do begin
begin
E := StrToFloatDef(Copy(SR.Name,length(SR.Name)-11,8),****NOME DO ARQUIVO*****);
if E < F then
begin
DeleteFile(caminho + SR.Name);
end;
I := FindNext(SR);
end;
end;
end;
GOSTEI 0
Bruno Leandro
31/03/2012
na verdade o comando StrToFloatDef(Copy(SR.Name,length(SR.Name)-11,8),99999.99)
esta copiando os 8 ultimos caracteres do nome exceto a extensão ou seja
o arquivo com o nome xxxx_12345.67.ini irá copiar 12345.67, caso não esteja neste tipo de formato
ele irá definir o valor 99999.99 para que esse arquivo não sejá excluido, caso esteja no formato informado
irá realizar a comparação com o parametro informado.
esta copiando os 8 ultimos caracteres do nome exceto a extensão ou seja
o arquivo com o nome xxxx_12345.67.ini irá copiar 12345.67, caso não esteja neste tipo de formato
ele irá definir o valor 99999.99 para que esse arquivo não sejá excluido, caso esteja no formato informado
irá realizar a comparação com o parametro informado.
GOSTEI 0
Marcio Teles
31/03/2012
Foi entendido a sua explicação Bruno, o problema é que nesta condição esta sendo deletado todos os arquivos com formato expecifico,mas a condição que foi imposta pra min é que deve ser comparado valores ( tipo Double) ou seja ...
if E < F then // se o nome do arquivo ( já convertido em Float ) for menor que um outro Float (E)
begin
DeleteFile(caminho + SR.Name);//deletar o arquivo com o nome F e somente ele
end;
if E < F then // se o nome do arquivo ( já convertido em Float ) for menor que um outro Float (E)
begin
DeleteFile(caminho + SR.Name);//deletar o arquivo com o nome F e somente ele
end;
GOSTEI 0
Sérgio Saibel
31/03/2012
Ola...
Da uma olhada neste link, pode ser util
http://www.delphibasics.co.uk/Method.asp?NameSpace=System&Class=String&Type=Class&Method=Compare
Espero ter ajudado.
Da uma olhada neste link, pode ser util
http://www.delphibasics.co.uk/Method.asp?NameSpace=System&Class=String&Type=Class&Method=Compare
Espero ter ajudado.
GOSTEI 0
Sérgio Saibel
31/03/2012
Ola...
Vc não poderia comparar com equals, uma vez que vc tem o nome do arquivo e o padrão de exclusão sendo strings??
Espero ter ajudado.
Vc não poderia comparar com equals, uma vez que vc tem o nome do arquivo e o padrão de exclusão sendo strings??
Espero ter ajudado.
Desculpe equals não se aplica ao delphi.
GOSTEI 0
Marco Salles
31/03/2012
Só copiei e colei um tópico que eu respondi
partir da versão delphi 2010 a uses IOUtils; tem classes
especificas para esta finalidade
Código:
var
path:string;
begin
if not TDirectory.Exists(D:\envio) then
raise Exception.Create(Invalid Path);
for path in TDirectory.GetFiles(D:\envio\,*.xml,
TSearchOption.soTopDirectoryOnly) do
showmessage(TPath.GetFileName(path));
Perceba temos ainda a opção de
de filtrar os resultados retornados .. Por exemplo Arquivos com
tamanho de tantos Kb , ou com data de criação a partir de , ou modificados , com determinado Nome especifico etc...
Por exemplo
Código:
var
path:string;
Filtro : TDirectory.TFilterPredicate;
begin
if not TDirectory.Exists(D:\envio) then
raise Exception.Create(Invalid Path);
Filtro := function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := (TDirectory.GetCreationTime(Path) < date - 10)
end;
for path in TDirectory.GetFiles(D:\envio,*.xml,
TSearchOption.soTopDirectoryOnly,filtro) do
showmessage(TPath.GetFileName(path));
end;
Voce filtra os resultados somente os arquivos com data de criação dos
últimos dez dias . enfim uma série de possibilidades
Tópico Original
http://www.activedelphi.com.br/forum/viewtopic.php?t=71008&highlight=tdirectory&sid=31c9e57b0818e35c496a65a557322895
partir da versão delphi 2010 a uses IOUtils; tem classes
especificas para esta finalidade
Código:
var
path:string;
begin
if not TDirectory.Exists(D:\envio) then
raise Exception.Create(Invalid Path);
for path in TDirectory.GetFiles(D:\envio\,*.xml,
TSearchOption.soTopDirectoryOnly) do
showmessage(TPath.GetFileName(path));
Perceba temos ainda a opção de
de filtrar os resultados retornados .. Por exemplo Arquivos com
tamanho de tantos Kb , ou com data de criação a partir de , ou modificados , com determinado Nome especifico etc...
Por exemplo
Código:
var
path:string;
Filtro : TDirectory.TFilterPredicate;
begin
if not TDirectory.Exists(D:\envio) then
raise Exception.Create(Invalid Path);
Filtro := function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := (TDirectory.GetCreationTime(Path) < date - 10)
end;
for path in TDirectory.GetFiles(D:\envio,*.xml,
TSearchOption.soTopDirectoryOnly,filtro) do
showmessage(TPath.GetFileName(path));
end;
Voce filtra os resultados somente os arquivos com data de criação dos
últimos dez dias . enfim uma série de possibilidades
Tópico Original
http://www.activedelphi.com.br/forum/viewtopic.php?t=71008&highlight=tdirectory&sid=31c9e57b0818e35c496a65a557322895
GOSTEI 0
Sérgio Saibel
31/03/2012
E ai colega conseguiu excluir os arquivos??
GOSTEI 0
Marcio Teles
31/03/2012
Obrigado pela força Mandola, mas ainda não deu serto vou usar a sujestão do Marcos...realmente é um desafio que não esperava dar este trabalho todo mas, repito agradeço muito a ajuda de vocês companheiros, e quem tiver alguma outra sujestão fica o meu agradecimento . Eu estarei nessa empreitada até o dia 05/04/12, caso não consigua vou ter que abortar a missão
GOSTEI 0
Marcio Teles
31/03/2012
Marco a sua sujestão apresenta como resultado o nome e a extensão ou seja todos os arquivos sendo que questão seria somente arquivos tipo *.ini sem a sua extenção. Agradeço a sua ajuda... ....meu amigo ...tó sem ideias
GOSTEI 0
Marco Salles
31/03/2012
Acho que não Marcio..
Tente verificar novamente a sugestão e vera que ele t apresenta um filtro
caso não consiga coloque o código que voce esta utilizando seguindo a dica que lhe
passei
Tente verificar novamente a sugestão e vera que ele t apresenta um filtro
caso não consiga coloque o código que voce esta utilizando seguindo a dica que lhe
passei
GOSTEI 0
Marcio Teles
31/03/2012
Saudações amigo Marco a rotina sugerida apresenta todos os arquivos que estão no diretorio com a sua repectiva extenção, na questão que estou pedindo ajuda é a de apresentar todos os arquivos de um diretorio com a extenção e somente o tipo *.ini e sem a sua extenção por exemplo os arquivos 1824.25.ini deve ser apresentado da seguinte forma 1824.25 ( sem a extenção e somente o tipo *.ini) peço desculpa se eu não estiver te compreendendo meu amigo é que estou tão concentrado nessa intenção que não consigo ver a solução
GOSTEI 0
Marco Salles
31/03/2012
Mas olhe o Filtro amigi
Filtro := function(const Path: string; const SearchRec: TSearchRec): Boolean
vc tem que adpatar para a sua necessidade
O filtro que propos no exempl era de tamanho e de data de criação
o seu filtro é bem mais simples
caso não consiga , acho que ira conseguir , poste novamanente
desculpa é que estou sem tempo quase que nenhum , senão ja postaria a solução pronta
Filtro := function(const Path: string; const SearchRec: TSearchRec): Boolean
vc tem que adpatar para a sua necessidade
O filtro que propos no exempl era de tamanho e de data de criação
o seu filtro é bem mais simples
caso não consiga , acho que ira conseguir , poste novamanente
desculpa é que estou sem tempo quase que nenhum , senão ja postaria a solução pronta
GOSTEI 0
Bruno Leandro
31/03/2012
olá marcio, voce poderia dar exemplo de nomes de arquivos que seriam excluidos e quais não seriam excluidos e o parametro para exclusão é informado pelo usuário ou é fixo
GOSTEI 0
Marcio Teles
31/03/2012
saudações meus amigo o que eu tenho feito para excluir seria esta:
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 41003.58;
while I = 0 do begin
begin
E := ??????????????????????????????;/esta linha captura o nume sem a extenção
if E < F then
begin
DeleteFile(caminho + FloatToStr(E)+.ini);
end;
I := FindNext(SR);
end;
end;
******************
o que eu tó presisando é pesquisa num diretorio onde será verificado todos os arquivos de extenção *.ini (I := FindFirst(caminho+*.ini, faAnyFile, SR);)e nesses arquivos será capturado somente o nome sem extenção com estes nmes será comparado com um valor caso satifeita a condição(if E < F then) será deletado o arquivo ( do nome comparado)
var
b: string;
SR: TSearchRec;
I: integer;
F,E: Double;
g: Int64;
begin
I := FindFirst(caminho+*.ini, faAnyFile, SR);
F := 41003.58;
while I = 0 do begin
begin
E := ??????????????????????????????;/esta linha captura o nume sem a extenção
if E < F then
begin
DeleteFile(caminho + FloatToStr(E)+.ini);
end;
I := FindNext(SR);
end;
end;
******************
o que eu tó presisando é pesquisa num diretorio onde será verificado todos os arquivos de extenção *.ini (I := FindFirst(caminho+*.ini, faAnyFile, SR);)e nesses arquivos será capturado somente o nome sem extenção com estes nmes será comparado com um valor caso satifeita a condição(if E < F then) será deletado o arquivo ( do nome comparado)
GOSTEI 0
Marcio Teles
31/03/2012
os nomes dos arquivos estão da seguinte forma :
41003,580.ini (nessa condição)
o que preciso é a seguinte apresetção = 41003,580 ( depois seria convertido em double para a comparação )
41003,580.ini (nessa condição)
o que preciso é a seguinte apresetção = 41003,580 ( depois seria convertido em double para a comparação )
GOSTEI 0
Marco Salles
31/03/2012
Simples , com o Delphi xe é simples
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(C:\Ajuda\Marcio_Arquivos) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(caminho,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(C:\Ajuda\Marcio_Arquivos) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(caminho,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
GOSTEI 0
Marco Salles
31/03/2012
Simples , com o Delphi xe é simples
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(caminho) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(caminho,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(caminho) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(caminho,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
GOSTEI 0
Marco Salles
31/03/2012
Alguem , pelo amor de Deus , entre em contato com o pessoal do Forum , reclame , reclame
reclame sobre a identação do forum .. As tags [code] e
reclame sobre a identação do forum .. As tags [code] e
não funcionam , e a aspas
simples desaparece nas postagens . Fica quase que impossivel a comunicação . Me sinto um
surdo conversando com um cego ou vice versa
simples desaparece nas postagens . Fica quase que impossivel a comunicação . Me sinto um
surdo conversando com um cego ou vice versa
GOSTEI 0
Marco Salles
31/03/2012
Simples , com o Delphi xe é simples
[code]
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(C:\Ajuda\Marcio_Arquivos) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(C:\Ajuda\Marcio_Arquivos,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
[code]
var
path:string;
F,E: currency;
FormatSettings:TFormatSettings;
begin
FormatSettings.DecimalSeparator:=,;
try
if not TDirectory.Exists(C:\Ajuda\Marcio_Arquivos) then
raise Exception.Create(Invalid Path);
E:=strtocurr(41003,5818); //CONDICAO *****
for path in TDirectory.GetFiles(C:\Ajuda\Marcio_Arquivos,*.ini,TSearchOption.soTopDirectoryOnly) do
begin
showmessage(TPath.GetFileName(path)+ sLineBreak+
TPath.GetFileNameWithoutExtension(path));
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
if F <= E then
showmessage(é menor ou igual) // TDirectory.Delete(path); para deletar
else
showmessage(é Maior)
end;
finally
FormatSettings.DecimalSeparator:=.;
GOSTEI 0
Marcio Teles
31/03/2012
Sr. MARCO ANTONIO SALLES , Fico muito agradecido pela sua boa vontade assim como os outros amigos Bruno e Mandola, fico EXCELENTE era exatamente isso que eu estava precisando para apresentar numa oportunidade de trablaho que recentemente consegui, isso me dara condição para continuar as minhas atividades ( não com tal conhencimento avaçado que você possui ), mas com a condição de aperfeiçoamento . desejo muito sucesso pra você eo os outros amigos Bruno e mandola OBRIGADO
GOSTEI 0
Marco Salles
31/03/2012
Tudo bem Marcio , o código funciona e é muito limpo pois as novas classes do delphi permite isto
mas cuidado com a intrução
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
pois se estiver um arquivo ini que não seje do formato numerico
o valor de F será zero e ele pode atender a condição e ser erradamente deletado
Por exemplo um Arquivo chamado config.ini neste diretório
O Valor de F será Zero .. O que pode ser um problema
é bom voce atentar para este chamado , para não ter surpresa desagradável
A saida é colocar o segundo parâmetro um valor que estará salvo ( um Limite Máximo
ou Minimo ) para estes arquivos ini que não devam fazer parte do processo , ou
condicionar para que quando F=Zero , não faça parte do processo
fica ai a sugestão , espere que voce entenda , caso não volte a postar
mas cuidado com a intrução
F:=StrToFloatDef(TPath.GetFileNameWithoutExtension(path),0);
pois se estiver um arquivo ini que não seje do formato numerico
o valor de F será zero e ele pode atender a condição e ser erradamente deletado
Por exemplo um Arquivo chamado config.ini neste diretório
O Valor de F será Zero .. O que pode ser um problema
é bom voce atentar para este chamado , para não ter surpresa desagradável
A saida é colocar o segundo parâmetro um valor que estará salvo ( um Limite Máximo
ou Minimo ) para estes arquivos ini que não devam fazer parte do processo , ou
condicionar para que quando F=Zero , não faça parte do processo
fica ai a sugestão , espere que voce entenda , caso não volte a postar
GOSTEI 0