Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

NerdeX

dica: comprimindo com a própria RTL do Delphi

Recommended Posts

Pessoal! Este é o meu 1º post... sinto-me muito feliz e satisfeito com o recebimento do convite do nosso colega e amigo Aroldo Zanella para juntar-me a esta turma, e sabendo-se do seu brilhantismo, dinamismo, dedicação e imensa sabedoria... "de outros carnavais até mesmo"... posso ter a certeza que esta comunidade contém um elevadíssimo nível tecnológico...

 

Como é meu primeiro post, vou-lhes apresentar uma dica muito interessante:

Aí está...

 

Veja como comprimir e descomprimir arquivos com a própria RTL do Delphi

 

Não me perguntem o porquê, mas tenho um certo facínio por compressão de dados, sendo que já testei vários componentes. Hoje não uso nenhum deles e sim um pequeníssimo arquivo da própria RTL do Delphi chamado zLib.pas.

Fiquei surpreso com os resultados de eficiência, performance e taxas de compressão obtidos nos meus testes, onde equipara-se ao uso do compressor UPX.exe (algorítmo de compressão NRV criado por Markus F.X.J. Oberhumer e László Molnár).

 

Bem... agora vamos ver como é fácil, simples e leve sua implementação usando a zLib:

 

Insira zLib no Uses da sua Unit...

 

procedure para a compressão:

procedure TForm1.CompressãoClick(Sender: TObject);var  FileIni, FileOut: TFileStream;  Zip: TCompressionStream;begin  FileIni:=TFileStream.Create('C:\pasta\...arquivo a ser comprimido...', fmOpenRead and fmShareExclusive);  FileOut:=TFileStream.Create('C:\pasta\...arquivo comprimido...', fmCreate or fmShareExclusive);  Zip:=TCompressionStream.Create(clMax, FileOut);  Zip.CopyFrom(FileIni, FileIni.Size);  Zip.Free;  FileOut.Free;  FileIni.Free;end;
procedure para a descompresssão

procedure TForm1.DescompressãoClick(Sender: TObject);var  FileIni, FileOut: TFileStream;  DeZip: TDecompressionStream;  i: Integer;  Buf: array[0..1023]of Byte;begin  FileIni:=TFileStream.Create('C:\pasta\...arquivo comprimido...', fmOpenRead and fmShareExclusive);  FileOut:=TFileStream.Create('C:\pasta\...arquivo descomprimido...', fmCreate or fmShareExclusive);  DeZip:=TDecompressionStream.Create(FileIni);     repeat        i:=DeZip.Read(Buf, SizeOf(Buf));        if i <> 0 then FileOut.Write(Buf, i);     until i <= 0;  DeZip.Free;  FileOut.Free;  FileIni.Free;end;
Dependendo da tua necessidade... poderá adaptá-lo para que execute a compressão e descompressão de pastas inteiras e também que realize um teste de verificação na integridade dos arquivos com o auxílio de uma tabela CRC 32.

 

Abraço a todos

 

Ricardo Bastos Campos

Tec em Proc de Dados e Acad. em Sist de Informação

Santa Maria - RS

ricbcampos@ubbi.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola NerdeX, seja bem vindo...

 

Muito interessante a dica...

 

Acredito que isso tb seja válido para a CLX, abri o ZLib.pas e notei o seguinte código:

{$IFDEF LINUX}const  zlibso = 'libz.so.1';{$ENDIF}{$IFDEF MSWINDOWS}{$L deflate.obj}{$L inflate.obj}{$L inftrees.obj}{$L trees.obj}{$L adler32.obj}{$L infblock.obj}{$L infcodes.obj}{$L infutil.obj}{$L inffast.obj}....

Sabe me dizer se dessa maneira á necessário distribuir esses OBJ junto com a aplicação ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.