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

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Luciano Silva de Souza disse:

    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