Escolar Documentos
Profissional Documentos
Cultura Documentos
Esta biblioteca está presente desde a versão 5 do Delphi e é muito útil para criar arquivos
compactados rapidamente podendo adicionar um ou mais arquivos no pacote. Aqui vamos
abordar um pouco do conceito de compactação e os resultados obtidos através da ZLib.
Conhecendo a ZLib
Pouca gente conhece o potencial que nossa ferramenta do dia a dia contém, e a ZLib é uma
delas. Desenvolvida sob a licença
GNU/GPL
a
ZLib
originalmente foi criada para utilização em sistemas operacionais baseados em
UNIX
/
Linux
e com seu código fonte em
C
, foi incluída pela equipe da
Borland
para utilização em aplicações com o
Delphi
. É uma excelente biblioteca de compactação e descompactação de um ou mais arquivos
obtendo um tamanho final muito semelhante ao dos melhores compressores do mercado, veja
a tabela comparativa abaixo.
Compressor Tempo GastoProporção de Compressão Tamanho Final
Mais usado hoje 6:25 5% 26,9Mb
ZLib 1:50 10% 47,1Mb
Tabela 1. Comparativo entre os compressores.
Entendendo a compressão de arquivos
A compactação (ou compressão) de dados nada mais é do que um algoritmo avançado que
"agrupa" sequencias de caracteres substituindo-as por outra menor, ou seja, se o conteúdo de
um arquivo executável contém uma sequencia de cinco letras "A" seguidas (ou "AAAAA"), o
algoritmo pode substituí-las por "5A". Por isso que quando compactamos um banco de dados
ou um arquivo texto sua proporção de compressão é menor (quanto menor, melhor), pois
arquivos deste tipo contém muitos caracteres sequenciais em sua estrutura, diferentemente de
imagens bitmap ou arquivos mp3 onde quase não há caracteres sequenciais em seu conteúdo.
Compactando arquivos com a ZLib
Para compactar um ou mais arquivos com a ZLib dispomos de uma classe chamada TCompre
ssionStream
que é responsável por criar e compactar um arquivo. Seu funcionamento é simples, ela lê o
arquivo (ou lista de arquivos) indicado alocando na memória e aplica o algoritmo de
1/6
Compactando e Descompactando com ZLib
compressão já gravando no disco. Na instância do objeto desta classe, podemos obter dados
como tamanho total do arquivo, posição de leitura atual e proporção de compressão, além de
podermos associar um evento do tipo
TNotifyEvent
para saber quando a compressão está em andamento.
O código abaixo demonstra o método de uso da classe TCompressionStream da ZLib para
compactação de um ou mais arquivos, para fazê-lo funcionar, coloque em um
form
os seguintes componentes: 2 Labels (
Label1
e
Label2
),
OpenDialog
e um
Button
. Defina a opção
ofAllowMultiSelect
do
OpenDialog1
como
True
.
// Progresso da Compactação
procedure TForm1.CompressionProgress(Sender: TObject);
begin
Label2.Caption := 'Leitura Atual: '+IntToStr((Sender as TCompressionStream).Position) +
' / Taxa de Compressão: ' + CurrToStrF(100 - (Sender as
TCompressionStream).CompressionRate, ffNumber, 2);
// Processa as mensagens do Windows na aplicação para evitar o estado "Não respondendo"
Application.ProcessMessages;
end;
2/6
Compactando e Descompactando com ZLib
3/6
Compactando e Descompactando com ZLib
É importante salientar que uma vez compactado com a ZLib, o arquivo somente poderá
ser descompactado por ela.
4/6
Compactando e Descompactando com ZLib
begin
Label1.Caption := 'Descompactando: '+IntToStr(I)+' de '+IntToStr(C);
{ Pega o nome do arquivo }
InFile.Read(L,SizeOf(L));
SetLength(S,L);
InFile.Read(S[1],L);
{ Lê o tamanho do arquivo }
InFile.Read(L,SizeOf(L));
{ Progresso do arquivo atual. Não se pode ler Decompr.Size, dá erro, por isso utilizamos L }
nMax := L;
{ Descompacta e grava o arquivo no disco }
S := Destination+S; // Adiciona o caminho do arquivo
OutFile := TFileStream.Create(S,fmCreate or fmShareExclusive);
Decompr := TDecompressionStream.Create(InFile);
Decompr.OnProgress := DecompressionProgress;
try
OutFile.CopyFrom(Decompr,L);
finally
OutFile.Free;
Decompr.Free;
end;
end;
Label1.Caption := '';
Label2.Caption := '';
finally
InFile.Free;
end;
end;
Conclusão
5/6
Compactando e Descompactando com ZLib
6/6