ZIP é um formato de compressão de arquivos muito utilizado e uma ferramenta dessas não deve faltar em uma linguagem de programação.
Pzip é uma biblioteca Prisma que cumpre tal tarefa, feita em C ela é rápida e eficiente. Com funções básicas é possível criar e manipular arquivos zip, inclusive descompactá-los.
Baixar pzip – (linux – compilar / windows use pzip.dll já compilada);
Exemplo simples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
local pz = inclua'pzip' // nome.zip, nivel:1-6, modo:escrita,leitura,adicao,e,l,a); local z = pz.abra("nome.zip", pz.NIVEL_COMPRESSAO_PADRAO, "escrita"); se nao z entao erro'Erro ao tentar criar arquivo zip'; fim se nao z:abra_item("teste/teste.txt") entao erro'Erro ao tentar criar item' fim; z:escreva("olá está é uma gravação de string para o item\nmais uma linha"); z:feche_item(); se nao z:abra_item("algo.c") entao erro'Erro ao tentar criar item' fim; z:escreva_arquivo('pzip.c'); //anexa o conteúdo de um arquivo. z:escreva("\n//---------- outro arquivo ----------------\n"); //anexa uma string z:escreva_arquivo('compila.sh'); //anexa o conteúdo de outro arquivo z:feche_item(); //fechando o item senão dá erro. z:feche(); //poderia ser pz.feche(z); |
Para mais informações veja os exemplos e o manual na pasta baixada.
MANUAL DE REFERÊNCIA
PZIP-0.4
Biblioteca de criação de manipulação de arquivos zip em Prisma
Adalberto A. Felipe
JUN/2018
1 – O que é?
Esta é um binding da lib minizip em C, que está em domínio público.
Com ela você poderá:
-
criar arquivos *.zip (comprimidos);
-
alterá-los;
-
ver o conteúdo;
-
extrair arquivos *.zip;
2 – Licença
A biblioteca pzip não possui licença, você pode usá-la como bem entender sem nenhum custo ou exigência. Se sentir vontade pode citar o autor.
3 – Como incluir em seu programa Prisma
Da mesma forma que as demais, use: local pzip = inclua’pzip’;
Certifique-se de baixar e instalar corretamente o arquivo ‘pzip.so’; caso não funcione na sua distribuição use o compila.sh para recompilar e automaticamente será instalada. (Baixe o arquivo de acordo com a versão Prisma, 1.0 ou 1.1 – para Windows o arquivo é pzip.dll);
4 – Funções pzip dizponíveis:
4.0 – Para saber a versão use: imprima(pzip._VERSAO);
4.1 – zip = pzip.abra( ‘Arq’, nivel, ‘modo’);
Abre um arquivo *.zip para leitura ou gravação (dependo do modo);
Parâmetros:
-
‘Arq’ (string) – Nome do arquivo zip, exemplo: ‘bkp.zip’
-
nivel (número) – Nível de compressão (0 – 9; se for zero não há compressão, para comprimir use de 1 a 9, ou pzip.NIVEL_COMPRESSAO_PADRAO = 6);
-
‘modo’ (string) – modo de abertura (‘escrita’, ‘leitura’, ‘adicao’ = ‘e’ , ‘l’, ‘a’);
Retorno:
-
zip (tabela) – objeto zip com os métodos embutidos.
Ou nulo em caso de erro.
4.2 – pzip.feche(zip)
Fecha um objeto zip criado anteriormente.
Parâmetros:
-
zip – objeto zip;
4.3 – ret = pzip.crie(‘arq’, arquivos, nivel);
Cria um arquivo *.zip com uma lista de arquivos.
Parâmetros:
-
‘arq’ (string) – nome do arquivo, exemplo: ‘teste.zip’
-
arquivos (tabela) – Uma tabela com a lista de todos os arquivos alvos para compactação, esses arquivos devem existir. Ex.: local arquivos = { ‘teste.c’, ‘teste.prisma’, ‘lib.pris’, ‘outro.txt’, ‘audio.mp3’, ‘video.mp4’, ‘/home/User/meu_arquivo.xx’, ‘etc’ }; É possível passar a tabela diretamente se quiser.
-
nivel (número) – nível de compressão ( 0 – sem compressão; 1-9 = com compressão, ou use a variável reservada: pzip.NIVEL_COMPRESSAO_PADRAO);
Dica: use a biblioteca dir (igdir) para listar arquivos e depois passe como 2 parâmetro da função acima!
4.4 – ret = pzip.extraia(“Arq”, “pasta”, callback, dado);
Extrai automaticamente todo o conteúdo de um *.zip para determinada pasta.
Parâmetros:
-
‘Arq’ (string) – nome do arquivo zip a ser extraído.
-
‘pasta’ (string) – nome da pasta destino onde será extraído o conteúdo. (deve existir);
-
callback (funcao ou nulo) – é a função callback que será executada automaticamente durante a extração, veja o potótip da função:
funcao callback (Arq, dado)
imprima(Arq, dado)
fim;
-
dado (qualquer valor ou nulo) – é o dado extra passado para callback automaticamente.
Veja um exemplo real desta função:
local zip = inclua’pzip’ //função callback ao extrair funcao ao_extrair( arq, dado) imprimaf(“Arquivo extraído: %s (%d)\n”, arq, dado.cont); dado.cont = dado.cont + 1; retorne 0; fim //o dado extra pode ser qualquer valor, melhor uma tabela, já que dentro dela //podemos passar outros valores. local dado = { cont=1 }; zip.extraia(“nome.zip”, “result”, ao_extrair, dado); //será extraído dentro da pasta result |
Obs.: A callback e o dado extra são parâmetros opcionais, podendo ser omitidos, neste caso não há como saber o progresso da extração.
Retornos:
-
ret (falso ou verdadeiro) – falha ou sucesso.
5 – métodos do objeto zip retornado pela funão .abra();
Atenção, use ‘:’ ou ‘->’ para acessar os métodos.
5.1 – ret = zip:abra_item(‘Item’);
Abre um item (arquivo) que está inserido no *.zip
Esse método só está presente quando o arquivo *.zip for aberto no modo ‘leitura’
Parâmetros:
-
‘Item’ (string) – o nome do arquivo dentro do *.zip, ex.: ‘dados/teste.prisma’
Retornos:
-
ret (falso ou verdadeiro) – falha ou sucesso.
5.2 – ret = zip:feche_item();
Fecha o item atual aberto.
Não há parâmetros.
Retornos:
-
ret (falso ou verdadeiro) – falha ou sucesso.
5.3 – ret = zip:total_itens();
Retorna o número de arquivos compactados dentro do *.zip.
Não há parâmetros;
Retornos:
-
ret (Número de itens ou falso);
5.4 – ret = zip:abra_item_por_indice(indice);
Abre um item (arquivo comprimido) pelo seu índice numérico. Todo zip tem de 1 a Total itens, podendo ser acessados pelo seu número usando um laço ‘para’, por exemplo.
Parâmetros:
-
indice (número) – o índice para acessar o item ( 1 – total);
Retornos:
-
ret (falso ou verdadeiro) – falha ou sucesso.
5.5 – nome = zip:nome_item();
Retorna o nome do item atual acessado caso este seja acessado via índice.
Não há parâmetros;
Retornos:
-
nome (string ou falso) – o nome do arquivo atual ou falso em caso de erro.
5.6 – indice = zip:indice_item();
Retorna o índice do item aberto atual.
Não há parâmetros;
Retornos:
-
indice (número) – o índice do item atual ou falso em caso de erro.
5.7 – ret, nerro = zip:dir_item();
Retorna verdadeiro se o item for um diretório (pasta);
Não há parâmetros.
Retornos:
-
ret (verdadeiro ou falso) – Verdadeiro se o item for pasta, falso caso contrário.
-
nerro (número) – caso ret seja falso é retornado um número em nerro. Se for zero é porque não é pasta, caso seja menor que zero é um erro que aconteceu.
5.8 – ret = zip:tam_item();
Retorna o tamanho do item (quando descompactado) em bytes.
Não há parâmetros.
Retornos:
-
ret (número) – o tamanho do arquivo em bytes;
5.9 – ret = zip:crc32_item();
Retorna o número crc32 do item atual. O crc32 é um método de verificação da integridade da string, para saber mais sobre crc32 faça uma busca na internet.
Não há parâmetros.
Retornos:
-
ret (número) – crc32 do item atual.
5.10 – ret = zip:escreva(‘str’); //este método só está disponivel no modo ‘escrita’;
Escreve (compacta) uma string no arquivo zip.
Parâmetros:
-
‘str’ (string) – string a ser compactada.
Retornos:
-
ret (verdadeiro ou falso) – sucesso ou falha.
5.11 – ret = zip:escreva_arquivo(‘Arq’); //este método só está disponivel no modo ‘escrita’;
Escreve (compacta) um arquivo diretamente para o zip.
Parâmetros:
-
‘Arq’ (string) – o nome do arquivo para ser compactado.
Retornos:
-
ret (verdadeiro ou falso) – sucesso ou falha.
5.11 – str = zip:leia();
Lê (descompacta) o conteúdo de um item para uma string.
Não há parâmetros.
Retornos:
-
str (string) – a string do arquivo descompactada. (basta gravar a string em um arquivo depois)
5.12 – ret = zip:leia_arquivo(‘Arq’);
Lê (descompacta) diretamente para um arquivo.
Parâmetros:
-
‘Arq’ (string) – nome do arquivo a ser descompactado. Ex.: teste.prisma
Retornos:
-
ret (verdadeiro ou falso) – sucesso ou falha.
5.13 – ret = zip:extraia_item( callback, dado);
Extrai um item aberto para uma string. A string é passada pela callback.
Parâmetros:
-
callback (função) – função Prisma com os seguintes parâmetros:
funcao ao_extrair_item(arg, limite, str, tam) retorne tam; fim
Em que:
* arg (qualquer valor) – é o dado extra.
* limite (número) é o offset do buffer
*str (string) – é a string parcial descompactada.
*tam (número) – é o tamanho da string descompactada.
Obs.: esses parâmetros são passados automaticamente pela função chamadora.
-
dado (qualquer valor) – é um dado extra caso queira passar algum valor para dentro da callback pela função chamadora. Para passar mais de um dado, use tabela.
Retornos:
-
ret (verdadeiro ou falso) – sucesso ou falha.
Veja um exemplo completo de uso:
local pz = inclua’pzip’; dado = { str=”; //buffer do conteúdo do arquivo descompactado tam=0; //tamanho do arquivo descompactado } funcao ao_extrair_item(arg, limite, str, tam) imprima(‘->’,limite); arg.str = arg.str .. str; dado.tam = dado.tam + tam; retorne tam; fim zip = pz.abra(‘nome.zip’, 0, ‘leitura’); zip:abra_item(‘algo.c’); zip:extraia_item(ao_extrair_item, dado); imprima(dado.str, dado.tam);//só salvar em um arquivo em vez de imprimir zip:feche_item(); zip:feche(); |
Dica! – Caso queira usar este método para descompactar um zip contendo vários arquivos que você não sabe o nome, use as funções:
-
ret = zip:total_itens();
-
ret = zip:abra_item_por_indice(índice);
-
nome = zip:nome_item();
-
e por fim basta usar o nome do item atual para extraí-lo.
Veja um exemplo abaixo:
|
FIM
Para mais exemplos veja a pasta exemplos no arquivo de download desta biblioteca.
Sinta-se a vontade para dar sugestões ou críticas, ou ainda, em caso de dúvidas visite o fórum oficial: http://linguagemprisma.br4.biz/prisma_forum
ou pelo e-mail: linguagemprisma@gmail.com