Archivo

Entradas Etiquetadas ‘ZIP’

Testeando XE2… (soporte nativo para ficheros ZIP)

miércoles, 14 de septiembre de 2011 16 comentarios
Share Button

ZIPFile   Otra de las nuevas funcionalidades que trae la versión de XE2 es el soporte para ficheros ZIP. No es que sea especialmente transcendental, pero en mi caso la he utilizado bastante en mis desarrollos y hasta ahora lo había tenido que hacer mediante componentes externos (he  probado varios paquetes).

   Para ello se ha añadido a la unit System.ZIP, todo lo necesario para el trabajo con este tipo de ficheros.

   En sistema de trabajo es bastante sencillo. Para trabajar con un fichero de este tipo tenemos que crear un objeto de la clase TZIPFile y abrirlo (utilizando la función Open). Tenemos diferentes modos de apertura dependiendo de las operaciones a realizar con el fichero (read,write o readwrite).

0
1
2
// Abrir un fichero
procedure Open(ZipFileName: string; OpenMode: TZipMode); overload;
procedure Open(ZipFileStream: TStream; OpenMode: TZipMode); overload;

Una vez abierto el fichero, podemos utilizar las operaciones básicas.
Extraer ficheros existentes dentro del archivo:

0
1
2
3
4
// Extraer un fichero sobre una ubicación
procedure Extract(FileName: string; Path: string = '';
                  CreateSubdirs: Boolean=True); overload;
procedure Extract(Index: Integer; Path: string = '';
                  CreateSubdirs: Boolean=True); overload;

O extraerlos todos:

0
1
// extraerlos todos hacia un directorio
procedure ExtractAll(Path: string = '');

Añadir ficheros a un archivo comprimido existente:

0
1
2
// Añadir ficheros a un archivo comprimido
procedure Add(FileName: string; ArchiveFileName: string = '';
              Compression: TZipCompression = zcDeflate); overload;

(esta tienen bastantes variantes sobrecargadas con diferentes parámetros)

Y también podemos comprobar la integridad de un fichero comprimido existente mediante la función IsValid (que en este caso está definida como función de clase).

0
class function IsValid(ZipFileName: string): Boolean; static;

No son todas las funciones, pero sí las básicas; También hay algunas más definidas como procedimientos de clase, que nos permiten realizar operaciones de forma más sencilla y/o rápida.

Para ponerlo en práctica y probarlo he realizado un sencillo ejemplo que incluye las operaciones básicas; Y podéis comprobar que con pocas líneas es fácil hacer casi todo lo que se espera de estos ficheros.

 

TestZIPFile

Por ejemplo, el código para extraer todo el contenido sobre un directorio seleccionado es el siguiente:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TForm3.ActionExtractExecute(Sender: TObject);
var
  b:boolean;
  DirOut:String;
begin
  // El nombre es vacío?
  if (zipFileName = '') then begin
    // Abrir uno
    ActionOpen.Execute;
    // Correcto?
    if (zipFileName = '') then begin
      Exit;
    end;
  end;
 
  // Es Valido
  b := xf.IsValid(zipFileName);
 
  // no correcto?
  if not (b) then begin
    MessageDlg('Error al abrir el fichero. Parece que es' +
               ' incorrecto o está corrupto.',
               mtError, [mbOK], 0);
    exit;
  end;
 
  // Extraer  // Path de salida
  b := SelectDirectory('Seleccione el directorio para extraer ficheros',
                       '', DirOut);
  if (b) then begin
    // protección
    try
      // Extraer al directorio seleccionado
      xf.Open(zipFileName, zmRead);
      xf.ExtractAll(DirOut);
      xf.Close;
      MessageDlg('La extracción se ha producido correctamente',
        mtInformation, [mbOK], 0);
    except
      MessageDlg('Se ha producido un error al extraer los ficheros.',
        mtError, [mbOK], 0);
    end;
  end;
end;

El código para añadir uno o varios ficheros seleccionados en un OpenDialog sería similar a este:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm3.ActionAddFilesExecute(Sender: TObject);
var
  b:Boolean;
  i:integer;
begin
 
  // No está creado?
  if not Assigned(xf) then begin
    // Si no lo está lo creamos
    ActionNuevoZIPExecute(nil);
  end;
  // Selecciconar ficheros a añadir
  b :=  OpenDialog1.Execute;
  if (b) then begin
    // Abrirlo
    xf.Open(zipFileName, zmReadWrite);
 
    // Para 1 fichero
    //     xf.Add(OpenDialog1.FileName);
 
    // Para n ficheros
    for i := 0 to (OpenDialog1.Files.Count - 1) do begin
      xf.Add(OpenDialog1.Files[i]);
    end;
    // cerrar
    xf.Close;
  end;
  // Actualizar la pantalla
  _UpdateFiles();
end;

Para cada fichero que hay incluído en un archivo ZIP contamos con una estructura que nos permite acceder a todas la información de forma rápida. Definido como packed record, en System.ZIP podéis encontrar la definición completa y la documentación de esta estructura:

Podéis revisar el código completo del ejemplo; Está disponible aquí y podéis descargarlo junto con el fichero  compilado.

[SOURCES + BIN]

Un saludo.

Share Button
Categories: Delphi, Ejemplos, XE2 Tags: , , ,