PDA

Ver la Versión Completa : Descomprimir un archivo gzip con Delphi


jplj
01-05-2013, 19:52:12
Hola:

Buscando una forma limpia(1) de comprimir / descomprimir un archivo -si puede ser más de uno mejor, pero no imprescindible- he encontrado este post de Seaone (http://delphi.jmrds.com/?q=node/61), que realiza la primera parte: La compresión.

Quizá sea "sencillo", pero ¿cómo podría implementar la función inversa?

Decir por último que uso Delphi 7.

Muchas gracias de antemano.

(1) Limpia:
.- Sin dll externas, tal como ocurre con 7-zip
.- Sin requerir componentes extras, como abrevia, jcl, ...

Ñuño Martínez
07-05-2013, 20:17:02
El no requerir bibliotecas externas lo veo complicado. De todas formas, el algoritmo de descompresión que usa gzip es libre de patentes (bueno, y su compresión también desde hace pocos años, si no recuerdo mal) así que siempre puedes escribirlo tu. :rolleyes:

Free Pascal incluye compresión y descompresión de corrientes (TStream) con algoritmo gzip. Creo que usa bibliotecas externas, pero no estoy del todo seguro, y nada te impide echarle un ojo a su código fuente que puedes descargar desde aquí (http://www.freepascal.org/download.var). Concretamente en ./packages/paszlib/src/zstream.pp. Con suerte puede que compile en Delphi sin (muchos) cambios, aunque te prevengo de que tiene bastantes dependencias.

Ah, y recuerda que gzip únicamente comprime los datos, no empaqueta ficheros. Para empaquetar ficheros se usa, normalmente, TAR. Free Pascal también incluye la creación de archivos TAR vía corrientes. Busca ./packages/fcl-base/src/libtar.pp.

jplj
09-05-2013, 20:15:57
Hola:

Muchas gracias por tus comentarios.

Cuando hablaba de bibliotecas externas, me refería a dll,s que tuvieran que acompañar al ejecutable en la instalación; pero evidentemente no me propongo reinventar la rueda :)

En la función que Seaone propone para comprimir en formato gzip utiliza zlib (http://zlib.net/), y sería utilizando zlib o similar como pretendo realizar la descompresión.

He encontrado esta interfaz de zlib para Delphi (http://www.base2ti.com/?id=delphi.zlib) que incluye ZLibExGZ.pas, aunque aún no he tenido tiempo para probarlo, me parece que puede resolver mi problema.

Un saludo.

Al González
09-05-2013, 20:38:07
Desde Delphi XE2 lo puedes hacer (http://neftali.clubdelphi.com/?p=1752) sin bibliotecas externas al ejecutable. Básicamente enlaza archivos .obj que pertenecen a la biblioteca ZLib.

Agrego: Supongo que no sería muy complicado adaptar las unidades System.Zip y System.ZLib de XE2 a Delphi 7.

jplj
09-05-2013, 20:41:54
Muchas gracias, pero tal como decía al principio uso Delphi 7 :(

Al González
09-05-2013, 20:45:54
Me quedé pensando en esta idea:
Agrego: Supongo que no sería muy complicado adaptar las unidades System.Zip y System.ZLib de XE2 a Delphi 7.
¿Creen que valdría la pena intentarlo? :)

nlsgarcia
09-05-2013, 22:02:09
Al González,


...no sería muy complicado adaptar las unidades System.Zip y System.ZLib de XE2 a Delphi 7...¿Creen que valdría la pena intentarlo?...


Definitivamente si :)

Nelson.

Al González
09-05-2013, 22:52:40
Definitivamente si :)
Pues algo más para la agenda del bibliotecario, a ver qué logro conseguir...:o :)