Jump to content
Fivewin Brasil

Comandos para compactação


HERGON

Recommended Posts

Bom dia

Utilizo:

- HB_ZipFile() para compactar ;

- HB_GetFilesInZip() para listar arquivos que estão dentro do zip. (cria uma array)

Existe algum comando que me retorne os arquivos e seus respectivos tamanhos que estão em um arquivo ZIP (tamanho real do arquivo, não compactado) ?

Alguém teria uma lista completa dos comandos?

Agradeço antecipadamente.

Herberson Gontijo

Ponteware Informática

Link to comment
Share on other sites

Herberson

Se não me engano é isso que você precisa:

oZip:Listar()

****************************************************************************
METHOD Listar(pcPath,pcNome) CLASS TZIP
****************************************************************************
*
* Gera um array com informações dos arquivos contidos em um ZIP
* Parametros: pcPath,pcNome
* Retorno: Array de 5 dimensões,dimensões indicadas abaixo
*
* ******************
* * Dimensões: *
* * 1- cName *
* * 2- cSize *
* * 3- dDate *
* * 4- cTime *
* * 5- cAttributes *
* ******************
*
* Autor: Samir
* 23/10/2008 - 09:12:40
*
****************************************************************************

Local Result := {}, aZip := {}, i := 0, cUnit := ""
Local j := 0, cAux := "", aLog := {}, cDiretorio

Default pcPath := ::cPath, pcNome := Alltrim(::cNome)

cUnit := "" //Left(pcPath,3)


//-- Obtém informações dos arquivos contidos no zip
aZip := HB_GETFILESINZIP(pcPath+pcNome,.T.)

If Len(aZip) == 0
   MsgAlert("Não encontrou arquivo para retornar!","Atenção")
   Return .T.
Endif

For i := 1 to Len(aZip) //Len(aZip) equivale a HB_GETFILECOUNT(aZip)

    //-- Log

    cAux := ""

    For j := 1 to 9
        cAux += DetalheLog(j,aZip[i,j])
    Next

    aAdd(aLOG,cAux)

    //-- Resultado( Nome, Tamanho, Data, Hora, Atributos)
    aAdd(Result,{cUnit+aZip[i,1],aZip[i,2],aZip[i,6],aZip[i,7],aZip[i,9]})
    //aAdd(Result,{aZip[i,1],aZip[i,2],aZip[i,6],aZip[i,7],aZip[i,9]})

    If i % 10 = 0
       SysRefresh()
    Endif

Next

//-- Obtem o diretório para salvar o Log
cDiretorio := cFilePath(GetModuleFileName(GetInstance()))   //+"\Logs\"
*If !IsDirectory(cDiretorio)
*   MakeDir(cDiretorio)
*Endif

//-- Salva o log
SaveZipLog(cDiretorio,pcNome,aLog)

HB_GCAll()

Return Result

Esta na classe bakcup ja disponibilizada qui no forum.

Att

João Bosco

Link to comment
Share on other sites

Veja se ajuda:


Category: Zip Functions


hb_GetZipComment

hb_SetBuffer

hb_SetDiskZip

hb_SetZipComment

hb_UnzipFile

hb_ZipDeleteFiles

hb_ZipFile

hb_ZipFileByPKSpan

hb_ZipFileByTDSpan

hb_ZipTestPK






abs.

Link to comment
Share on other sites

Boa tarde

Obrigado JoãoSolution e Kapiaba por responder.

Olhei no link que o Kapiaba postou mas não achei nada que pudesse me retornar o tamanho dos arquivos dentro do arquivo zipado, já a rotina do JoaoSolution está acusando a falta das funções: DetalheLog() e SaveZipLog(), se puder me enviar eu testo aqui e dou o retorno.

Obrigado

Herberson Gontijo

Link to comment
Share on other sites

Bom dia

Obrigado a todos que responderam o post, especialmente ao JoãoSolution que me enviou a classe por email.

Estudando a classe, consegui chegar no resultado desejado mesmo sem utilizá-la... Vamos à solução do problema:

Quando utilizava o comando

aFilesInZip:=HB_GetFilesInZip(cArqZip)

o retorno é uma array unidimensional com os nomes dos arquivos zipados contidos no arquivo .zip

Se utilizarmos o mesmo comando passando .t. como segundo parâmetro, o retorno será uma array multi com todos os dados dos arquivos zipados contidos no arquivo .zip, inclusive o tamanho real, que era o que eu precisava. Exemplo:

aFilesInZip:=HB_GetFilesInZip(cArqZip, .t.)

Solução perfeita para o que eu queria, mas se não fosse a classe que o João enviou não saberia.... Por isso, meu MUITO OBRIGADO.

Herberson Gontijo

Ponteware Software Ltda.

Link to comment
Share on other sites

Olá, eu acho que no seu caso, o melhor seria usar o comando XBL_GETFULL_INFOZIP diretamente, teste e reporte.


// LOCAL aFiles := hb_GetFilesInZip( cFile, XBL_GETFULL_INFOZIP )


Aproveitando, vou deixar um exemplo simples de backup para o pessoal.



#include 'fivewin.ch'

#define HBL_ZIPLEVEL 9
#define XBL_ZIPOVERWRITE .T.
#define XBL_ZIPWITHPATH .T.
#define XBL_GETFULL_INFOZIP .T.

Function Main()

Local oDlg, oBtn[ 3 ], oMtr, oFont, ;
nProgr := 0

DEFINE FONT oFont NAME "Verdana" SIZE 0, -11
DEFINE DIALOG oDlg FROM 0, 0 TO 300, 400 PIXEL TITLE "Testing Zip functions with FWH and xHarbour"


@ 10, 20 BUTTON oBtn[ 1 ] PROMPT "Zip Databases" OF oDlg SIZE 40, 15 PIXEL ACTION ZipDatabases( oMtr )

@ 30, 20 BUTTON oBtn[ 2 ] PROMPT "Exit" OF oDlg SIZE 40, 15 PIXEL ACTION oDlg:End()

@129, 3 METER oMtr VAR nProgr PROMPT "Progress" OF oDlg ;
FONT oFont UPDATE TOTAL 16 ;
COLORS CLR_HGRAY, CLR_BLACK BARCOLOR CLR_HBLUE, CLR_YELLOW SIZE 191, 15 PIXEL

ACTIVATE DIALOG oDlg CENTERED

oFont:End()

Return Nil

Static Function ZipDatabases( oMtr )

Local nEle, aFiles, aSizes, ;
nTotal := 0, ;
bOnZipFile := { | cFile, nFile | nTotal += aSizes[ nFile ], oMtr:Set( nTotal ), SysRefresh() }, ;
aDirectory := Directory( "*.dbf" ), ;
cZipName := "Databases.zip"

aFiles := {}
aSizes := {}

For nEle := 1 To Len( aDirectory )
AAdd( aFiles, aDirectory[ nEle, 1 ] )
AAdd( aSizes, aDirectory[ nEle, 2 ] )
nTotal += aDirectory[ nEle, 2 ]
Next

oMtr:nTotal := nTotal
nTotal := 0

hb_ZipFile( cZipName, aFiles, HBL_ZIPLEVEL, bOnZipFile, XBL_ZIPOVERWRITE,,, XBL_ZIPWITHPATH )

Return Nil


abs.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...