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