Olá pessoal…
Hoje vou mostrar uma função desenvolvida para compactar arquivos em AdvPL com a extensão .rar ou .zip (utilizando o WinRAR).
Primeiramente, instale o WinRAR, e coloque ele nas variáveis de ambiente (leia o artigo Como utilizar o WinRAR pelo Prompt de Comando).
Agora, basta compilar a rotina e usar, ela recebe 3 parâmetros, o diretório dentro da Protheus Data com os arquivos (por exemplo, \diretorio\*.pdf), se será .rar ou .zip e qual é o nome do arquivo (teste.rar).
Abaixo um print da pasta antes de executar a rotina:
E abaixo um print depois de compactar os arquivos.
Abaixo o código fonte completo.
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zCompacta Função para compactar arquivos utilizando .rar ou .zip @type function @author Atilio @since 21/09/2016 @version 1.0 @param cDirArqs, character, Diretório de arquivos dentro da Protheus Data (ex.: "\_diretorio\*.pdf") @param lRar, lógico, Define se será com a extensão .rar (.T.) ou .zip (.F.) @param cArqNovo, character, Nome do arquivo a ser gerado @example u_zCompacta("\x_arquivos\*.txt", .T., "teste.rar") u_zCompacta("\x_arquivos\*.pdf", .F., "teste.zip") /*/ User Function zCompacta(cDirArqs, lRar, cArqNov) Local aArea := GetArea() Local cDirRar := SuperGetMV("MV_X_RAR", .F., "C:\Program Files\WinRAR\") Local cComando := "" Local cDirSrv := Alltrim(GetSrvProfString("RootPath","")) Local cDirResto := "" Default cDirArqs := "" Default lRar := .T. Default cArqNov := "arquivo_novo."+Iif(lRar, "rar", "zip") //Se tiver arquivos para compactar If !Empty(cDirArqs) cDirResto := SubStr(cDirArqs, 1, RAt("\", cDirArqs)) //Se for com a extensão rar If lRar cComando := "rar a "+cArqNov+" "+cDirSrv+cDirArqs+" -ep -df" //Senão, será zip Else cComando := "winrar a -afzip "+cArqNov+" "+cDirSrv+cDirArqs+" -ep -df" EndIf //Executando o comando no servidor WaitRunSrv(cDirRar+cComando, .T., cDirSrv+cDirResto) EndIf RestArea(aArea) Return
Update 08/02/2017:
Conforme sugestão do Luciano Silva, coloquei no fonte na variável cDirRar para buscar o conteúdo de um parâmetro, pois pode variar dependendo das versões do Windows e até mesmo do tipo (32 bits ou 64 bits).
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Bom dia Dan_Atilio.
Uma pequeníssima mudança em seu ótimo fonte.
Recomendo colocar o conteúdo da variável ” cDirRar ” em um parâmetro SX6!!
Local cDirRar := GetMV( “XXXXXX” )
Porque ?
Porque é possível em uma instalação do WinRar o usuário escolher outro diretório do padrão, bem como, o WinRar ser um portable, ou até mesmo em questões de SO Windows diferentes ou localização diferente (Windows em Inlges por exemplo).
E, deixa pro cliente livre pra ele alterar quando quiser.
No mais, está excelente!
Bom dia Luciano, tudo bem?
Rapaz, verdade hein, já alterei a postagem.
Obrigado pela dica.
Um grande abraço.