Como utilizar o EXTRACTPATH na função UNCOMPRESSFILES
Enviado: 13 Jan 2017 17:38
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:
Agradeço desde já qualquer ajuda.
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