Fórum Como Copiara todos os arquivos cuja data de criação estejam em um determinado período. #619914
03/05/2023
0
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
Curtir tópico
+ 0
Responder
Post mais votado
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.
Arthur Heinrich
Responder
Gostei + 2
Mais Posts
02/10/2023
Eduardo Silva
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)