pzip – biblioteca para arquivos *.zip em Prisma

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:

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

linguagemprisma@gmail.com

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:

  1. ‘Arq’ (string) – Nome do arquivo zip, exemplo: ‘bkp.zip’

  2. 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);

  3. ‘modo’ (string) – modo de abertura (‘escrita’, ‘leitura’, ‘adicao’ = ‘e’ , ‘l’, ‘a’);

Retorno:

  1. 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:

  1. zip – objeto zip;

4.3 – ret = pzip.crie(‘arq’, arquivos, nivel);

Cria um arquivo *.zip com uma lista de arquivos.

Parâmetros:

  1. ‘arq’ (string) – nome do arquivo, exemplo: ‘teste.zip’

  2. 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.

  3. 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:

  1. ‘Arq’ (string) – nome do arquivo zip a ser extraído.

  2. ‘pasta’ (string) – nome da pasta destino onde será extraído o conteúdo. (deve existir);

  3. 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;

  4. 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:

  1. 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:

  1. ‘Item’ (string) – o nome do arquivo dentro do *.zip, ex.: ‘dados/teste.prisma’

Retornos:

  1. ret (falso ou verdadeiro) – falha ou sucesso.

5.2 – ret = zip:feche_item();

Fecha o item atual aberto.

Não há parâmetros.

Retornos:

  1. 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:

  1. 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:

  1. indice (número) – o índice para acessar o item ( 1 – total);

Retornos:

  1. 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:

  1. 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:

  1. 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:

  1. ret (verdadeiro ou falso) – Verdadeiro se o item for pasta, falso caso contrário.

  2. 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:

  1. 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:

  1. 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:

  1. ‘str’ (string) – string a ser compactada.

Retornos:

  1. 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:

  1. ‘Arq’ (string) – o nome do arquivo para ser compactado.

Retornos:

  1. 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:

  1. 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:

  1. ‘Arq’ (string) – nome do arquivo a ser descompactado. Ex.: teste.prisma

Retornos:

  1. 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:

  1. 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.

  2. 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:

  1. 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:

  1. ret = zip:total_itens();

  2. ret = zip:abra_item_por_indice(índice);

  3. nome = zip:nome_item();

  4. 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

 

 

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *