Ferramentas do usuário

Ferramentas do site


prog2:arquivador_vina

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Última revisão Ambos lados da revisão seguinte
prog2:arquivador_vina [2019/06/10 16:43]
maziero [Produto a ser Entregue]
prog2:arquivador_vina [2019/06/10 16:55]
maziero
Linha 1: Linha 1:
 +====== O Arquivador VINA ======
 +
 +(contribuição do prof. [[https://​web.inf.ufpr.br/​danielw/​|Daniel Weingaertner]])
 +
 +{{ :​prog2:​alemao.jpg?​300 |O prof. Daniel Weingaertner}}
 +
 +O objetivo deste trabalho é implementar o programa ''​vina''​(([[https://​pt.wiktionary.org/​wiki/​vina]])),​ que consiste de um arquivador básico (//​archiver//​),​ isto é, um programa que salva em sequência uma coleção de arquivos (denominados membros) dentro de outro arquivo (denominado ​ //​archive//​) cuja estrutura permite recuperar os arquivos originais individualmente.
 +
 +Os programas ''​tar'',​ ''​zip'',​ ''​rar''​ e ''​arj''​ são arquivadores populares. Além de arquivar arquivos, a maioria deles também comprime os dados dos mesmos, para ocupar menos espaço de armazenamento. Para simplificar,​ o arquivador VINA não comprime os arquivos, apenas os armazena.
 +
 +===== Execução do Programa =====
 +
 +O pacote de software a ser construído deve gerar o executável chamado ''​vina'',​ que deve ser executado da seguinte forma:
 +
 +<​code>​
 +vina <​opção>​ <​archive>​ [membro1 membro2 ...]
 +</​code>​
 +
 +Onde a opção pode ser:
 +
 +  * ''​-i''​ : insere/​acrescenta um ou mais membros ao //​archive//​. Caso o membro já exista no //​archive//,​ ele deve ser substituído. Novos membros são inseridos respeitando a ordem da linha de comando, ao final do //​archive//;​
 +  * ''​-a''​ : mesmo comportamento da opção ''​-i'',​ mas a substituição de um membro existente ocorre APENAS caso o parâmetro seja **mais recente** que o arquivado;
 +  * ''​-m target''​ : move o membro indicado na linha de comando para imediatamente depois do membro //target// existente em //​archive//​. A movimentação deve ocorrer na seção de dados do //​archive//;​
 +  * ''​-x''​ : extrai os membros indicados de //​archive//​. Se os membros não forem indicados, **todos** devem ser extraídos. A extração consiste em ler o membro de //archive// e criar um arquivo correspondente,​ com conteúdo idêntico, em disco;
 +  * ''​-r''​ : remove os membros indicados de //​archive//;​
 +  * ''​-c''​ : lista o conteúdo de //archive// em ordem, incluindo as propriedades de cada membro (nome, UID, permissões,​ tamanho e data de modificação) e sua ordem no arquivo.
 +  * ''​-h''​ : imprime uma pequena mensagem de ajuda com as opções disponíveis e encerra.
 +
 +Exemplos de comandos:
 +
 +<​code>​
 +// inclui os arquivos "​arq.txt",​ "​foto.jpg"​ e "​despesas.ods"​ em backup.vr ​
 +vina -i backup.vr arq.txt foto.jpg despesas.ods
 +
 +// atualiza "​despesas.ods"​ em backup.vr, se o arquivo externo for mais recente
 +vina -a backup.vr despesas.ods
 +
 +// extrai o arquivo arq.txt de backup.vr
 +vina -x backup.vr arq.txt
 +
 +// extrai todos os arquivos de backup.vr
 +vina -x backup.vr
 +
 +// move o arquivo "​arq.txt"​ para depois de "​despesas.ods"​ em backup.vr
 +vina -m despesas.ods backup.vr arq.txt
 +</​code>​
 +
 +===== Formato do Arquivo =====
 +
 +Cada equipe é livre para inventar seu próprio formato para o //​archive//,​ desde que respeitando as seguintes restrições:​
 +
 +  * O início ou final do //archive// (''​.vr''​) deve ter uma área de diretório, como mostra a figura:
 +
 +{{ :​prog2:​vina-format.png?​600 |Formato do arquivo vina}}
 +
 +  * Todas as informações sobre os membros, necessárias para a manipulação do //​archive//,​ devem estar armazenadas única e exclusivamente na área de diretório (que pode estar no início ou no final do arquivo). A parte restante deve conter **apenas** os dados dos membros.
 +  * Para cada membro, devem ser armazenadas as seguintes informações:​ nome (sem espaços), UID (//user ID//), permissões,​ tamanho, data de modificação,​ ordem no arquivo e localização.
 +  * A ordem de um membro no arquivo é dada pela ordem de inserção, e pode ser alterada pela opção ''​-m''​.
 +  * O conteúdo da área de diretório pode ser manipulado em memória RAM ou em disco, a critério da equipe.
 +  * O conteúdo dos membros do //archive// **deve ser manipulado diretamente em disco**, não sendo permitida a alocação de mais de 1.024 bytes de memória para manipulação dos conteúdos dos membros.
 +
 +<note tip>
 +Uma abordagem interessante consiste em colocar a área de diretório no **final** do arquivo, mantendo no início do arquivo apenas um inteiro indicando a posição do arquivo onde inicia essa área. Essa organização torna mais simples as operações de alteração do conteúdo do arquivo.
 +</​note>​
 +
 +<note warning>
 +As operações de leitura e escrita nos arquivos devem **sempre** ser feitas em formato **binário**,​ ou seja, usando as funções ''​fread()''​ e ''​fwrite()''​.
 +
 +Se estiver usando as funções ''​fprintf()'',​ ''​fscanf()'',​ ''​fputc()'',​ ''​fgetc()''​ e similares, **provavelmente está fazendo errado**!
 +
 +</​note>​
 +===== Erros =====
 +
 +Em caso de erros, uma mensagem explicando o ocorrido deve ser impressa em ''​stderr''​ e a execução do programa deve ser encerrada com código de saída **diferente de 0**. Caso o programa possa recuperar-se automaticamente do erro, deve fazê-lo.
 +
 +===== Produto a ser Entregue =====
 +
 +Deve-se entregar um pacote de software completo contendo os fontes em linguagem C. O pacote deve ser arquivado e compactado com ''​tar''​ e ''​gzip''​ em um arquivo chamado ''​login.tar.gz''​ (substitua ''​login''​ por seu login/​identificador na rede do departamento).
 +
 +O pacote deve ter a seguinte estrutura de diretório e arquivos:
 +
 +  login/ ​          ​diretório principal
 +       /​src/​... ​   diretório dos arquivos fonte (*.c, *.h)
 +       /​doc/​... ​   diretório da documentação Doxygen
 +       /​LEIAME ​    ​arquivo
 +       ​Makefile ​   arquivo
 +
 +Note que a extração dos arquivos de ''​login.tar.gz''​ deve criar o diretório ''​login/''​ contendo todos os arquivos e diretórios acima. Os arquivos fonte também devem estar contidos no sub-diretório ''​src''​.
 +
 +O arquivo de texto ''​LEIAME''​ deve conter as seguintes informações:​
 +
 +  * autoria do software (GRR e nome(s) do(s) autor(es));
 +  * lista dos arquivos e diretórios contidos no pacote e sua descrição (breve);
 +  * uma seção descrevendo os algoritmos e as estruturas de dados utilizadas, as alternativas de implementação consideradas e/ou experimentadas e os motivos que o levaram a optar pela versão entregue, as dificuldades encontradas e as maneiras pelas quais foram contornadas.
 +  * bugs conhecidos;
 +
 +O arquivo ''​Makefile''​ deve possuir as regras necessárias para compilar os módulos individualmente e gerar o programa executável. As seguintes regras devem estar presentes:
 +
 +  * ''​all'':​ compila e produz um executável chamado vina no diretório ''​login/'';​
 +  * ''​clean'':​ remove todos os arquivos temporários e os arquivos gerados pelo Makefile (*.o, executável,​ etc.).
 +  * ''​doc'':​ gera a documentação em HTML utilizando o programa [[http://​www.doxygen.nl|doxygen]];​
 +
 +O diretório ''​./​login/​doc''​ deve conter um arquivo de configuração para a documentação automática,​ que deve ser gerada a partir dos comentários no código fonte, utilizando o programa ''​doxygen''​. A documentação (arquivos gerados pelo ''​doxygen''​) também deve ficar neste diretório.
 +
 +===== Avaliação =====
 +
 +Os itens de avaliação do trabalho e respectivas pontuações são:
 +
 +  * Qualidade da documentação:​ arquivo ''​LEIAME''​ e documentação HTML gerada pelo Doxygen (15 pontos)
 +  * Funcionamento:​ corretude das respostas nos testes executados (55 pontos)
 +  * Eficiência:​ algoritmos e estruturas de dados utilizados para obter um melhor desempenho, desde que devidamente justificados no arquivo ''​LEIAME''​ (30 pontos)
  
prog2/arquivador_vina.txt · Última modificação: 2020/03/02 16:22 por maziero