Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Clase TZipFile, para comprimir y descomprimir archivos (https://www.clubdelphi.com/foros/showthread.php?t=81218)

Al González 23-10-2012 08:58:19

Clase TZipFile, para comprimir y descomprimir archivos
 
Hola.

Hoy estuve revisando algunas de las novedades de Delphi XE2, llamando mi atención una clase nativa de nombre TZipFile cuyo propósito es permitir la creación de archivos comprimidos ZIP, así como la extracción del contenido de ese tipo de archivos.

Después de hacer unas pruebas con esta clase, consideré que valdría la pena mostrarles el código, para quien pudiera servirle:

Código Delphi [-]
Uses
  System.Zip;

Procedure TForm1.Button1Click(Sender: TObject);
Var
  Zip :TZipFile;
Begin
  { Creamos un archivo ZIP de nombre "Prueba.zip", comprimiendo dentro de
    él los archivos Carta.txt y Dibujo.bmp }

  Zip := TZipFile.Create;

  Try
    Zip.Open ('C:\Delphi\Ejemplos\TZipFile\Prueba.zip', zmWrite);
    Zip.Add ('C:\Delphi\Ejemplos\TZipFile\Carta.txt');
    Zip.Add ('C:\Delphi\Ejemplos\TZipFile\Dibujo.bmp');
  Finally
    Zip.Free;
  End;
End;

procedure TForm1.Button2Click(Sender: TObject);
Var
  I :Integer;
  Zip :TZipFile;
Begin
  { Abrimos el archivo Prueba.zip y mostramos dentro de Memo1 el nombre de
    los archivos comprimidos que contiene }

  Zip := TZipFile.Create;

  Try
    Zip.Open ('C:\Delphi\Ejemplos\TZipFile\Prueba.zip', zmRead);
    Memo1.Clear;

    For I := 0 To High (Zip.FileNames) Do
      Memo1.Lines.Add (Zip.FileNames [i]);
  Finally
    Zip.Free;
  End;
end;

procedure TForm1.Button3Click(Sender: TObject);
Var
  Zip :TZipFile;
Begin
  { Extraemos en el directorio C:\Delphi\Ejemplos\TZipFile los archivos que
    están dentro de Prueba.zip }

  Zip := TZipFile.Create;

  Try
    Zip.Open ('C:\Delphi\Ejemplos\TZipFile\Prueba.zip', zmRead);
    Zip.ExtractAll('C:\Delphi\Ejemplos\TZipFile');
  Finally
    Zip.Free;
  End;
End;

Por cierto, encontré este artículo de nuestro buen amigo Germán Estévez, en donde explica con mucho mayor detalle esta característica.

Saludos.

Al González.

Casimiro Notevi 23-10-2012 10:24:40

Gracias por la aportación :)

Ñuño Martínez 23-10-2012 11:31:49

No está mal. :)

En Free Pascal existen dos unidades (libtar y zstream) con clases cuya combinación permiten manejar archivos .tar, .gz y .tar.gz. La diferencia está en que, en estos casos, son derivadas de la clase TStream, por lo que no son simples contenedores y no tienen que ser, necesariamente, ficheros de disco (por ejemplo, puede usarse para acceso a redes). Claro que, por lo poco que sé, con el formato PKZIP no debe ser fácil usar TStream.

Me pregunto si estas unidades (libtar y zstream) pueden usarse en Delphi.

cloayza 23-10-2012 14:21:50

Cita:

Empezado por Ñuño Martínez (Mensaje 447736)
Me pregunto si estas unidades (libtar y zstream) pueden usarse en Delphi.

Solo existe una manera de salir de la duda...:confused:

Saludos

dec 23-10-2012 15:52:11

Cita:

Empezado por cloayza (Mensaje 447745)
Solo existe una manera de salir de la duda...:confused:

Saludos

Tal vez sean las mismas unidades que usan en los componentes Turbo Power Abbrevia... desde luego dichos "formatos" están soportados, y, por otro lado, me suenan a mí dichas unidades...

Casimiro Notevi 23-10-2012 16:34:28

Eso iba a decir, que "así visto/leido" parece Abbrevia :)

Al González 23-10-2012 20:02:58

Cita:

Empezado por Ñuño Martínez (Mensaje 447736)
[...] Me pregunto si estas unidades (libtar y zstream) pueden usarse en Delphi.

Si compilan en Free Pascal / Lazarus, no veo por qué no pudieran adaptarse a Delphi. :)

Por otra parte, revisando más a fondo la clase TZipFile, veo que ésta hace uso de la biblioteca ZLib, trabajo original de Jean-loup Gailly y Mark Adler, al que contribuyeron Borland, Base2 Technologies y Roberto Della Pasqua para importarla a Delphi.

Como curiosidad, en el código de esta nueva clase podemos encontrar ejemplos de algunas de las características más "recientes" del compilador y la RTL, como:
  • tipos de datos de clase
  • campos de clase
  • genéricos
  • diccionarios
  • métodos anónimos
  • ámbitos de unidades (conocidos como "espacios de nombres" en otros lenguajes)
  • función nativa ReturnAddress
  • constructores de clase
  • destructores de clase

Se me hace agua la boca. ^\||/

Si tan solo el IDE fuera tan amable, armónico y estable como el de Delphi 7...pero bueno, esos tiempos tardarán en volver y no ayuda quedarse a esperarlos sin hacer nada.

Ñuño Martínez 23-10-2012 21:01:54

Cita:

Empezado por dec (Mensaje 447750)
Tal vez sean las mismas unidades que usan en los componentes Turbo Power Abbrevia... desde luego dichos "formatos" están soportados, y, por otro lado, me suenan a mí dichas unidades...

Pues por lo que he leído, no son las mismas clases, aunque los formatos sí están soportados.

Cita:

Empezado por Al González (Mensaje 447774)
Si compilan en Free Pascal / Lazarus, no veo por qué no pudieran adaptarse a Delphi. :)

¡Hay tantas cosas que funcionan en Free Pascal y no en Delphi! Mi envolvente para la biblioteca Allegro, sin ir más lejos. :rolleyes:

Cita:

Empezado por Al González (Mensaje 447774)
Si tan solo el IDE fuera tan amable, armónico y estable como el de Delphi 7...pero bueno, esos tiempos tardarán en volver y no ayuda quedarse a esperarlos sin hacer nada.

Ya sabes lo que dice la canción:

"Echar la vista atrás es bueno, a veces.
Mirar hacia delante es vivir sin temor."

Aunque creo que no se refería a lo mismo. ¿O sí?

roman 23-10-2012 21:17:36

Cita:

Empezado por Ñuño Martínez (Mensaje 447785)
Mi envolvente para la biblioteca Allegro

Tendría que ser envoltura. Envolvente es un adjetivo ;)

// Saludos

Ñuño Martínez 25-10-2012 12:56:00

Cita:

Empezado por roman (Mensaje 447787)
Tendría que ser envoltura. Envolvente es un adjetivo ;)

// Saludos

Bueno... sí... Es que es "unidad envolvente"... o algo... ¿cuela o no cuela? :rolleyes:

roman 25-10-2012 16:26:18

Vale, cuela :p. De todas formas, no me gusta eso de envoltura. Preferiría interfaz, quizá.

// Saludos

Casimiro Notevi 26-10-2018 19:51:08

Cita:

Empezado por Missael (Mensaje 529282)
Hola

Crea un hilo nuevo, gracias.

Al González 27-10-2018 02:50:12

Cita:

Empezado por Casimiro Notevi (Mensaje 529283)
Crea un hilo nuevo, gracias.

¿Ya lo creó? Pa' seguir leyendo... :-)


La franja horaria es GMT +2. Ahora son las 12:42:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi