Remarque préliminaire : Cette partie présente quelques
unes des interruptions du DOS qui servent à manier les
fichiers d'un disque. Nous la concluerons par l'étude d'un
exemple de programme qui crypte un fichier choisi par l'utilisateur.
I. LECTURE ET ECRITURE DE FICHIERS AVEC LES HANDLES
Sous DOS, il existe deux méthodes pour accéder aux fichiers
et pour chacune d'elles un lot d'interruptions spécifiques. La
première est la méthode des FCB (« File
contol block »). Elle est rarement utilisée,
aussi ne l'aborderons nous pas. Nous étudierons le principe de
la méthode des « handles ».
Pour lire ou écrire des données dans un fichier, il est
nécessaire de l'ouvrir,
c'est-à-dire de le charger en mémoire. Quand toutes les
opérations de lecture et d'écriture auront été
effectuées, le fichier devra être refermé
afin d'enregistrer les éventuelles dernières modifications et surtout de
libérer la mémoire occupée.
1. Ouverture d'un fichier
On ouvre un fichier en appelant la fonction 3dh de l'interruption 21h.
Celle-ci attend comme paramètre dans DS:DX l'adresse d'une
chaîne de caractères qui contient le chemin d'accès
au fichier sur un disque, par exemple
“C:\MonDoss\MonFic.txt”.
Remarque :
il n'est pas indispensable de mentionner le chemin d'accès
complet : par défaut, le fichier sera cherché à
partir du dossier courant.
Remarque
importante : La chaîne doit être impérativement
suivie de l'octet 00h qui sert à marquer sa fin.
Il nous faut également spécifier le mode
d'accès en écrivant dans AL un 0 (si on
veut ouvrir le fichier en lecture seule), un 1 (si on veut
l'ouvrir en écriture seule) ou un 2 (lecture ET
écriture).
Si l'interruption échoue, le flag CF sera mis à 1 sans que le
fichier soit ouvert. Dans le cas contraire, CF est mis 0 et le registre AX contient un petit
nombre entier (par exemple 5) appelé « handle »
(ce qui signifie « poignée ») du
fichier. Ce handle représente le
fichier. C'est lui qu'il faudra désormais invoquer pour
effectuer des opérations de lecture ou d'écriture, et
non pas le chemin d'accès.
En effet, les chemins d'accès ne sont donc plus d'aucune utilité
puisque les fichiers sont ouverts dans la mémoire vive.
2. Lecture dans un fichier
Une fois le fichier ouvert, on peut le lire avec la fonction 3fh. Il
suffit de mentionner le handle dans BX, le nombre d'octets à
lire dans CX, et l'adresse d'un buffer dans DS:DX.
Au cas où vous ne sauriez pas ce qu'est un buffer (ou tampon),
sachez que c'est simplement une variable (généralement
une chaîne de caractères) destinée à
recevoir des données (ou
à en fournir). Dans notre cas, le buffer va recevoir les octets lus
dans le fichier.
Après l'appel, AX contient le nombre d'octets qui ont été
effectivement lus (il peut être inférieur à la
taille demandée si le fichier n'est pas assez long). En cas de
problème, CF sera mis à 1.
3. Ecriture dans un fichier
Pour écrire des données, on procède de même
avec la fonction 40h. Les paramètres sont les mêmes que
pour la fonction 3fh. Le buffer contient cette fois les octets
à écrire. Après l'appel, le nombre
d'octets qui ont été effectivement écrits est
stocké dans AX (il sera être inférieur à
la taille spécifiée si le disque est plein).
Les données sont écrites sur le disque dès que le tampon (dans la mémoire vive)
est plein.
4. Existence d'un pointeur de fichier
Une question se pose cependant : à quel endroit du fichier les
données sont-elles lues (ou écrites) ?
Réponse :
quand un fichier est ouvert, un pointeur spécial pointant vers
le début du fichier est créé. La première
opération de lecture (ou d'écriture) se fera donc au
début du fichier.
Mais entre chaque opération, le pointeur est incrémenté
de la taille des données que l'on a lues (ou écrites).
La deuxième opération se fera donc sur les octets qui suivent
ceux de la première.
Remarque : Il est possible de
modifier directement le pointeur de fichier : voyez pour cela la
fonction 42h...
5. Fermeture d'un fichier
Pour terminer, le fichier doit être refermé. Les
modifications éventuellement apportées et non enregistrées seront
écrites sur le disque, et le handle sera libéré. C'est
la fonction 3eh qui se charge de tout cela. Elle attend simplement le
handle du fichier dans BX. Et comme d'habitude, CF vaut 1 après
l'appel si des erreurs ont été rencontées.
Remarque : Attention lorsque vous laissez le fichier ouvert longtemps afin d'y ajouter
progressivement des données ! Si le système plante, vous perdrez les données qui se trouvent
dans le tampon à ce moment. C'est pourquoi il est conseillé de forcer
régulièrement l'écriture sur le disque en refermant le fichier.
6. Conclusion
Le tableau suivant récapitule ces différentes étapes :
Fonction
|
Description
|
Paramètres
|
3dh
|
Ouvrir le fichier
|
- DS:DX : adresse d'une chaîne contenant le chemin d'accès
- AL : mode d'accès
|
3eh
|
Fermer le fichier
|
- BX : handle
|
3fh
|
Lire le fichier
|
- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer
|
40h
|
Ecrire dans le fichier
|
- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer
|
Sommaire
Suite
|