Como Copiara todos os arquivos cuja data de criação estejam em um determinado período.
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.
Ex: copiara os .XML que foram criados entra 01/05/2023 a 30/05/2023.
Eduardo Silva
Curtidas 0
Melhor post
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;
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.
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
03/05/2023
Ficou assim meu codigo.
Desse modo ficou muito bom pelo menos para mim valeu pela ajuda @Arthur Heinrich
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