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);
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 :
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).
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é.
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.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);
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.