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