Programarea calculatoarelor 2 - Laborator 9

Implementaţi o versiune simplificată a programului UNIX tar care arhivează şi dezarhivează fişiere.

Într-o arhivă tar (numele provine de la "tape archive"), fiecare fişier e precedat de un antet de 512 octeţi (un sector), şi rotunjit în sus la un număr întreg de sectoare, ultimul sector fiind completat cu octeţi nuli. Arhiva se termină cu două sectoare nule.

Programul va fi rulat cu comanda
tar comandă fişier1 fişier2 ... fişierN
Primul caracter al comenzii va fi unul din:
c : crează arhivă
t : tipăreşte conţinutul arhivei (numele fişierelor şi dimensiunile acestora)
Programul citeşte / scrie arhiva (de) la intrarea / ieşirea standard. Numele de fişiere sunt cele ale fişierelor care trebuie arhivate. Comanda t nu necesită nume de fişiere.

Antetul memorat în arhivă pentru fiecare fişier conţine numele fişierului la octetul 0, pe o lungime de max. 100 octeţi, inclusiv terminatorul nul (fişiere cu nume mai lungi nu pot fi arhivate). La deplasamentul 124, pe o lungime de 12 octeţi, se găseşte lungimea fişierului, ca şir de cifre octale, completat la stânga cu cifre 0 şi terminat cu caracterul nul. (Formatul complet e descris în fişierul /usr/include/tar.h).

Pentru început, implementaţi comanda t. Citiţi arhiva secvenţial (de exemplu câte un sector), şi extrageţi numele şi lungimea fişierelor (fără rotunjire la sectoare întregi). Puteţi verifica programul pe o arhivă reală creată cu programul UNIX tar folosind aceeaşi sintaxă. Implementaţi apoi comanda c. Pentru a afla de la început care e dimensiunea fiecărui fişier de arhivat, puteţi folosi funcţia fseek cu ultimii doi parametri 0 şi respectiv SEEK_END şi apoi funcţia ftell odată ce fişierul a fost deschis (după care va trebui să repoziţionaţi indicatorul la început de fişier).
Toate fişierele vor fi deschise în mod binar. Vă veţi putea verifica implementarea lui c doar cu propria implementare a lui t şi nu cu programul UNIX tar deoarece varianta simplificată propusă aici nu completează toate câmpurile din antet.


Marius Minea
Last modified: Sun Dec 7 12:23:50 EET 2003