Como Copiara todos os arquivos cuja data de criação estejam em um determinado período.
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
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
Clique aqui para fazer login e interagir na Comunidade :)