Página 1 de 1

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 13 Jan 2017 17:38
por Cisino Junior
Boa tarde!
Estou implementando uma rotina que comprime arquivos para o formato zip e descomprime. A função de comprimir funciona corretamente.
Meu problema está em descomprimir os arquivos zipados, a rotina descomprime, mas não aceita o Path, ou seja, eu quero que o usuário possa escolher a pasta na qual será extraído os arquivos. Tentei utilizar a função hb_unzipfile() mas da erro ao compilar. Estou utilizando a versão da HMG IDE 3.4.3 32bits.

Segue código abaixo:

Código: Selecionar todos

#include <hmg.ch>

Function Main

         Load Window Main
         Main.Center
         Main.Activate

Return

*------------------------------------------------------------------------------*
Function selectFileFolder() // seleciona pasta a ser compactada.
*------------------------------------------------------------------------------*
         Main.Text_1.value := getFolder()

Return nil

*------------------------------------------------------------------------------*
Function selectFolder() // seleciona pasta destino
*------------------------------------------------------------------------------*
         Main.Text_2.Value := getFolder()

Return Nil

/*
** Configura comandos COMPRESS e UNCOMPRESS
*/
#command COMPRESS [ FILES ] <afiles> ;
  TO <zipfile> ;
  BLOCK <block> ;
  [ <ovr: OVERWRITE> ] ;
  [ <srp: STOREPATH> ] ;
  [ PASSWORD <password> ] ;
=> ;
 COMPRESSFILES ( <zipfile> , <afiles>, <block> , <.ovr.> , <.srp.> , <password> )

#command UNCOMPRESS [ FILE ] <zipfile> ;
                    EXTRACTPATH <cExtractPath> ;
                    [ BLOCK <block> ] ;
                    [ PASSWORD <password> ] ;
                    => ;
         UNCOMPRESSFILES ( <zipfile>, <cExtractPath>, <block> , <password> )

*------------------------------------------------------------------------------*
Function compress() // Compacta arquivos dentro do diretório selecionado.
*------------------------------------------------------------------------------*
local cDirFile:=Main.Text_1.value+'\*.*'
Local aDir := Directory( cDirFile, "D" ), aFiles:= {}, nLen
Local cPath := Main.Text_1.value+'\'

      FillFiles( aFiles, aDir, cPath )

      If ( nLen := Len(aFiles) ) > 0
         Main.ProgressBar_1.RangeMin := 1
         Main.ProgressBar_1.RangeMax := nLen
         MODIFY CONTROL Label_1 OF Main FONTCOLOR {0,0,0}

         COMPRESS aFiles ;
                  TO 'ZipTest.Zip' ;
                  BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ;
                  OVERWRITE

         MODIFY CONTROL Label_1 OF Main FONTCOLOR {0,0,255}
         Main.Label_1.Value := 'Backup is finished'
      EndIf

Return nil

*------------------------------------------------------------------------------*
Function UnPackZip() // Descompacta arquivo zip selecionado.
*------------------------------------------------------------------------------*
local cCurDir := GetCurrentFolder(), cArchive, cDestino:=Main.Text_2.Value+'\'

      cArchive := Getfile( { {'Zip Files','*.ZIP'} } , 'Open File' , cCurDir, .f. , .t. )

      aFiles := HB_GetFilesInZip(cArchive)


      If !Empty(cArchive)
          Main.ProgressBar_1.RangeMin := 0
          Main.ProgressBar_1.RangeMax := GetFilesCountInZip( cArchive )
          MODIFY CONTROL Label_1 OF Main FONTCOLOR {0,0,0}

          ? HB_UNZIPFILE(cArchive, {|cFile,nPos| main.ProgressBar_1.value := nPos/len(aFiles)*100 },,, cDestino, aFiles)

        /*  UNCOMPRESS cArchive ;
          **           EXTRACTPATH cDestino ;
           **          BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) }
           */
          MODIFY CONTROL Label_1 OF Main FONTCOLOR {0,0,255}
          Main.Label_1.Value := 'Restoration of Backup is finished'
        Else
            msgInfo("Selecione a pasta de destino para descompatação!", "Atenção!")
            return nil
      EndIf

Return nil

*------------------------------------------------------------------------------*
Function FillFiles( aFiles, cDir, cPath ) // Preenche arrays de arquivos.
*------------------------------------------------------------------------------*
Local aSubDir, cItem

 for cItem :=1 TO LEN(cDir)
     If cDir[cItem][5] <> "D"
        AADD( aFiles, cPath+cDir[cItem][1] )
     Else
         If cDir[cItem][1] <> "." .AND. cDir[cItem][1] <> ".."
            aSubDir := DIRECTORY( cPath+cDir[cItem][1]+"\*.*", "D" )
            aFiles:=FillFiles( aFiles, aSubdir, cPath+cDir[cItem][1]+"\" )
         EndIf
     EndIF
 next

Return aFiles

*------------------------------------------------------------------------------*
Function ProgressUpdate( nPos , cFile , lShowFileName ) // Atualiza progressBar.
*------------------------------------------------------------------------------*

 Default lShowFileName := .F.

 Main.ProgressBar_1.Value := nPos
 Main.Label_1.Value := cFileNoPath( cFile )

 if lShowFileName
  INKEY(.2)
 endif

Return Nil

*------------------------------------------------------------------------------*
Function GETFILESCOUNTINZIP ( cFileName ) // Conta quantos arquivos existe dentro do zip.
*------------------------------------------------------------------------------*
LOCAL i := 0 , hUnzip , nErr

 hUnzip := HB_UNZIPOPEN( cFileName )

 nErr := HB_UNZIPFILEFIRST( hUnzip )

 DO WHILE nErr == 0

    i++
    nErr := HB_UNZIPFILENEXT( hUnzip )

 ENDDO

 HB_UNZIPCLOSE( hUnzip )

Return i
Agradeço desde já qualquer ajuda.

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 16 Jan 2017 11:20
por Kapiaba

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 19 Jan 2017 17:51
por Cisino Junior
Eu já tentei isso e não funcionou, ainda não consegui fazer o extractpath funcionar =/

Obrigado por tentar ajudar.

Atenciosamente,
Cisino Junior.

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 20 Jan 2017 09:47
por Kapiaba

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 23 Jan 2017 13:49
por Cisino Junior
Farei isso, obrigado!

Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES

Enviado: 07 Fev 2017 12:39
por Cisino Junior
Consegui utilizar as funções da lib hbziparc, foram as que melhor supriram minhas necessidades. Segue link da documentação dessa lib.

https://harbour.github.io/doc/hbziparc. ... _unzipfile

Fica ai pra quem precisar, o link foi postado em outro tópico que eu fiz pelo wmanesco.

viewtopic.php?f=4&t=17980

Atenciosamente,
Cisino Junior.