Quem é do mundo *nix já deve conhecer o formato *.tar, muitas vezes confundido com um tipo de compressão de arquivo. Na verdade, trata-se de um formato de empacotamento, apenas une vários arquivos ou, até mesmo, diretórios.
O formato TAR pode ser usado em conjunto com bibliotecas de compressão de dados dando assim origem a extensões como tar.gz, tar.xz ou tar.7z. Isto significa que os dados foram comprimidos e empacotados no formato TAR.
Pensando na importância de criar e manipular arquivos no formato TAR é que fiz uma biblioteca pequena, mas poderosa, baseada no microtar da linguagem C.
Com ela será possível ler, criar e manipular arquivos *.tar, tanto no Linux quanto Windows. Apenas o empacotamento, ela não faz a compressão, para isso veja as bibliotecas de compressão em Prisma.
Outro fato importante é que esta biblioteca não lê os arquivos, apenas monta o empacotamento, ficando a cargo do programador carregar os arquivos em string, empacotá-los e depois gravar em disco.
Exemplo pmicrotar :
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 |
local mtar = inclua'pmicrotar' funcao leia_arquivobin(n) local a,err = es.abra(n,'leiturabin'); se nao a entao retorne falso, err; fim local txt = a:leia('*t'); a:feche(); retorne txt; fim local dado1 = leia_arquivobin('dados/arq1.txt'); //lemos um arquivo para uma variável string. local tar,err = mtar.abra("simples.tar",'escrita');//abrimos um arquivo tar para escrita (gravar dados nele) se nao tar entao imprima('Erro:',err,'\nEnter para sair...'); leia(); sis.saia(1) fim //se der erro o programa imprime e sai. mtar.escreva_cabecalho_arquivo(tar,"dados/arq1.txt",#dado1);//criamos um cabeçalho com o nome do arquivo (diretório completo) //note que na função acima é necessário passar o tamanho da string dado '#dado1'; mtar.escreva_dado(tar,dado1)//agora podemos gravar os dados. //aqui no meio poderia escrever muitos outros arquivos antes de finalizar e fechar. mtar.finalize(tar); mtar.feche(tar); poe('Processo terminado, verifique o arquivo "simples.tar", ENTER para sair...'); leia(); |
Para mais exemplos, veja a pasta exemplo após fazer o download da biblioteca pmicrotar.
Manual de referência da biblioteca pmicrotar-0.4
Esta biblioteca é um binding do microtar em C https://github.com/rxi/microtar
Licença: MIT – permite ser usada e modificada ou mesmo vendida sem custos (mesma licença do microtar em C). O autor não poderá ser responsabilizado pelo seu uso.
O que é pmicrotar? É uma biblioteca Prisma feita em C com funções básicas para arquivamento no formato *.tar. Este formato não compacta, apenas une os arquivos. No entanto, normalmente é usado em conjunto com uma outra lib que tenha função de compactação originando arquivos tar.gz, tar.xz etc. Em prisma temos algumas libs que podem ser usadas com esta: uma lzw escrita em puro Prisma e uma lz4 escrita em C: (Está junto com instalador prisma-1.0.101 ou superior.) https://linguagemprisma.br4.biz/blog/prisma/conjunto-de-ferramentas-arq-arquivamento/ |
Este é um manual de referência, para detalhes de uso veja a pasta exemplos!
Para importar o módulo use: local mtar = inclua’pmicrotar’;
Funções:
1 – local tar, err = mtar.abra(arq,modo);
Abre um arquivo tar para leitura ou escrita.
Parâmetros:
arq – (string) nome do arquivo. (ex.: ‘teste.tar’);
modo – (string) modo de abertura de arquivo: ‘leitura’ / ‘escrita’ / ‘adicao’
retornos:
tar – objeto tar criado ou nulo em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
2 – local ret, err = mtar.escreva_cabecalho(tar, cab);
Escreve um cabeçalho no arquivo *.tar
Parâmetros:
tar – objeto tar criado previamente.
cab – uma tabela com campos de cabeçalho. Esta tabela contém os campos:
cab.modo= numero em octal (ex.: 664 , 775) permissão, use em Linux
cab.dono = numero (ex.: 0) id do proprietário.
cab.tamanho = numero tamanho do arquivo.
cab.tempo_modif = numero – tempo da última modificação. (Veja a função igdir.atritbutos da lib igdir)
cab.tipo = numero – tipo de arquivo ou diretório. Tipos suportados:
‘0’ = Regular – arquivo. ‘1’ = HardLink ‘2’ = Link simbólico ‘3’ = Caractere especial ‘4’ = Bloco especial ‘5’ = Diretório (pasta) ‘6’ = FIFO ‘7’ = Arquivo contíguo em disco. |
Como é um número da tabela ASCII devemos usar a função cod(). Ou se preferir existe uma série de constantes de tipo predefinidas:
mtar.TIPO_REGULAR; mtar.TIPO_HARDLINK; mtar.TIPO_SYMLINK; mtar.TIPO_CAR; mtar.TIPO_BLOCO; mtar.TIPO_DIRETORIO; mtar.TIPO_FIFO; mtar.CONTIGUO; |
cab.nome = ‘nome do arquivo’
cab.nomelink = ‘nome do link’
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
3 – local ret, err = mtar.escreva_cabecalho_arquivo(tar,nome,tam);
Grava um cabeçalho específico de arquivo.
Parâmetros:
tar – objeto tar criado previamente.
nome – nome do arquivo a ser inserido. (ex.: ‘arq1.txt’);
tam – tamanho do arquivo a ser inserido; (use a função sis.tamanho para obter o tamanho);
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
4 – local ret, err = mtar.escreva_dado(tar,dado);
Escreve o dado binário no arquivo tar.
Parâmetros:
tar – objeto tar crido previamente.
dado – (string) dado a ser gravado, um arquivo lido em modo binário. Ou qualquer string.
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
5 – local ret, err = mtar.finalize(tar);
Finaliza o processo de gravação;
Parâmetros:
tar – objeto tar criado.
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
6 – local ret, err = mtar.fecha(tar);
Fecha o objeto tar e libera memória.
Parâmetros:
tar – objeto tar criado.
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
7 – local tab, err = mtar.leia_cabecalho(tar);
Finaliza o processo de gravação ou leitura.
Parâmetros:
tar – objeto tar criado.
Retornos:
tab – tabela com campos do cabeçalho ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
8 – local ret, err = mtar.proximo(tar);
Passa para o próximo cabeçalho. Num laço ‘para’ junto com a função leia_cabecalho(), é possível pegar o cabeçalho de cada arquivo.
Parâmetros:
tar – objeto tar criado.
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
9 – local dado, err = mtar.leia_dado(tar,nome);
Lê o dado binário inserido anteriormente.
Parâmetros:
tar – objeto tar criado.
nome – nome do arquivo inserido.
Retornos:
dado – string binária do arquivo inserido anteriormente.
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
10 – local tab, err = mtar.procure(tar,nome);
Procura por um arquivo ‘nome’ dentro do tar e retorna seu cabeçalho caso exista, ou nulo em erro.
Parâmetros:
tar – objeto tar criado.
nome – nome do arquivo inserido.
Retornos:
tab – tabela cabeçalho ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
11 – local ret, err = mtar.busque(tar,pos);
Busca uma nova posição.
Parâmetros:
tar – objeto tar criado.
pos – (número) posição nova a ser definida.
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
12 – local pos, err = mtar.anterior(tar);
Volta para o cabeçalho anterior.
Parâmetros:
tar – objeto tar criado.
Retornos:
pos – (número) posição ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
13 – local ret, err = mtar.escreva_cabecalho_dir(tar,nome);
Escreve um cabeçalho específico para diretório (pasta).
Parâmetros:
tar – objeto tar criado.
nome – nome do diretório (pasta).
Retornos:
ret – verdadeiro ou falso em caso de erro
err – (número) mensagem de erro. (use mtar.strerro(num_erro); para pegar a string de erro.
14 – local str_erro = mtar.strerro(NumErro);
As funções acima
Parâmetros:
NumErro : número de erro retornado por uma função microtar.
Retornos:
str_erro : string descrevendo número de erro, ou erro_desconhecido caso o número de erro não seja válido.
15 – str_versao = mtar.versao;
Variável predefinida contendo string que descreve a versão desta biblioteca.
A saída pode ser: lib pmicrotar-0.4 (simples lib tar)
16 – Variáveis predefinidas de erro:
mtar.SUCESSO = 0;
mtar.FALHA = -1;
mtar.FALHA_AO_ABRIR = -2;
mtar.FALHA_AO_LER = -3;
mtar.FALHA_AO_ESCREVER = -4;
mtar.FALHA_AO_BUSCAR = -5;
mtar.CHECKSUM_INVALIDO = -6;
mtar.CAMPO_NULO = -7;
mtar.NAO_ENCONTRADO = -8;
mtar.MODO_INVALIDO = -9;
mtar.MTAR_INVALIDO = -10;
mtar.CABECALHO_INVALIDO = -11;
16 – Variáveis predefinidas de tipos de arquivos:
mtar.TIPO_REGULAR; //REGULAR
mtar.TIPO_HARDLINK ; //HARD LINK
mtar.TIPO_SYMLINK; //SYMLINK
mtar.TIPO_CAR; //CHAR
mtar.TIPO_BLOCO; //BLOCK
mtar.TIPO_DIRETORIO; //DIRECTORY
mtar.TIPO_FIFO; //FIFO
mtar.CONTIGUO; //CONTIGUOUS
Visite o site oficial Prisma: http://linguagemprisma.br4.biz
e-mail: linguagemprisma@gmail.com
Para dúvidas, críticas ou sugestões: http://linguagemprisma.br4.biz/prisma_forum
FIM
fim!