Estou criando um conjunto de bibliotecas referentes a compressão, empacotamento, descompressão e extração de arquivos. Já tenho três boas libs, todas vão ficar em uma pasta chamada ‘arq’.
Baixe <arqui>.
As bibliotecas que já tenho desenvolvidas são:
1 – Compressão e extração lzw.pris: lzw = inclua’arq.lzw’; Apenas para texto, não é eficiente para mídias como fotos etc.
2 – Gzip – Somente extração: zzlib.pris (extrai arquivos *.gz ): gz = inclua’arq.zzlib’;
3 – Empacotamento e extração de arquivos pac.pris (une arquivos em um só. Por enquanto não tem suporte a pastas mas logo terá.)
Essas libs são feitas em puro código Prisma logo é compatível com qualquer plataforma tendo Prisma instalada.
As duas primeiras foram convertidas de Lua para Prisma. Já a última é autoria minha mesmo.
Baixe <arqui> (Na próxima versão Prisma esta lib será adicionada como padrão.)
Veja os exemplos abaixo:
Teste com lzw:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
local lzw = inclua'arq.lzw'; local dir=inclua'igdir'; ARQ='igpbr.c'; //mude o nome para algum arquivo alvo seu. pasta,nome,ext=sis.nome_arquivo(ARQ); local txt = dir.leia_arquivobin(ARQ) ou 'aaaaaaabbbbbbbbbbcccccccccc'; t1 = sis.tempo(); poe'Iniciando, aguarde...'; comp = lzw.comprima(txt); poe'Compressao terminada'; poe'iniciando descompressão'; dec = lzw.extraia(comp); poe'Descompressao terminada'; dir.grave_arquivobin(nome .. '.lzw',comp); dir.grave_arquivobin(nome .. '2.' .. ext, dec); imprima("Tempo Gasto:", sis.diftempo(sis.tempo(),t1),'segundos'); imprima('Economizados', #dec - #comp,'bytes'); poe'Processo terminado! (ENTER para sair)'; leia(); |
Teste descompactação *.gz :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
local z = inclua'arq.zzlib' local dir=inclua'igdir' in = 'igpbr.c.gz' out = 'z_igpbr.c' tmp1 = sis.tempo(); poe'Extraindo..'; local ret = z.extrair_arq(in);//retorna string do arquivo descompactado. poe'Extracao completa' imprima('Tempo:',sis.diftempo(sis.tempo(),tmp1) ); poe'Gravando arquivo...' se ret entao dir.grave_arquivobin(out,ret); fim imprima('Tempo:',sis.diftempo(sis.tempo(),tmp1) ); |
Teste de empacotamento pac.pris :
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 44 45 |
local pac = inclua'arq.pac'; //lib pacote de empacotamento: local a = pac.abra('zz_teste.pac'); //criando o arquivo de empacotamento ret, err = a:insira('zz_igpbr.c', 'igpbr.c');//insere o arquivo igpbr.c com nome 'zz_igpbr.c'; se nao ret entao erro(err) fim; ret, err = a:insira('zz_teste_pac.prisma', 'teste_pac.prisma'); se nao ret entao erro(err) fim; a:grave(); //gravando os arquivos inseridos acima. a:feche();//no final fechamos o arquivo; poe'Lendo o arquivo agora: [ENTER para continuar...]'; //lendo o conteúdo para uma string. a = pac.abra('zz_teste.pac'); txt,err = a:busque('zz_teste_pac.prisma');//retorna em string: se txt entao poe(txt); senao imprima(err); fim //extraindo um arquivo: ret,err = a:extraia('zz_igpbr.c','zzz_igpbr.c'); a:feche(); se nao ret entao imprima(err); sis.saia(1) fim poe'Arquivo descompactado'; /* a:extraia();//sem parametros extrai todos: */ poe'Processo terminado ENTER para sair...'; leia(); |
Esta última lib (pac.pris) será melhorada para permitir empacotamento de pastas inteiras e assim unir em um único arquivo, podendo ser usada em conjunto com alguma lib de compactação.
Há uma lib lz4 feita em C de rápida compressão e descompressão, estará disponível na versão 1.0.101 ou posterior.
Até mais.