Esse artigo faz parte da revista Clube Delphi edição 7. Clique aqui para ler todos os artigos desta edição


Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

ZipMaster: Biblioteca para Arquivos .ZIP

 

A seção componentes do mês desta edição tem uma novidade: temos o prazer de anunciar o primeiro componente freeware da coluna! O escolhido foi o RzipMaster, objeto para backup/compressão/descompressão de arquivos .ZIP. Este pode ser o componente dos sonhos para quem já tentou criar rotinas de backups que use recursos como compactação dos dados e “span” de arquivos entre vários discos. O objeto TzipMaster permite ainda a criação de arquivos auto-extraíveis, definição do nível de compressão dos dados, e extração do nome e tamanho dos arquivos. Veja na figura abaixo o componente instalado no Delphi 6:

 

Paleta DelphiZIP contendo o Componente ZipMaster

 

Veja na figura abaixo um dos programasexemplo que vem com o componente:

 

Programa exemplo com um arquivo zip aberto.

 

Confira agora como utilizar os principais recursos desta poderosa ferramenta:

 

Criando um arquivo ZIP a partir de outros arquivos:

 

begin

     ZipMaster1.ZipFileName:='c:\Thiago\backup01.zip';

     ZipMaster1.FspecArgs.Clear;

     ZipMaster1.FspecArgs.Add('c:\Thiago\Banco.gdb');

     ZipMaster1.FspecArgs.Add('c:\Thiago\Banco2.gdb');

     ZipMaster1.Add;

     Showmessage('Arquivos zipados com sucesso!');

end;

 

A propriedade ZipFileName, neste caso, indica o arquivo que será criado:

 

ZipMaster1.ZipFileName:='c:\Thiago\backup01.zip';

 

A propriedade FspecArgs, da classe Tstrings, irá indicar os arquivos de origem da compactação. No exemplo, os arquivos Banco.gdb e Banco2.gdb serão compactados:

 

begin

     ZipMaster1.FspecArgs.Clear;

     ZipMaster1.FspecArgs.Add('c:\Thiago\Banco.gdb');

     ZipMaster1.FspecArgs.Add('c:\Thiago\Banco2.gdb');

end;

 

E, por último, o método Add é executado:

 

ZipMaster1.Add;

 

Compactando um arquivo em múltiplos discos:

 

Basta alterar a propriedade AddOptions.AddDiskSpan para TRUE. O próprio objeto se encarregará de pedir os novos discos quando forem necessários. Veja um exemplo:

 

begin

ZipMaster1.ZipFileName:='A:\backup.zip';

ZipMaster1.FspecArgs.Clear;

ZipMaster1.FspecArgs.Add('c:\Win98\*.*');

ZipMaster1.Add;

end;

 

Veja a mensagem que aparece quando é pedido um segundo disco:

 

 

Notem que a mensagem pedeo segundo disco de 79. Antes de compactar os arquivos, o componente verifica o tamanho total dos arquivos que serão compactados, assim ele jáinforma quantos discos serão necessários para a compactação.

 

Extraindo o conteúdo de um arquivo .ZIP

 

begin

ZipMaster1.ZipFileName:='c:\processkill.zip';

ZipMaster1.ExtrBaseDir:='c:\Thiago\ProcessKill';

ZipMaster1.Extract;

Showmessage('Arquivos Extraidos com Sucesso');end;

 

A propriedade ZipFileName terá uma funcionalidade diferente neste caso. Aqui, devemos passar o nome do arquivo de origem para o objeto:

 

ZipMaster1.ZipFileName:='c:\processkill.zip';

 

devemos indicar também o diretório de destino dos arquivos, através da propriedade ExtrBaseDir:

 

ZipMaster1.ExtrBaseDir:='c:\Thiago\ProcessKill';

 

E, por fim, executar o método Extract.

A propriedade ExtrOptions permite ao desenvolver definir como o objeto irá se comportar quando se deparar com situações como: arquivos com mesmo nome, arquivos com defeito, etc... Os possíveis valores para esta propriedade são auto-explicativos e o estudo pode ser feito no próprio componente.

 

Preenchendo uma lista com nomes e tamanhos dos arquivos contidos em um .ZIP:

 

var

cont:Integer;

begin

    ListBox1.Items.Clear;

    zipmaster1.ZipFileName:='C:\ProcessKill.zip';

    for cont:=0 to ZipMaster1.Count-1 do

    with ZipdirEntry(zipmaster1.zipcontents[cont]^) do

         ListBox1.Items.Add(Filename +''+IntToStr(CompressedSize)+

         IntToStr( UncompressedSize)+

         DateToStr( FileDateToDateTime(DateTime)));

end;

 

Este exemplo irá preencher um listbox com o nome, o tamanho comprimido, o tamanho original e a data de criação dos arquivos contidos em um ZIP. Vejamos:

 

A propriedade Count indica a quantidade de arquivos que foram compactados. Com ela, podemos criar um loop para ler todos os arquivos:

 

for cont:=0 to ZipMaster1.Count-1 do

 

A propriedade ZipContents fornece todas as informações sobre os arquivos. Esta propriedade é um ponteiro para o tipo ZipDirEntry, e só pode ser acessado através de um typecast:

 

with ZipdirEntry(zipmaster1.zipcontents[cont]^) do

 

Com isto, podemos acessar os campos do tipo Record ZipDirEntry, e adicionar estas informações a um objeto listbox, por exemplo:

 

ListBox1.Items.Add(Filename+''+IntToStr(CompressedSize)+

         IntToStr(UncompressedSize)+

         DateToStr(FileDateToDateTime(DateTime)));

 

Veja abaixo os campos do Record ZipDirEntry:

 

MadeByVersion Indica a versão do programa ZIP na qual os arquivos foram compactados.

 

HostVersionNo Tipo do sistema operacional utilizado para comprimir o arquivo (0=DOS,WINDOWS; 7=Macintosh).

 

Version Versão do arquivo.

 

Flag Opcional

 

CompressionMethod Tipo da compressão (0=sem compressão; 1=Arquivo foi cortado; 2=Compressão 1; 3=Compressão 2; 4=Compressão 3; 5=Compressão 4.

 

DateTime Data/hora da criação do arquivo.

 

 

CompressedSize Tamanho do arquivo comprimido.

 

UncompressedSize Tamanho do arquivo original.

 

FileNameLength Quantidade de caracteres no nome do arquivo.

 

ExtraFieldLength Quantidade de caracteres na extensão.

 

FileCommentLen Tamanho do comentário.

 

StarOnDisk Em um spanning, indica o disco de início do arquivo.

 

IntFileAttrib Indica se o arquivo é texto.

 

ExtFileAttrib Atributos de diretório.

 

FileName Nome do arquivo.

 

FileComment Comentário.

 

Criando um arquivo auto-extraível:

 

begin

    Zipmaster1.ZipFilename :='C:\Thiago\Backup01.ZIP';

    ZipMaster1.ConvertSFX;

    Showmessage('Converção Completada');

end;

 

Como vemos, basta atribuir o nome do arquivo zipado na propriedade ZipFileName e executar o método ConvertSFX.

 

Conclusão

Os exemplos acima demonstram apenas uma pequena parte do que o objeto é capaz. Outras funções muito interessantes, como eventos que ocorrem durante o processamento de um arquivo, recursos para criação de senhas, retorno de códigos de erro e outros estão disponíveis. O Componente é compatível com o Delphi 2,3,4,5 e 6 e possui um ótimo Help e vários exemplos. Toda a funcionalidade do objeto é exposta nestes exemplos, que estão muito bem comentados. O componente e seus arquivos correspondentes estão disponíveis para download em nossa homepage, no endereço: http://www.clubedelphi.com.br/compo/zipmaster.zip.