Compactando arquivos para .rar ou .zip em AdvPL

Compactando arquivos para .rar ou .zip em AdvPL

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:

Arquivos sem compactação
Arquivos sem compactação

E abaixo um print depois de compactar os arquivos.

Arquivos compactados
Arquivos compactados

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

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

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.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

2 thoughts on “Compactando arquivos para .rar ou .zip em AdvPL

  1. 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!

Deixe uma resposta

%d blogueiros gostam disto: