Página 1 de 2

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 10:26
por porter
ola pessoal, gostaria de saber se tem como apagar determinados arquivos com datas anteriores a data de hoje, encontrei varios exemplos para apagar arquivos mas sem determinar uma condição.

obrigado.

xHarbour.

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 11:44
por Jairo Maia
Olá Porter,

Nos dê mais informações do que leva você a precisar disso. Veja que é uma coisa muito perigosa, e acrescento sinistra.

Porém, esclareça as seguintes questões por exemplo:
porter escreveu:como apagar determinados arquivos
É muito amplo isso. Quais são exatamente esses determinados arquivos?
porter escreveu:com datas anteriores a data de hoje
A data anterior a hoje é referente a que: data da última alteração, ou data de criação do arquivo?

É perfeitamente possível fazer o que você quer. Mas pessoalmente gostaria de ser convencido da razão disso.

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 12:28
por porter
Olá Jairo, tem uma pasta, que guardo varios arquivos para relatorios com extensao txt para ser impresso com o W32PRN, eu apenas nao quero deixar acumular arquivos, deixando apenas os relatorios gerados na data de hoje e os anteriores a data de hoje serem deletados. A data que eu me refiro e a data da geracao do arquivo.txt

obrigado.

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 13:40
por Daniel
Porter

vc pode usar o comando FileDate()

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 15:57
por Jairo Maia
Olá Pessoal,
Daniel escreveu:vc pode usar o comando FileDate()
Não testei, mas acho que FileDate() como outras funções nativas retornam a data de modificação, não de criação.

Porter, veja o exemplo abaixo. Note que está usando a CLASSE FileInfo. Caso sirva, você tem que colocar essa classe em algum .PRG seu:

Código: Selecionar todos

Function Main()
 Local x, aFiles, cFile, aFileInfo, oFileInfo, dDataHoje:=Date(), cPastaFiles
      
 SET DATE BRIT
 SET CENTURY ON

 cPastaFiles := "C:\MinhaPasta\MinhaSubPasta\"  // coloque aqui o caminho da pasta...
      
 aFiles := Directory( cPastaFiles + "*.TXT" )   // pasta e tipo de arquivo...
      
 For x=1 To Len( aFiles )

  Clear Screen

  cFile := cPastaFiles + "\" + aFiles[ x, 1 ]  // caminho e nome do arquivo...

  oFileInfo := FileInfo():new( cFile )  // envia a Classe FileInfo...

  ?
  ? "Nome do arquivo............=> ", oFileInfo:fileName
  ? "Tamanho....................=> ", oFileInfo:fileSize
  ? "Atributos..................=> ", oFileInfo:fileAttr
  ?
  ? "Data da criação............=> ", oFileInfo:createDate
  ? "Hora da criação............=> ", oFileInfo:createTime
  ?
  ? "Data da última alteração...=> ", aFiles[ x, 3 ]
  ? "Data da última alteração...=> ", aFiles[ x, 4 ]
  ?

  /*
     Cuidado. Descomente e/ou altere aqui por sua conta e risco...
  */
  If oFileInfo:createDate < dDataHoje
 
   If Alert( "Apagar o arquivo:;;" + cFile + "?;;Pressione ESC para encerrar...", { "Nao", "Sim" } ) = 2   
      //FErase( cFile )
    EndIf

    If LastKey() = 27
      Return Nil
    EndIf

  EndIf

Next
      
Return Nil

/*
   CLASS FileInfo
*/
#include "hbclass.ch"
#include "error.ch"

CLASS FileInfo
 PROTECTED:
 DATA    cFileName    INIT ""
 DATA    aInfo        INIT { "", 0, CtoD(""), 0, CtoD(""), 0 }
 METHOD  getInfo

 EXPORTED:
 METHOD  init

 ACCESS  fileName     INLINE ::cFileName
 ASSIGN  fileName(c)  INLINE ::getInfo(c)

 ACCESS  fileAttr     INLINE ::aInfo[1]
 ACCESS  fileSize     INLINE ::aInfo[2]
 ACCESS  createDate   INLINE ::aInfo[3]
 ACCESS  createTime   INLINE TString( ::aInfo[4] )
 ACCESS  changeDate   INLINE ::aInfo[5]
 ACCESS  changeTime   INLINE TString( ::aInfo[6] )
ENDCLASS

METHOD init( cFileName ) CLASS FileInfo
 IF Valtype( cFileName ) == "C"
  ::getInfo( cFileName )
 ENDIF
RETURN self

METHOD getInfo( cFileName ) CLASS FileInfo
 IF .NOT. File( cFileName )
  RETURN ::error( "File not found"         , ;
         ::className(), "getInfo" , EG_ARG, {cFileName}        )
 ENDIF

 ::cFileName := cFileName
 FileStats( cFileName, @::aInfo[1], ;
                       @::aInfo[2], ;
                       @::aInfo[3], ;
                       @::aInfo[4], ;
                       @::aInfo[5], ;
                       @::aInfo[6]  )
RETURN self

como apagar arquivos anteriores a data de hoje

Enviado: 09 Jan 2016 18:33
por Vander
Olá Porter;

Se entendi,
Tenho algo parecido, ou seja deixo em uma pasta temporária apenas arquivos gerados no dia, faço assim:

Tenho um arquivo chamado ATUALIZA.DBF que grava a data da última execução do aplicativo.

No início do main()

Código: Selecionar todos

   USE ATUALIZA  // arq. de controle da última execução

   IF VLN00 < DATE()  // VLN00 = campo date (gravo este campo na saída do sistema)

      AEVAL(DIRECTORY("C:\TEMP2\*.DBF"),{|aFile| FErase("C:\TEMP2\"+aFile[1])})

   ENDIF
e na saída do sistema

Código: Selecionar todos

USE ATUALIZA  // arq. de controle da última execução

REPLACE VLN00 WITH DATE()

CLOSE DATABASE
Não esquecer dos tratamentos devidos (localização do arquivo, rede, etc)

Vander

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 01:17
por rochinha
Amiguinhos,

Segue minha dica mais didatica possivel:

Código: Selecionar todos

      cExtensao := "XML"
      CONTADOR  := ADIR( "*."+cExtensao )
      IF CONTADOR != 0
         DECLARE TXT_NOMES[ CONTADOR ]
         ADIR( "*."+cExtensao, TXT_NOMES )
         FOR CONTADOR := 1 TO LEN( TXT_NOMES )
                //
                ...faço alguma coisa com o arquivo             
                cFile := TXT_NOMES[CONTADOR]
         NEXT
      ENDIF   
No primeiro momento o ADIR() retorno o numero de arquivo da extensão passada. Critico se retornou uma contagem, declaro um vetor com o tamanho de itens contados, e com a mesma função preencho o vetor passando-o como parâmetro.

A laço FOR..NEXT fará outros procedimentos a meu mando.

O Jairo Maia te apresentou a função Directory(), que retorna um vetor onde uma das colunas tem as datas do arquivo, bastará percorrer o vetor 1 criticando o vetor 3 ou 4.

O Vander te apresentou AEVAL(), que avalia vetores e que recebeu um codeblock para analisar, mas este mesmo codeblock pode receber um terceiro parâmetro para critica.

Os dois métodos são avançados ao meu ver.

Consulte os parâmetros e retornos em ClipX.

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 09:08
por asimoes
Se eu entendi e...
Se estiver errado podem corrigir por favor.
Não testei.
Obs.: O vetor da função Directory no primeiro elemento, nome do arquivo não considera o path, tem que informar se for apagar em uma pasta especifica.
ExcluiArq("*.TXT")

Código: Selecionar todos

FUNCTION ExcluiArq(cArq, cDir)
LOCAL aDir, I
   hb_Default(@cArq, "*.*")
   hb_Default(@cDir, hb_DirBase()) //pasta onde o executável está rodando por padrão.
   aDir := Directory(cArq)
   IF Len(aDir) > 0
      FOR I:=1 TO Len(aDir)
         IF (DTOS(aDir[I,3]) < DTOS(Date())) 
            fErase(cDir+aDir[I,1])
         ENDIF
      NEXT
   ENDIF
RETURN Nil

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 09:41
por asimoes
Tem essa outra função que eu uso.
LimparTemp(hb_DirBase()+"*.TXT", 1)

Código: Selecionar todos

FUNCTION LimparTemp(cArq, nDias)
LOCAL cFile
   hb_Default(@nDias, 10)
   cFile := FileSeek(cArq)
   DO WHILE !Empty(cFile)
      IF FileDate() <= Date() - nDias
         IF hb_FileExists(cFile)
            FileDelete(cFile)
         ENDIF
      ENDIF
      cFile := FileSeek()
   ENDDO
RETURN Nil

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 10:23
por Jairo Maia
Olá Pessoal,
Jairo Maia escreveu:A data anterior a hoje é referente a que: data da última alteração, ou data de criação do arquivo?
porter escreveu:A data que eu me refiro e a data da geracao do arquivo.txt
Todas as funções apresentadas pelos colegas são simples e de fácil entendimento. Porém, optei por usar a Classe FileInfo, que está no exemplo que postei, porque o autor do tópico disse preferir fazer a checagem pela data de CRIAÇÃO do arquivo. Os exemplos dos colegas retornam apenas a data da última alteração.

Se pela data de alteração não fizer diferença, concordo que o autor do tópico pode usar uma das que foi apresentada pelos demais colegas, por ser mais simples de entender e usar.

Editado:
Uma correção... Na linha em meu exemplo onde coloquei:

Código: Selecionar todos

cFile := cPastaFiles + "\" + aFiles[ x, 1 ]  // caminho e nome do arquivo...
Precisa tirar essa barra que está a mais e impede o exemplo de funcionar. Tem que ser assim:

Código: Selecionar todos

cFile := cPastaFiles + aFiles[ x, 1 ]  // caminho e nome do arquivo...
Também onde coloquei:

Código: Selecionar todos

? "Data da última alteração...=> ", aFiles[ x, 3 ]
? "Data da última alteração...=> ", aFiles[ x, 4 ]
Na verdade a última linha é a hora da última alteração:

Código: Selecionar todos

? "Data da última alteração...=> ", aFiles[ x, 3 ]
? "Hora da última alteração...=> ", aFiles[ x, 4 ]

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 12:40
por asimoes
Gostei Jairo!

como apagar arquivos anteriores a data de hoje

Enviado: 10 Jan 2016 12:43
por rochinha
Amiguinhos,
...Porém, optei por usar a Classe FileInfo, que está no exemplo que postei, porque o autor do tópico disse preferir fazer a checagem pela data de CRIAÇÃO do arquivo. Os exemplos dos colegas retornam apenas a data da última alteração.
Realmente, as funções ADIR() e Directory() são simples no quesito quantidade de informação e uma classe nova pode trazer mais dados importantes que as padrão não trazem.

como apagar arquivos anteriores a data de hoje

Enviado: 11 Jan 2016 14:17
por porter
ola pessoal, optei por usar a rotina que o colega Jairo Maia passou, muito obrigado pela atenção de todos, não apenas resolvi meu problema, mas aprendi bastante tambem.

obrigado.

como apagar arquivos anteriores a data de hoje

Enviado: 12 Jan 2016 13:14
por asimoes
Prezados,

Voltando ao assunto, tem alguma função que me retorne a data de criação do diretório, não a de atualização.

como apagar arquivos anteriores a data de hoje

Enviado: 13 Jan 2016 19:26
por JoséQuintas
Já foi resolvido, mas acrescentar minha opinião:

ë até melhor a data de alteração, sinal de que realmente não usa mais.
Eu uso o bom e velho Directory() e limito os arquivos a 4 horas de "idade".

Para temporários, uso a pasta temporária do Windows, porque arquivo local é muito mais rápido do que na rede.
De quebra, a rotina acaba fazendo uma limpeza dessa pasta.
Foi bom pro meu servidor: o Windows tem limite de arquivos, e já tive problemas com a pasta temp.