Previous Up Next

5  Quatrième couche logicielle : manipulation de fichiers

Pour manipuler les fichiers, les utilisateurs du système disposent de différentes fonctions : création, destruction, ouverture, fermeture, lecture, écriture, positionnement, vidage du tampon d’écriture.

Dans un premier temps, notre système de fichiers identifie un fichier directement par son numéro d’inœud. Nous modifierons cette interface par la suite pour identifier les fichier par des noms.

Ces fonctions sont donc les suivantes (ifile pour inumber file) :

unsigned int create_ifile(enum file_type_e type); 
int delete_ifile(unsigned int inumber);

int open_ifile(file_desc_t *fd, unsigned int inumber);
void close_ifile(file_desc_t *fd);
void flush_ifile(file_desc_t *fd);
void seek_ifile(file_desc_t *fd, int r_offset);  /* relatif */
void seek2_ifile(file_desc_t *fd, int a_offset); /* absolu */

int readc_ifile(file_desc_t *fd);
int writec_ifile(file_desc_t *fd, char c);
int read_ifile(file_desc_t *fd, void *buf, unsigned int nbyte);
int write_ifile(file_desc_t *fd, const void *buf, unsigned int nbyte);

Exercice 18
 (Création et suppression d’un fichier)   Réalisez la fonction create_ifile() en allouant et renseignant un inœud dont le numéro sera retourné. Puis réalisez delete_ifile(), qui supprime un fichier en libérant tous les blocs qui peuvent être associés au fichier, y compris le bloc d’inœud.

Lorsque un fichier est manipulé par un programme, celui-ci utilise la fonction int open_ifile(file_desc_t *fd, unsigned inumber) qui « ouvre » un fichier en initialisant une structure de donnée file_desc_t. Cette structure de donnée, qui sert la manipulation d’un fichier, contient en fait toutes les informations nécessaires à la gestion d’un fichier. On y trouve notamment :


Exercice 19
 (Structure d’accès au fichier)   Décrivez la structure de données file_desc_t.

Exercice 20
 (Accès au fichier)   Proposez d’abord le code pour la fonction open_ifile() qui initialise un descripteur de fichier en « ouvrant » le fichier désigné. La fonction open_sfile() retourne un statut.

Puis implantez la fonction flush_ifile() qui vide le tampon courant sur le disque (si le drapeau indique que le tampon et modifié). Et enfin proposez le programme qui termine l’utilisation d’un fichier : close_ifile(file_desc_t *fd).


Exercice 21
 (Se déplacer dans un fichier)   Les deux fonctions seek_ifile() et seek2_ifile() déplacent le curseur d’accès dans le fichier ouvert. Ces fonctions doivent mettre à jour le tampon afin que les données du tampon mémoire soient cohérentes avec le curseur dans le fichier. Bien entendu, un déplacement relatif peut être implanté à partir d’un déplacement absolu, ou (exclusif !) l’inverse.

Exercice 22
 (Lire et écrire un octet)   Finalement réalisez les fonctions d’accès : int readc_ifile() et writec_ifile() qui permettent de lire ou d’écrire un octet dans un fichier. Une fois l’accès réalisé, le descripteur de fichier se place « automatiquement » sur l’octet suivant.

Si la fin de fichier est atteinte l’acte de lecture retourne une valeur négative (READ_EOF) et la position dans le fichier n’est pas modifiée.

En cas d’écriture au delà de la fin, le fichier est automatiquement « étendu » en conséquence. Notez encore qu’un accès en lecture sur un bloc qui n’est défini retourne zéro. Un accès en écriture sur le même octet implique l’allocation d’un nouveau bloc, initialisé à zéro avec seulement l’octet écrit de modifié.


Exercice 23
 (Lecture et écriture dans un fichier)   À l’aide des fonctions précédentes, écrivez les fonctions :
int read_ifile(file_desc_t *fd, void *buf, unsigned int nbyte);
int write_ifile(file_desc_t *fd, const void *buf, unsigned int nbyte);
qui, respectivement, lit nbyte octets depuis le fichier fd en les stockant en mémoire centrale dans le tableau de caractère buf, et écrit nbyte octets lus depuis le tableau de caractère buf en mémoire centrale vers le fichier f.

Validation de la bibliothèque de manipulation d’un fichier par son inombre

Pour valider votre travail, vous pouvez écrire des versions des commandes de l’exercice 27 qui identifie les fichiers paramètres par leur inombre ; la création d’un fichier retournant le inombre associée au fichier :

if_status
liste les informations associées à la partition courante.
if_pfile
(print file) affiche sur la sortie standard le contenu d’un fichier dont le inombre est passée en paramètre.
if_nfile
(new file) crée un fichier. Le contenu du fichier est lu sur l’entrée standard. Le inombre du fichier est retournée sur la sortie standard ; il servira à identifier le fichier lors de futures commandes.
if_dfile
(delete file) supprime le fichier dont le inombre est passé en paramètre.
if_cfile
(copy file) copie le contenu du fichier dont le inombre est donné en paramètre dans le second fichier. Ce second fichier est donc créé ; son inombre est affiché sur la sortie standard.


Previous Up Next