Programarea calculatoarelor 2 - Laborator 10

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ă
x : extrage din arhivă
Opțional, comanda poate să aibă ca al doilea caracter litera f. În acest caz, primul argument fișier care urmează e numele arhivei; dacă litera f lipsește, programul citește/scrie arhiva (de) la intrarea /ieșirea standard. Celelalte nume de fișiere sunt cele care trebuie arhivate/dezarhivate. Pentru comanda x, dacă nu se dau nume de fișiere se dezarhivează toate fișierele din arhivă.

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

Implementați în primul rând comanda x cu extragerea tuturor fișierelor. Citiți arhiva secvențial (de exemplu câte un sector), și extrageți fișierele cu lungimea specificată în arhivă (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 odată ce fișierul a fost deschis (după care va trebui să repoziționați indicatorul la început de fișier). În final, implementați comanda x cu extragerea selectivă doar a acelor fișiere care sunt specificate în linia de comandă. Pentru aceasta, citiți arhiva secvențial și "săriți" peste fișierul curent daca acesta nu trebuie extras.
Toate fișierele vor fi deschise în mod binar. Vă veți putea verifica implementarea lui c doar cu propria implementare a lui x ș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