Como Copiara todos os arquivos cuja data de criação estejam em um determinado período.

Delphi

03/05/2023

Queria saber como fazer para Copiar arquivos de uma pasta sendo que preciso copiara apenas os que tenho data de criação entra uma data especifica.
Ex: copiara os .XML que foram criados entra 01/05/2023 a 30/05/2023.
Eduardo Silva

Eduardo Silva

Curtidas 0

Melhor post

Arthur Heinrich

Arthur Heinrich

03/05/2023

Você precisa dividir seu processo em dois:

1 - Aprender a copiar um arquivo
2 - Aprender a identificar os arquivos que interessam

O Delphi utiliza 3 funções para identificar os arquivos existentes em um diretório: FindFirst, FindNext e FindClose

A função FindFirst inicia o processo de busca. Através dela, você fornece a pasta e a máscara dos arquivos que te interessam.

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

A função FindNext, busca o próximo arquivo com as mesmas características.

function FindNext(var F: TSearchRec): Integer;

Ao final, quando não existem mais arquivos na pasta, você deve executar o FindClose para encerrar a varredura.

procedure FindClose(var F: TSearchRec);

O resultado da busca retorna uma variável que identifica o arquivo.

TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

O valor de "Time" indica o horário do arquivo, no formato do DOS. Portanto, precisa ser convertido usando a função FileDateToDateTime:

function FileDateToDateTime(FileDate: Integer): TDateTime;

var
  err : integer;
  data : TDateTime;
  F : TSearchRec;
begin
  err:=FindFirst('c:\\pasta', faAnyFile, F);
  while (err = 0) do
    begin
      data:=FileDateToDateTime(F.Time);
      if ((data >= DataInicio) and (data <= DataFim)) then
        CopyFile('c:\\pasta\\'+F.Name, 'C:\\Destino\\'+F.Name);
      err:=FindNext(F);
    end;
  FindClose(F);
end;


A função CopyFile foi colocada aqui a título de exemplo. Você pode chamar a função de cópia da API do Windows ou implementar a sua própria.
GOSTEI 2

Mais Respostas

Eduardo Silva

Eduardo Silva

03/05/2023

Ficou assim meu codigo.

procedure TfrmPrincipal.EXEbtnProcessarClick(Sender: TObject);
var
  DtInicial  : string;     // Data de inicio usado para comnpor a msg do e-mail
  DtFinal    : string;     // Data de Final usado para comnpor a msg do e-mail
  Command    : string;     // Linha de comando para fazer a cópia dos arquivos
  I          : integer;    // "I" Utilizado para identificaçãodos arquivos "X" Utilizado para contas os arquivos
  begin
  DtInicial := StringReplace(FormatDateTime('yyyy/mm/dd', EXEdtpInicial.Date),'/','',[rfReplaceAll]);
  DtFinal   := StringReplace(FormatDateTime('yyyy/mm/dd', EXEdtpFinal.Date+1),  '/','',[rfReplaceAll]);

  {$REGION ' Copiando os XML  '}
  try
  /// robocopy <source> <destination> [<file>[ ...]] [<options>]
  /// Copia dados de arquivo de um local para outro.
  /// <source>      Especifica o caminho para o diretório de origem.
  /// <destination> Especifica o caminho para o diretório de destino.
  /// <file>        Especifica o arquivo ou arquivos a serem copiados.
  ///               Caracteres curinga (* ou ?) são suportados. Se você não
  ///               especificar esse parâmetro, *.* ele será usado como valor padrão.
  /// <options>     Especifica as opções a serem usadas com o comando robocopy,
  ///               incluindo copy, file, retry, logging e opções de trabalho.
  ///
  /// Command := <'C:\\TSD\\HOST\\'+PathXML+'\\> <C:\\TSD\\TMP\\'+PathXML+'> <*.*>  </S /MAXAGE:'+DtInicial+' /MINAGE:'+DtFinal>;
  ///
  /// <options>
  /// /s	          Copia subdiretórios. Esta opção exclui automaticamente
  ///               diretórios vazios.
  /// /maxage:<n>   Especifica a idade máxima do arquivo
  ///               (para excluir arquivos com mais de n dias ou data).
  /// /minage:<n>   Especifica a idade mínima do arquivo
  ///               (exclui arquivos mais recentes que n dias ou data).

    {$REGION ' Copiando os XML NFC-e  '}
    if EXEchbNFCe.Checked then
    begin
      // Apresenta a mensagem na tela
      frmSplash.SplashText.Caption := 'Copiando os XML NFC-e!';
      frmSplash.SplashText.Repaint;
      frmSplash.SplashText.Refresh;
      // Nome da pasta no siste Hotline
      PathXMLNFCe := 'XML_NFCe';
      if not DirectoryExists('C:\\TSD\\TMP\\'+PathXMLNFCe) then ForceDirectories('C:\\TSD\\TMP\\'+PathXMLNFCe);
      //          <Pasta Origem> <Pasta Destino> <Arquivos> <DataMAX> <DataMIN>    XML_COMPRA
      Command := 'C:\\TSD\\HOST\\'+PathXMLNFCe+'\\ C:\\TSD\\TMP\\'+PathXMLNFCe+' *.* /S /MAXAGE:'+DtInicial+' /MINAGE:'+DtFinal;
      // Executa o comando DOS e retorne imediatamente
      I       := ShellExecuteAndWait('open', 'ROBOCOPY', PChar(Command), '', SW_HIDE, True);
    end;  {$ENDREGION}
  except
    on E: Exception do
    begin
      ShowMessage('Erro ao Copia os XML!' + E.Message );
      frmSplash.close;
      Exit;
    end;
  end;


Desse modo ficou muito bom pelo menos para mim valeu pela ajuda @Arthur Heinrich
GOSTEI 0
POSTAR