ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ ΕΡΓΑΣΤΗΡΙΟ ΑΣΚΗΣΗ: ΔΙΑΧΕΙΡΙΣΗ ΚΑΤΑΛΟΓΟΥ ΑΡΧΕΙΩΝ ΕΝΟΣ DIRECTORY Περιγραφή: Μέρος Α` Για τη διαχείριση του συστήματος αρχείων (file system) ένα λειτουργικό σύστημα χρησιμοποιεί τη δενδροειδή οργάνωση των αρχείων directories και subdirectories του συστήματος UNIX, που είναι αντίστοιχο της οργάνωσης των folders και subfolders που χρησιμοποιούν τα Windows. Σύμφωνα με την οργάνωση αυτή σε κάθε directory το σύστημα διατηρεί πάντα ενημερωμένο ένα κατάλογο των αρχείων και των directories (subdirectories) που υπάρχουν στο directory. Ο κατάλογος αυτός περιέχει για κάθε αρχείο ή directory (subdirectory) όλες τις πληροφορίες που είναι χρήσιμες για τη διαχείριση του. Ο κατάλογος αυτός στην περίπτωση που το directory είναι άδειο περιέχει τις περιγραφές για δύο τουλάχιστον στοιχεία, ένα για την περιγραφή του τρέχοντος directory και ένα για την περιγραφή του ιεραρχικά ανώτερου (parent) directory. Για κάθε αρχείο, οποιουδήποτε τύπου, ή directory ο κατάλογος περιέχει μια δομή με τις εξής πληροφορίες: τύπος, δηλαδή αρχείο ή directory δικαιώματα πρόσβασης, (read, write, execute) για τον ιδιοκτήτη δικαιώματα πρόσβασης, (read, write, execute) για τους άλλους χρήστες όνομα αρχείου ή directory μέγεθος, σε πλήθος bytes για τα κοινά αρχεία και πλήθος αρχείων που περιέχει αν πρόκειται για directory ταυτότητα, του χρήστη που το δημιούργησε ημερομηνία δημιουργίας ημερομηνία τελευταίας πρόσβασης πρώτο block του δίσκου στο οποίο υπάρχει το περιεχόμενο του αρχείου ή ο αντίστοιχος κατάλογος αν πρόκειται για directory Το ζητούμενο της άσκησης αυτής είναι η διαχείριση του καταλόγου όταν το λειτουργικό σύστημα τον φορτώνει στη μνήμη για να προβάλλει το περιεχόμενο ενός directory στον χρήστη. Δεδομένα Αρχικά θεωρούμε ότι ο κατάλογος υπάρχει έτοιμος με τη μορφή ενός σειριακού αρχείου. Δεν ενδιαφερόμαστε στην άσκηση αυτή ούτε για τη δημιουργία του ούτε για την ενημέρωσή του σε περίπτωση δημιουργίας ενός νέου αρχείου (ή directory) ή τη διαγραφή ενός υπάρχοντος αρχείου (ή directory). 1
Κάθε directory θεωρητικά περιέχει απεριόριστο αριθμό αρχείων και directories (subdirectories). Στα πλαίσια της άσκησης αυτής θα περιορίσουμε τον αριθμό σε Maxfiles. Κατά συνέπεια και ο κατάλογος θα περιέχει Maxfiles εγγραφές. Οι τύποι δεδομένων που θα χρησιμοποιηθούν είναι: Για τη γλώσσα Pascal: const (* Ορισμός σταθερών για τα δικαιώματα πρόσβασης *) RO = 4; (* read_only *) WO = 2; (* write_only *) EO = 1; (* execute_only *) RW = 6; (* read_write *) RE = 5; (* read_execute *) WE = 3; (* write_execute *) RWE = 7; (* read_write_execute *) Maxfiles = ; type (* τύποι δεδομένων *) day_t = 1..31; (* τύπος διάστημα από 1 έως 31 *) month_t = 1..12; (* τύπος διάστημα από 1 έως 12 *) date_t = record day : day_t; mon : month_t; year : integer; end; block_t = integer; filerec = record ftype : char; (* `a` για κοινό αρχείο, `d` για directory *) usersr : integer; (* περιγραφή σταθερών ανωτέρω *) othersr : integer; (* περιγραφή σταθερών ανωτέρω *) fname : string[64]; fsize : real; (* χρήση real για μεγάλα μεγέθη *) ucid : string[16]; (* π.χ. `nikosp` *) cdate : date_t; (* περιγραφή τύπου date_t ανωτέρω *) adate : date_t; (* περιγραφή τύπου date_t ανωτέρω *) block : block_t; pblock : block_t; end; (* ο τύπος του αρχείου που περιέχει τον κατάλογο ως αρχείο *) catalog_t = file of filerec; 2
Για τη γλώσσα C: // Ορισμός σταθερών για τα δικαιώματα πρόσβασης #define RO 4 // read_only #define WO 2 // write_only #define EO 1 // execute_only #define RW 6 // read_write #define RE 5 // read_execute #define WE 3 // write_execute #define RWE 7 // read_write_execute #define Maxfiles // τύποι δεδομένων typedef int day_t; // τύπος διάστημα από 1 έως 31 typedef int month_t; // τύπος διάστημα από 1 έως 12 typedef struct { day_t day; month_t mon; int year; } date_t; typedef int block_t; typedef struct { char ftype; // `a` για κοινό αρχείο, `d` για directory int usersr; // περιγραφή σταθερών ανωτέρω int othersr; // περιγραφή σταθερών ανωτέρω char fname[64]; double fsize; // χρήση real για μεγάλα μεγέθη char ucid [16]; // π.χ. `nikosp` date_t cdate; // περιγραφή τύπου date_t ανωτέρω date_t adate; // περιγραφή τύπου date_t ανωτέρω block_t block; } filerec; Παρατηρήσεις: 1) Για το πεδίο block η χρήση του τύπου block_t ως integer είναι προσωρινή καθώς στο Μέρος Β` της άσκησης θα αλλάξει. 2) Τα πεδία του record filerec αντιστοιχούν ένα προς ένα στις περιγραφές που δίνονται στη σελίδα 1. 3) Η τιμή 0 στο πεδίο usersr ή στο πεδίο othersr σημαίνει κανένα δικαίωμα πρόσβασης. 4) Στη συνέχεια δίνεται ένα παράδειγμα ανάθεσης τιμών στα πεδία μιας μεταβλητής τύπου filerec. 3
var fr : filerec; begin fr.ftype := a ; fr.usersr := 6; fr.othersr := 4; fr.fname := `lala.dat`; fr.fsize := 15000; fr.ucid := user120 ; fr.cdate.day := 2; fr.cdate.mon := 12; fr.cdate.year := 2008; fr.adate := f.cdate; fr.block := 1200; Ζητούμενα Θα πρέπει να γραφεί ένα πρόγραμμα το οποίο θα εκτελεί τα ακόλουθα: Θα διαβάζει το σειριακό αρχείο που αντιστοιχεί σε ένα κατάλογο και θα το φορτώνει στη μνήμη σε ένα μονοδιάστατο πίνακα. Ο πίνακας θα πρέπει να ταξινομείται σε αύξουσα (ή φθίνουσα τάξη) ως προς τα ακόλουθα κριτήρια: o τύπος αρχείου (ftype) o όνομα αρχείου (fname) o μέγεθος (fsize) o ημερομηνία δημιουργίας (cdate) Μετά την ταξινόμηση η σειρά των στοιχείων του πίνακα που περιέχει τον κατάλογο δε θα αλλάζει αλλά για κάθε κριτήριο θα χρησιμοποιείται ένας βοηθητικός πίνακας. Έτσι αν ο πίνακας που περιέχει τον κατάλογο έχει Ν (N Maxfiles) στοιχεία τότε ο βοηθητικός αυτός πίνακας στη θέση i 1..N θα περιέχει τη θέση στον πίνακα (καταλόγου) του στοιχείου που βρίσκεται στην i θέση αν ο πίνακας καταλόγου ήταν πραγματικά ταξινομημένος με βάση το συγκεκριμένο κριτήριο ταξινόμησης. Το πρόγραμμα μέσω ενός μενού θα δίνει στο χρήστη τη δυνατότητα να επιλέξει ως προς ποιο κριτήριο ταξινόμησης θέλει να προβάλλει τον κατάλογο ή ακόμη η προβολή να γίνει χωρίς ταξινόμηση. Κατά την προβολή των στοιχείων του καταλόγου συνολικά δεν θα πρέπει να εμφανίζονται όλες οι πληροφορίες του αρχείου. Έχετε τη δυνατότητα να επιλέξετε τις πληροφορίες που θα προβάλλει το πρόγραμμα για κάθε αρχείο με βάση την εμπειρία σας. Σε κάθε περίπτωση ο χρήστης θα έχει τη δυνατότητα να προβάλλει όλες τις πληροφορίες για ένα αρχείο που επιλέγει ξεχωριστά από τα άλλα. Το πρόγραμμα μπορεί να γραφεί σε γλώσσα Pascal ή C. 4
Σημαντικές απαιτήσεις Το πρόγραμμα θα κάνει χρήση διαδικασιών και συναρτήσεων με παραμέτρους και θα χρησιμοποιεί το λιγότερο δυνατόν ολικές μεταβλητές. Το πρόγραμμα θα πρέπει να περιέχει σχόλια ώστε να είναι κατανοητή η λειτουργία των διαδικασιών και των συναρτήσεων καθώς και η χρήση των μεταβλητών. Όποια εργασία δεν καλύπτει τις προηγούμενες απαιτήσεις δεν θα γίνεται δεκτή. 5