jueves, 27 de agosto de 2009

Usando ficheros comprimidos ZIP desde Harbour.

Como pone en la página web de harbour (http://www.harbour-project.org/), harbour es software libre 100 % compatible con compiladores Clipper.

Pero ademas de las funciones Clipper, el compilador ha ido añadiendo una serie de funciones nuevas (todas las que su nombre empieza por HB_... ), que muchas veces desconocemos, y que nos aportan funcionalidad extra.
Estas funciones son usadas escasamente por la comunidad de usuarios, bien porque desconoce su existencia, bien porque la documentación es excasa o nula para poderlas usar.

En la entrada de hoy vamos a centrarnos sobre dos funciones en concreto, HB_ZipFile y HB_UnZipFile, que nos va a permitir comprimir y descomprimir archivos en formato ZIP.

HB_ZipFile( cZipName, cFile | aFiles, nLevel, bBlock, lOverRide, cPassWord, lWithPath, lWithDrive, pFileProgress )


cZipName Nombre del fichero ZIP a crear

cFile | aFiles

Nombre del fichero a comprir o array de ficheros a comprimir. Unidad y Path pueden ser usados.

nLevel

Nivel de compresión. De 0 a 9

bBlock

Code block a ejecutar mientras se comprime

lOverRide

Sobreescribir el fichero si existe.

cPassWord

Password para encriptar el fichero ZIP

lWithPath

Guardar el path si/no

lWithDrive

Guardar la unidad si/no

pFileProgress

Code bloclk para progreso de archvios.




HB_UnZipFile( cFile, bBlock, lWithPath, cPassword, cPath, cFile | aFiles, FileProgress )

cFile Nombre del fichero a descomprimir

bBlock

Code block a ejecutar a medida que se va descomprimiendo

lWithPath

Permitir crear directorios si es necesario

cPassWord

Contraseña a usar para descomprimir el fichero

cPath

Path donde estraer los ficheros

cFile | aFiles

Nombre de un archivo, o array de nombres de archivos a extraer

pFileProgress

Code block para visualizar progreso de los ficheros


Las dos funciones retorman un valor booleano, informandonos si el proceso a concluido con éxito.


Veamos un primer ejemplo sencillo de comprimir / descomprimir.
scr1

Vamos a complicarlo y elaborarlo un poco mas, en el fondo haremos lo mismo, pero con una barra de evolución tanto para comprimir como descomprimir. Simplemente haremos uso de los parametros adicionales que nos permiten ejecutar codeblocks.

scr2

Como podeis ver en el fuente, hemos creado dos funciones comprime y descomprime, que son muy sencillas de usar. Comprime recibe dos parámetros, nombre del fichero zip que queremos crear, y array (arreglo) con los ficheros que queremos comprimir. Descomprime recibe como único parámetro el nombre del fichero ZIP a descomprimir.
En el interior de cada una de las funciones creamos un dialogo para visualizar la evolución, y montamos e code block necesario para que se vaya actualizando.
Como visteis al principio existen más parámentros en la función HB_ZipFile y Hb_UnZipFile, se trata de que vayais experimentando con ellos y usando los que os hagan falta. Este ejemplo es un ejemplo básico, pero creo que cubre las necesidades más comunes de compresión y descompresión.

Existen una serie de funciones adicionales para manejo de ficheros Zip, pero os las dejo para que vosotros mismos las investigueis, en descomprime por ejemplo hacemos uso de hb_GetFilesInZip ,para determinar el número de archivos contenidos en el fichero comprimido.

Ya habeis visto que no es nada complicado, si solo quereis comprimir / descompriir, con dos funciones y usando dos parámetros ya lo esta listo.

El último escollo, pero también importante, es linkar las librerías adecuadas para poder hacer uso de las funciones de manejo de ficheros ZIP.
Las librerias a ñadir a vuestro proyecto son:
hbZiparc.lib
hbmzip.lib
hbzlib.lib


Descargar fuentes

Espero que os sea de utilidad, saludos desde Mallorca.
Biel Maimó

4 comentarios:

Esteban Ojeda dijo...

Hola Biel, soy Esteban (jrestojeda) en el foro de FiveTech, estoy intentando usar estas funciones y me está dando error, supongo que es por las Lib, ya no tengo esas Lib en mi directorio de xHarbour. Se agradecería cualquier ayuda. Te dejo mi MSN (jrestojeda@hotmail.com) Saludos, Esteban.

Biel Maimó dijo...

Hola Esteban, este ejemplo esta desarrollado/probado para Harbour(1.1.0). Las funciones y librerias a las que se hace referencia vienen integradas con harbour.

En el caso de xHarbour, siento no poderte ayudar, pues no lo he probado, y desconozco si los nombres de función son los mismos.

MarioG dijo...

Hola Biel
La consulta es: existe alguna función para test de los archivos comprimidos?
Tengo una ayuda un poco viejita, 2002, y alli menciona la funcoin HB_ZIPTESTPK(), pero entiendo que es para cunado se genera backups.
Existe alguna ayuda actualizada?

Saludos
Mario

Anónimo dijo...

Hoa Biel, soy Devair del Brasil, muchas gracias pela dica