Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Amiga C Manual - AmigaDOS
(Article écrit par Anders Bjerin et extrait d'Amiga C Manual - mars 1990)
|
|
Note : traduction par Serge Hammouche.
11. AmigaDOS
11.1 Introduction
Dans ce chapitre, nous allons voir comment accéder, en lecture et en
écriture, à des fichiers se trouvant sur différents périphériques (disques,
etc.), comment empêcher que vos données soient modifiées par d'autres
tâches travaillant sur le même fichier, comment associer un commentaire à
un fichier, comment les renommer, etc.
Cependant, avant de commencer, il est préférable de voir comment AmigaDOS
fonctionne et d'expliquer quelques termes couramment utilisés. Si vous
connaissez déjà AmigaDOS et le CLI, vous pouvez passer les parties
suivantes, et commencer tout de suite au chapitre 11.2 (Ouvrir et fermer des
fichiers).
11.1.1 Périphériques physiques
Les périphériques physiques sont des organes de l'Amiga à partir desquels
des fichiers peuvent être lus ou écrits. Le périphérique physique le plus
couramment utilisé est sans aucun doute le lecteur de disquette interne
(DF0:).
Voici la liste des périphériques standards pour AmigaDOS :
- DF0: - lecteur de disquette 0 - accès aux fichiers et aux répertoires.
- DF1: - lecteur de disquette 1 - accès aux fichiers et aux répertoires.
- DF2: - lecteur de disquette 2 - accès aux fichiers et aux répertoires.
- DF3: - lecteur de disquette 3 - accès aux fichiers et aux répertoires.
- RAM: - disque virtuel en mémoire - accès aux fichiers et aux répertoires.
- SER: - port série - entrées/sorties.
- PAR: - port parallèle - entrées/sorties.
- PRT: - pilote d'imprimante- sortie vers l'imprimante (utilise les préférences).
- CON: - console (fenêtre) - entrées/sorties.
- RAW: - RAW (fenêtre) - entrées/sorties.
- NIL: - "rien" - sortie vers rien.
Notez que tous les noms de périphérique finissent par deux-points ":".
Si vous voulez copier un fichier de nom "program.c", depuis le lecteur de
disquette interne (DF0:) vers le second lecteur de disquette (DF1:), vous
devrez taper la commande :
copy from DF0:program.c to DF1:
|
Si vous voulez copier un fichier de nom "program.c", depuis le lecteur de
disquette interne (DF0:) vers le port parallèle (PAR:), vous devrez taper
la commande :
copy from DF0:program.c to PAR:
|
Si votre imprimante est connectée au port parallèle, le fichier "program.c"
sera imprimé avec les paramètres d'impression par défaut de l'imprimante.
Si votre imprimante est connectée au port série (SER:), vous devrez taper
la commande :
copy from DF0:program.c to SER:
|
Cependant, si vous voulez envoyer un fichier vers l'imprimante, et que vous
voulez utiliser les paramètres d'impressions indiqués dans les préférences,
il vous faudra utiliser le pilote d'imprimante (PRT:, avec les préférences
vous pouvez dire quel port utiliser - PAR: ou SER: -, si vous voulez que le
texte soit imprimé en qualité courrier ou en qualité listing, etc.) :
copy from DF0:program.c to PRT:
|
AmigaDOS vous permet même d'utiliser des fenêtres spéciales (CON:) pour vos
entrées/sorties. La seule chose que vous devez faire est de dire à AmigaDOS
la taille et la position de la fenêtre. La syntaxe est :
CON:x/y/largeur/hauteur/titre
|
Pensez à mettre les quatre barres de fraction ! Le titre est facultatif.
Pour copier le fichier "program.c" dans une fenêtre spéciale, vous devrez
taper la commande :
copy from DF0:program.c to CON:10/20/320/100/Texte
|
Ceci affichera le fichier "program.c" dans une fenêtre dont le coin
supérieur gauche sera en x=10 et en y=20, d'une largeur égale à 320 et
d'une hauteur égale à 100. Si vous voulez mettre des espaces dans le titre
de la fenêtre, vous devrez mettre toute l'expression entre guillemets :
copy from DF0:program.c to "CON:10/20/320/100/Titre avec espaces"
|
11.1.2 Volumes
Pour accéder à une disquette, vous pouvez soit utiliser le nom du
périphérique physique dans lequel se trouve cette disquette, soit utiliser
le nom de la disquette. Si vous voulez copier le fichier "program.c" depuis
le disque virtuel en mémoire vers une disquette nommée "DOCUMENTS", et que
cette disquette se trouve dans le second lecteur de disquette, vous pouvez
taper soit :
copy from RAM:program.c to DF1:
|
Soit :
copy from RAM:program.c to DOCUMENTS:
|
Notez les deux points après le nom du volume ! L'avantage de la deuxième
forme est que vous n'avez pas besoin de savoir dans quel lecteur se trouve
la disquette "DOCUMENTS". De plus, si cette disquette ne se trouve dans aucun
lecteur, AmigaDOS vous demandera de l'insérer, et vous ne risquerez donc
pas d'écrire sur une autre disquette.
11.1.3 Répertoires/sous-répertoires/fichiers
Sur une disquette peuvent se trouver des répertoires, des sous-répertoires
et des fichiers. Un sous-répertoire est un répertoire contenu dans un autre
répertoire (il peut y avoir des sous-répertoires dans un sous-répertoire).
Voici un schéma explicatif :
Périphérique/volume
|
/---------------------+---------------------\
| | |
Fichiers Répertoire Répertoire
| |
Fichiers Sous-répertoires
|
fichiers
|
Voici comment accéder aux fichiers :
- A gauche des ":" : nom de périphérique ou nom de volume.
- A droite des ":" : nom de répertoire ou nom de fichier.
- A droite d'un "/" : nom de sous-répertoire ou nom de fichier.
Prenons un exemple. Voici une disquette nommée "ProgrammesC" sur laquelle
se trouvent un fichier "Exemple" et deux répertoires, "Jeux" et
"Utilitaires". Dans le répertoire "Utilitaires", il y a un fichier dont le
nom est "Fenêtre". Dans le répertoire "Jeux" se trouvent deux jeux,
"Voitures" et "PacMan", ainsi qu'un sous-répertoire "CodeSource" qui
contient les fichiers "Voitures.c" et "PacMan.c".
Voici un schéma du contenu de cette disquette :
ProgrammesC
|
/----------------------+--------------------------\
| | |
Exemple Jeux Utilitaires
| |
/-------------+-------------\ Fenêtre
| | |
Voitures PacMan CodeSource
|
/-------------\
| |
Voitures.c PacMan.c
|
Voici comment accéder à chaque fichier :
- Exemple : ProgrammesC:Exemple
- Fenetre : ProgrammesC:Utilitaires/Fenetre
- Voitures : ProgrammesC:Jeux/Voitures
- PacMan : ProgrammesC:Jeux/PacMan
- Voitures.c : ProgrammesC:Jeux/CodeSource/Voitures.c
- PacMan.c : ProgrammesC:Jeux/CodeSource/PacMan.c
11.1.4 Périphériques logiques
Les périphériques logiques offrent un moyen simple d'accéder à des fichiers
sans se préoccuper de leur emplacement physique. Par exemple, si vous avez
placés tous vos programmes sur une disquette nommée "Programmes", dans un
répertoire "Exemples" et que vous voulez exécuter le programme "test1",
vous devez écrire :
Programmes:Exemples/test1
|
Si vous utilisez souvent des fichiers placés dans ce répertoire, vous
pouvez en faire un périphérique logique. Vous n'aurez alors ensuite qu'à
donner le nom de ce périphérique logique et le nom du fichier, et AmigaDOS
cherchera automatiquement dans le bon répertoire sur la bonne disquette.
Pour créer un périphérique logique, il faut utiliser la commande "Assign"
du CLI, de la manière suivante :
Assign <Nom du périphérique>: <périphérique/répertoire/sous-répertoire>
|
Par exemple :
Assign EX: Programmes:Exemples
|
Pour accéder au fichier "test1", vous n'avez qu'à taper :
Quand vous démarrez votre Amiga, un certain nombre de périphériques
logiques, couramment utilisés, sont créés automatiquement. Par exemple, le
périphérique "FONTS:" est assigné au répertoire "fonts" de la disquette
système. Voici la liste des périphériques logiques les plus utilisés :
- SYS: - disquette système
- C: - commandes CLI
- FONTS: - polices de caractères
- L: - gestionnaires de périphériques
- LIBS: - bibliothèques
- S: - fichiers de commande
- DEVS: - périphériques
Le périphérique logique "C:" est assigné au répertoire "C" de la disquette
système, où se trouvent toutes les commandes du CLI. Si vous avez copié
quelques-unes de ces commandes dans le disque virtuel en mémoire, et que
vous voulez qu'AmigaDOS accède à ces commandes plutôt qu'à celles qui se
trouvent sur la disquette, il vous suffit de réassigner le périphérique
logique "C:". Par exemple :
Si vous lancez la commande "Assign" sans paramètres, elle affichera le nom
de tous les périphériques logiques, avec leur assignement. Si vous avez
démarré votre Amiga avec la disquette du compilateur C Lattice, les
périphériques suivants seront automatiquement assignés :
- S: - Lattice_C_5.0.1:s
- L: - Lattice_C_5.0.1:l
- C: - Lattice_C_5.0.1:c
- FONTS: - Lattice_C_5.0.1:fonts
- DEVS: - Lattice_C_5.0.1:devs
- LIBS: - Lattice_C_5.0.1:libs
- SYS: - Lattice_C_5.0.1:
Assignements particuliers au Lattice :
- LIB: - Volume: Lattice_C_5.0.2
- INCLUDE: - Volume: Lattice_C_5.0.2
- LC: - Lattice_C_5.0.1:c
- QUAD: - RAM Disk:
- ENV: - RAM Disk:env
- CLIPS: - RAM Disk:clipboards
11.2 Ouvrir et fermer des fichiers
Avant de pouvoir utiliser un fichier, vous devez demander au système de
l'ouvrir. En effet, AmigaDOS a besoin de savoir ce que vous voulez faire
avec ce fichier : allez-vous créer un fichier, ou allez-vous travailler sur
un fichier qui existe déjà ? L'ouverture d'un fichier se fait à l'aide de
la fonction Open() :
- Synopsis : file_handle = Open( nom_du_fichier , mode ) ;
- file_handle : (BPTR). En fait, c'est un pointeur vers une structure
FileHandle. Si AmigaDOS n'a pas pu ouvrir le fichier, Open() retourne la valeur NULL.
- nom_du_fichier : (char *). Pointeur vers une chaîne de caractères qui
indique le nom du fichier, avec éventuellement le nom du périphérique et/ou du répertoire où il se trouve.
- mode : (long). Pour ouvrir un fichier, vous devez dire au système ce que vous comptez faire avec ce
fichier. Les valeurs possibles pour ce paramètre sont :
- MODE_OLDFILE : ouverture d'un fichier existant en lecture.
- MODE_NEWFILE : ouverture d'un nouveau fichier en écriture.
- MODE_READWRITE : ouverture d'un fichier existant, avec un
verrou d'accès exclusif (cette notion sera expliquée plus loin dans ce chapitre).
- MODE_READONLY : pareil que MODE_OLDFILE.
Par exemple, pour créer un nouveau fichier appelé "Scores.data", il faudra écrire :
/* Essai d'ouverture du fichier : */
file_handle = Open( "Score.data", MODE_NEWFILE );
/* On vérifie si le fichier a été ouvert : */
if( file_handle == NULL )
/* le fichier n'a PAS été ouvert ! */
|
Une fois que vous avez fini de lire ou d'écrire dans un fichier, vous devez
le fermer à l'aide de la fonction Close() :
- Synopsis : Close( file_handle ) ;
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
Pensez à fermer tous les fichiers que vous avez ouverts !
11.3 Lire et écrire dans un fichier
Une fois que vous avez ouvert un fichier, vous pouvez commencer à le lire
ou à écrire dedans. AmigaDOS considère les fichiers comme une suite
d'octets, et quand vous lisez ou écrivez quelque chose vous devez indiquer
combien d'octets vous voulez lire ou écrire.
11.3.1 Read()
La lecture d'un fichier se fait à l'aide de la fonction Read() :
- Synopsis : octets_lus = Read( file_handle , tampon , longueur );
- octets_lus : (long). Nombre d'octets réellement lus. Même si vous dites
à AmigaDOS que vous voulez lire "n" octets, il n'est pas
certain que cela soit possible : le fichier peut être
endommagé, pas aussi grand que vous le pensez, etc.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- tampon : (char *). Pointeur vers la zone mémoire où seront copiés les octets lus.
- longueur : (long). Nombre d'octets que vous voulez lire.
Par exemple, si vous voulez lire un fichier qui contient un tableau (score)
de dix entiers, vous devez écrire (le fichier a déjà été ouvert) :
octets_lus = Read( file_handle , score , sizeof( score ) );
if ( octets_lus != sizeof( score ) )
/* ERREUR pendant la lecture ! */
|
11.3.2 Write()
L'écriture dans un fichier se fait à l'aide de la fonction Write() :
- Synopsis : octets_écrits = Write( file_handle , tampon , longueur );
- octets_écrits : (long). Nombre d'octets réellement écrits. Même si vous
dites à AmigaDOS que vous voulez écrire "n" octets, il
n'est pas certain que cela soit possible : la disquette
peut être pleine, protégée contre l'écriture, etc.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- tampon : (char *). Pointeur vers la zone mémoire où se trouvent les octets à écrire.
- longueur : (long). Nombre d'octets que vous voulez écrire.
Par exemple, si vous voulez écrire un tableau (score) de dix entiers dans
un fichier, vous devez écrire (le fichier a déjà été ouvert) :
octets_écrits = Write( file_handle , score , sizeof( score ) );
if ( octets_écrits != sizeof( score ) )
/* ERREUR pendant l'écriture ! */
|
11.4 Déplacements à l'intérieur des fichiers
Si vous écrivez quelque chose dans un fichier, le "curseur" marquant la
position courante dans ce fichier indiquera où s'est arrêtée l'écriture.
Donc, si vous écrivez autre chose, les nouvelles données seront placées
après les premières. Si vous voulez écrire par-dessus d'anciennes données,
vous devez donc d'abord déplacer le "curseur" au début de ces données avant
de commencer à écrire dans le fichier. Le déplacement du "curseur" se fait
à l'aide de la fonction Seek() :
- Synopsis : ancienne_pos = Seek( file_handle , nouvelle_pos , mode );
- ancienne_pos : (long). Position précédente dans le fichier, ou -1 en cas d'erreur.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- nouvelle_pos : (long). Nouvelle position, relative à "mode".
- mode : (long). La nouvelle position peut être relative :
- OFFSET_BEGINNING : au début du fichier.
- OFFSET_CURRENT : à la position courante.
- OFFSET_END : à la fin du fichier.
Ainsi, pour placer le "curseur" au début du fichier, vous devez utiliser le
mode OFFSET_BEGINNING, avec une nouvelle position égale à 0. Quand vous
ouvrez un fichier à l'aide de la fonction Open(), le "curseur" est
automatiquement placé au début du fichier.
Pour placer le "curseur" à la fin du fichier, vous devez utiliser le mode
OFFSET_END, avec une nouvelle position égale à 0.
Pour avancer le "curseur" de 10 octets par rapport à la position courante,
utilisez le mode OFFSET_CURRENT avec une nouvelle position égale à 10. Par
contre, pour reculer de 10 octets, donnez une nouvelle position égale à -10.
11.5 Fichiers et multitâche
Puisque l'Amiga peut exécuter plusieurs tâches en même temps, il peut
arriver que plusieurs tâches travaillent en même temps sur le même fichier.
Ceci peut être très dangereux car une tâche peut alors détruire les
données qu'une autre tâche a créées.
Imaginons deux tâches qui lisent un nombre dans un fichier, effectuent une
opération, puis réécrivent le résultat dans le fichier. La première tâche
multiplie le nombre par 2, la seconde ajoute 3 au nombre. Comme les deux
tâches peuvent s'exécuter au même instant, il peut très bien arriver
qu'elles écrivent le résultat au même moment :
Fichier
---------------
La tâche A lit le <- | nombre = 10 | -> La tâche B lit également
nombre. --------------- le nombre
| |
V |
|
La tâche A multiplie |
le nombre par 2, et --------------- |
écrit le résultat -> | nombre = 20 | |
dans le fichier. --------------- V
(10 * 2 = 20)
--------------- La tâche B ajoute 3 au
| nombre = 13 | <- nombre et écrit le
--------------- résultat dans le fichier.
(10 + 3 = 13)
|
Comme vous pouvez le voir, la valeur écrite par la tâche A est perdue. Que
se serait-il passé si la tâche A avait "verrouillé" le fichier afin que
d'autres tâches ne puissent y accéder ? La tâche B aurait dû attendre que
la tâche A "déverrouille" le fichier avant de pouvoir le lire ou écrire dedans.
Sur les gros systèmes, il existe plusieurs types de verrous ("lock" en
anglais) mais sur Amiga il n'y en a que deux. Vous pouvez verrouiller un
fichier pour que d'autres tâches puissent le lire mais pas le modifier
(verrou partagé, "shared lock" en anglais) ou vous pouvez interdire
complètement l'accès, en lecture et en écriture, aux autres tâches (verrou
exclusif, "exclusive lock" en anglais). Le verrouillage d'un fichier se
fait à l'aide de la fonction Lock() :
- Synopsis : verrou = Lock( nom_de_fichier , mode );
- verrou : (BPTR). Pointeur vers une structure FileLock.
- nom_de_fichier : (char *). Pointeur vers une chaîne de caractères contenant
le nom du fichier, avec éventuellement le nom du périphérique et/ou du répertoire où il se trouve.
- mode : (long). Type du verrou :
- SHARED_LOCK : d'autres tâches peuvent lire le fichier.
- ACCESS_READ : d'autres tâches peuvent lire le fichier.
- EXCLUSIVE_LOCK : aucune tâche ne peut accéder au fichier.
- ACCESS_WRITE : aucune tâche ne peut accéder au fichier.
Voici un exemple montrant comment verrouiller un fichier, de façon à ce
qu'aucune autre tâche ne puisse y accéder :
struct FileLock *verrou;
verrou = Lock( "Score.data", EXCLUSIVE_LOCK );
if( verrou == NULL )
/* ERREUR impossible de verrouiller le fichier */
|
Quand vous avez fini de travailler avec le fichier, vous devez le
"déverrouiller", à l'aide de la fonction UnLock() :
- Synopsis : UnLock( verrou ) ;
- verrou : (BPTR). Pointeur vers une structure FileLock qui a été
obtenu par un appel à la fonction Lock().
Pensez à déverrouiller tous les fichiers que vous avez verrouillés.
11.6 Autres fonctions utiles
Voici quelques autres fonctions utiles, que vous voudrez peut-être
employer. AmigaDOS vous permet de renommer et de détruire des fichiers,
d'associer un commentaire à un fichier, de modifier sa protection, etc.
Tout cela peut être fait à l'aide des fonctions décrites dans ce chapitre.
11.6.1 Créer un répertoire
Vous pouvez créer un répertoire à l'aide de la fonction CreateDir(). La
seule chose à indiquer est le nom du répertoire à créer, vous recevrez
en retour un verrou exclusif, ou NULL si quelque chose ne va pas.
Pensez à déverrouiller le nouveau répertoire dans votre programme.
Si un répertoire portant le même nom existait déjà, il est simplement
verrouillé et votre programme ne verra aucune différence.
- Synopsis : verrou = CreateDir( nom ) ;
- verrou : (BPTR). Pointeur vers une structure FileLock, ou NULL si
AmigaDOS n'a pas pu créer le nouveau répertoire.
- nom : (char *). Pointeur vers une chaîne de caractère indiquant
le nom du nouveau répertoire.
Voici un petit exemple :
struct FileLock *verrou;
verrou = CreateDir( "RAM:MonRepertoire" );
if( verrou == NULL )
exit( ERREUR );
...
UnLock( verrou );
|
11.6.2 Détruire un fichier ou un répertoire
La destruction d'un fichier ou d'un répertoire se fait à l'aide de la
fonction DeleteFile(). Il vous suffit d'indiquer le nom du fichier ou du
répertoire et vous recevrez en retour TRUE (détruit) ou FALSE (impossible
de détruire). Souvenez-vous que vous ne pouvez détruire un répertoire que
s'il est vide.
- Synopsis : résultat = DeleteFile( nom ) ;
- résultat : (long). TRUE si AmigaDOS a pu détruire le fichier ou le
répertoire, ou FALSE si quelque chose ne va pas (disque protégé, répertoire non vide, etc.).
- nom : (char *). Pointeur vers une chaîne de caractères indiquant le nom du fichier ou
du répertoire à détruire.
11.6.3 Renommer un fichier ou un répertoire
Vous pouvez renommer un fichier ou un répertoire à l'aide de la fonction
Rename(). Vous pouvez même déplacer un fichier d'un répertoire à un autre
avec cette fonction :
Rename( "df0:Documents/Ventes" , "df0:Lettres/Ventes" ) ;
|
... déplacera le fichier "Ventes" depuis le répertoire "Documents" vers le
répertoire "Lettres". Notez cependant que vous ne pouvez pas déplacer un
fichier d'un volume vers un autre.
- Synopsis : résultat = Rename( ancien_nom , nouveau_nom ) ;
- résultat : (long). TRUE si AmigaDOS a pu renommer le fichier ou le
répertoire ou FALSE si quelque chose ne va pas (disque protégé, etc.).
- ancien_nom : (char *). Pointeur vers une chaîne de caractères indiquant
l'ancien nom du fichier ou du répertoire.
- nouveau_nom : (char *). Pointeur vers une chaîne de caractères indiquant
le nouveau nom du fichier ou du répertoire.
11.6.4 Associer un commentaire à un fichier ou à un répertoire
AmigaDOS vous permet d'associer un commentaire à un fichier ou à un
répertoire. Ce commentaire peut donner une brève description de ce qu'est
ce fichier, et est très utile quand vous voulez donner des informations
supplémentaires sur un fichier. Le commentaire peut faire jusqu'à 80
caractères de long.
L'association d'un commentaire à un fichier ou à un répertoire se fait à
l'aide de la fonction SetComment().
- Synopsis : résultat = SetComment( nom , commentaire ) ;
- résultat : (long). TRUE si AmigaDOS a pu associer le commentaire ou
FALSE si quelque chose ne va pas (disque protégé, etc.).
- nom : (char *). Pointeur vers une chaîne de caractères indiquant
le nom du fichier ou du répertoire auquel vous voulez associer un commentaire.
- commentaire : (char *). Pointeur vers une chaîne de caractères indiquant
le commentaire à associer (maximum 80 caractères).
Voici un petit exemple :
if ( SetComment( "Lettre" , "Reponse a Albert" ) == FALSE )
printf( "ERREUR ! Impossible d'associer le commentaire !\n" ) ;
|
11.6.5 Protéger un fichier ou un répertoire
Vous pouvez protéger un fichier ou un répertoire, pour éviter qu'il ne soit
accidentellement détruit ou modifié. Ceci se fait à l'aide de la fonction
SetProtection() qui modifie les attributs (bits) de protection comme demandé. Voici la
liste des attributs que vous pouvez changer :
- FIBF_DELETE : le fichier (ou le répertoire) ne peut être détruit.
- FIBF_EXECUTE : le fichier ne peut être exécuté.
- FIBF_WRITE : le fichier (ou le répertoire) ne peut être modifié.
- FIBF_READ : le fichier (ou le répertoire) ne peut être lu.
- FIBF_ARCHIVE : le fichier (ou le répertoire) a été archivé.
- FIBF_PURE : le fichier peut être rendu résident.
- FIBF_SCRIPT : le fichier est un fichier de commandes.
Notez que pour l'instant tous les attributs ne sont pas utilisés par AmigaDOS.
- Synopsis : résultat = SetProtection( nom , masque ) ;
- résultat : (long). TRUE si AmigaDOS a pu modifier la protection ou
FALSE si quelque chose ne va pas (disque protégé, etc.).
- nom : (char *). Pointeur vers une chaine de caractères indiquant
le nom du fichier ou du répertoire que vous voulez protéger.
- masque : (long). Attributs de protection. Par exemple, pour empêcher la
destruction et l'exécution d'un fichier, la valeur de masque devra être FIBF_DELETE | FIBF_EXECUTE.
11.7 Examiner un fichier ou un répertoire
Vous pouvez examiner un fichier ou un répertoire à l'aide de la fonction
Examine(). Vous donnez un "verrou" sur ce fichier ou ce répertoire, et en
retour la fonction remplit pour vous une structure FileInfoBlock. Cette
structure contient plusieurs champs intéressants, que vous pouvez ensuite consulter.
11.7.1 Les structures FileInfoBlock et DateStamp
La structure FileInfoBlock est déclarée comme ceci :
struct FileInfoBlock
{
LONG fib_DiskKey;
LONG fib_DirEntryType;
char fib_FileName[108];
LONG fib_Protection;
LONG fib_EntryType;
LONG fib_Size;
LONG fib_NumBlocks;
struct DateStamp fib_Date;
char fib_Comment[80];
char fib_Reserved[36];
};
|
- fib_DiskKey : numéro de disquette (en général sans intérêt !).
- fib_DirEntryType : valeur inférieure à 0 s'il s'agit d'un fichier, valeur
supérieure à 0 s'il s'agit d'un répertoire.
- fib_FileName : chaîne de caractères indiquant le nom du fichier ou du répertoire.
- fib_Protection : attributs de protection :
- FIBF_DELETE : ne peut être détruit.
- FIBF_EXECUTE : ne peut être exécuté.
- FIBF_WRITE : ne peut être modifié.
- FIBF_READ : ne peut être lu.
- FIBF_ARCHIVE : a été archivé.
- FIBF_PURE : peut être rendu résident.
- FIBF_SCRIPT : fichier de commandes.
Notez que pour l'instant tous les attributs ne sont pas utilisés par AmigaDOS.
- fib_EntryType : type d'entrée (en général sans intérêt !).
- fib_Size : taille du fichier (nombre d'octets).
- fib_NumBlocks : taille du fichier (nombre de blocs disque).
- fib_Date : date de dernière modification.
- fib_Comment : chaîne de caractère indiquant le commentaire associé au
fichier ou au répertoire (maximum 80 caractères).
- fib_Reserved : réservé (donc à ne pas utiliser !).
La structure DateStamp est déclarée comme ceci :
struct DateStamp
{
LONG ds_Days;
LONG ds_Minute;
LONG ds_Tick;
};
|
- ds_Days : nombre de jours depuis le 1er janvier 1970.
- ds_Minute : nombre de minutes depuis minuit.
- ds_Tick : nombre d'impulsions dans la minute. Il y a 50 impulsions
par seconde (50x60=3000 impulsions par minute).
11.7.2 Examine()
La fonction Examine() s'utilise comme ceci :
- Synopsis : résultat = Examine( verrou , fib_ptr ) ;
- résultat : (long) TRUE si AmigaDOS a pu examiner le fichier ou le
répertoire, FALSE si quelque chose ne va pas.
- verrou : (BPTR). Pointeur vers une structure FileLock obtenu par un appel à la fonction Lock().
- fib_ptr : (struct FileInfoBlock *). Pointeur vers une structure
FileInfoBlock, qui sera remplie par la fonction. Attention : cette structure doit être alignée sur un long
mot (voir ci-dessous).
11.7.3 Alignement sur un long mot
Contrairement à tout le reste du système de l'Amiga, AmigaDOS n'a pas été
écrit en C, mais en BCPL (le prédécesseur du C). Le problème est que le
langage BCPL ne connait qu'un seul type de données : le long mot (LONG,
c'est-à-dire le mot de 32 bits). Toutes les données manipulées par AmigaDOS
doivent donc être alignées sur un long mot. Pour être sûr qu'une structure
est bien alignée, vous devez l'allouer à l'aide de la fonction AllocMem().
Pensez à désallouer la mémoire une fois que vous n'en avez plus besoin !
Donc, au lieu d'écrire :
struct FileInfoBlock fib; /* Déclare un FileInfoBlock appelé */
/* fib. Cette structure ne sera pas */
/* forcément alignée sur un long mot ! */
|
Écrivez plutôt :
struct FileInfoBlock *fib_ptr; /* Déclare un pointeur sur une structure */
/* FileInfoBlock, appelé fib_ptr. */
/* Alloue de la mémoire pour la structure FileInfoBlock */
/* Cette structure sera toujours alignée sur un long mot */
fib_ptr = AllocMem( sizeof( struct FileInfoBlock ),
MEMF_PUBLIC | MEMF_CLEAR );
/* Vérifie que l'allocation s'est bien passée */
if( fib_ptr == NULL )
exit(); /* PAS ASSEZ DE MEMOIRE */
... votre programme ...
/* Désalloue la mémoire allouée pour la structure FileInfoBlock */
FreeMem( fib_ptr, sizeof( struct FileInfoBlock ) );
|
11.7.4 Exemple
Voici un exemple qui vous montrera comment utiliser la fonction Examine().
Pensez à désallouer toute la mémoire allouée et à déverrouiller tous les
fichiers verrouillés avant que votre programme ne se termine !
#include <libraries/dos.h>
#include <exec/memory.h>
main()
{
struct FileLock *verrou;
struct FileInfoBlock *fib_ptr; /* Déclare un pointeur sur une structure */
/* FileInfoBlock, appelé fib_ptr. */
/* 1. Alloue de la mémoire pour la structure FileInfoBlock */
fib_ptr = AllocMem( sizeof( struct FileInfoBlock ),
MEMF_PUBLIC | MEMF_CLEAR );
/* Vérifie que l'allocation s'est bien passée */
if( fib_ptr == NULL )
exit(); /* PAS ASSEZ DE MEMOIRE */
/* 2. Essaye de verrouiller le fichier */
verrou = Lock( "Score.data", SHARED_LOCK )
/* Vérifie qu'on a pu verrouiller le fichier */
if( verrou == NULL )
{
/* Désalloue la mémoire */
FreeMem( fib_ptr, sizeof( struct FileInfoBlock ) );
exit();
}
/* 3. Essaye d'avoir des informations sur le fichier */
if( Examine( verrou, fib_ptr ) == FALSE )
{
/* Déverrouille le fichier */
UnLock( verrou );
/* Désalloue la mémoire */
FreeMem( fib_ptr, sizeof( struct FileInfoBlock ) );
exit();
}
/* 4. Maintenant on peut utiliser la structure FileInfoBlock */
/* 5. Déverrouille le fichier */
UnLock( verrou );
/* 6. Désalloue la mémoire */
FreeMem( fib_ptr, sizeof( struct FileInfoBlock ) );
}
|
11.7.5 Examiner les fichiers et sous-répertoires d'un répertoire ou d'un périphérique
Un répertoire ou un périphérique peuvent contenir plusieurs fichiers et/ou
plusieurs (sous-)répertoires. Si vous voulez examiner non seulement un
fichier ou un répertoire, mais tous les fichiers ou répertoires d'un
répertoire ou d'un périphérique, la fonction Examine() ne suffit pas. Vous
devez utiliser la fonction ExNext(), qui travaille en collaboration avec la
fonction Examine().
Pour examiner un répertoire ou un périphérique, vous devez d'abord appeler
la fonction Examine() comme d'habitude. Pour examiner le contenu de ce
répertoire ou de ce périphérique, vous devez ensuite appeler la fonction
ExNext() plusieurs fois, jusqu'à obtenir une erreur. Cette erreur est en
général un message "fin de répertoire", ce qui signifie que vous avez
examiné toutes les entrées du répertoire ou du périphérique. L'erreur peut
cependant être différente si quelque chose s'est mal passé pendant la lecture.
11.7.5.1 ExNext()
La fonction ExNext() ressemble beaucoup à la fonction Examine(). Voici sa description :
- Synopsis : résultat = ExNext( verrou , fib_ptr );
- résultat : (long). TRUE si AmigaDOS a pu examiner le fichier ou le répertoire,
FALSE si quelque chose ne va pas.
- verrou : (BPTR). Pointeur vers une structure FileLock obtenu par un appel à la fonction Lock().
- fib_ptr : (struct FileInfoBlock *). Pointeur vers une structure FileInfoBlock, qui sera remplie
par la fonction. Attention : cette structure doit être alignée sur un long mot (voir plus haut).
Souvenez-vous que vous devez d'abord appeler la fonction Examine(), et que
s'il s'agit d'un répertoire ou d'un périphérique (fib_DirEntryType > 0),
vous pouvez ensuite appeler la fonction ExNext() avec les même paramètres, jusqu'à obtenir une erreur.
11.7.5.2 Codes d'erreur
Quand vous avez appelé une fonction AmigaDOS et que son résultat indique
qu'une erreur s'est produite, vous pouvez appeler la fonction IoErr() pour
savoir ce qui s'est passé. Cette fonction n'a besoin d'aucun paramètre,
elle ne fait que retourner un code d'erreur indiquant la cause de l'erreur.
Voici la liste complète des codes d'erreur (V1.3). Ces codes sont définis
dans le fichier entête "librairies/dos.h".
- ERROR_NO_FREE_STORE : pas assez de mémoire libre.
- ERROR_TASK_TABLE_FULL : table des tâches pleine.
- ERROR_LINE_TOO_LONG : ligne trop longue.
- ERROR_FILE_NOT_OBJECT : n'est pas un fichier exécutable.
- ERROR_INVALID_RESIDENT_LIBRARY : bibliothèque incorrecte.
- ERROR_NO_DEFAULT_DIR : pas de répertoire par défaut.
- ERROR_OBJECT_IN_USE : objet verrouillé par une autre tâche.
- ERROR_OBJECT_EXISTS : cet objet existe déjà.
- ERROR_DIR_NOT_FOUND : répertoire non trouvé.
- ERROR_OBJECT_NOT_FOUND : objet non trouvé.
- ERROR_BAD_STREAM_NAME : nom de fenêtre incorrect.
- ERROR_OBJECT_TOO_LARGE : objet trop grand.
- ERROR_ACTION_NOT_KNOWN : action inconnue.
- ERROR_INVALID_COMPONENT_NAME : chemin d'accès incorrect.
- ERROR_INVALID_LOCK : verrou incorrect.
- ERROR_OBJECT_WRONG_TYPE : cet objet n'est pas du type requis.
- ERROR_DISK_NOT_VALIDATED : disquette non validée.
- ERROR_DISK_WRITE_PROTECTED : disquette protégée contre l'écriture.
- ERROR_RENAME_ACROSS_DEVICES : Rename() sur des périphériques différents.
- ERROR_DIRECTORY_NOT_EMPTY : répertoire non vide.
- ERROR_TOO_MANY_LEVELS : trop de niveaux.
- ERROR_DEVICE_NOT_MOUNTED : périphérique non installé.
- ERROR_SEEK_ERROR : erreur de déplacement avec Seek().
- ERROR_COMMENT_TOO_BIG : commentaire trop long.
- ERROR_DISK_FULL : disquette pleine.
- ERROR_DELETE_PROTECTED : protégé contre l'effacement.
- ERROR_WRITE_PROTECTED : protégé contre l'écriture.
- ERROR_READ_PROTECTED : protégé contre la lecture.
- ERROR_NOT_A_DOS_DISK : disquette non DOS.
- ERROR_NO_DISK : pas de disquette.
- ERROR_NO_MORE_ENTRIES : plus d'entrées dans le répertoire.
La fonction IoErr() s'utilise comme ceci :
- Synopsis : code = IoErr() ;
- code : (long). Code d'erreur (voir liste ci-dessus).
Ainsi, quand vous utilisez la fonction ExNext() et que celle-ci retourne
FALSE, vous devez appelez la fonction IoErr() pour voir ce qui s'est passé.
Si le code d'erreur n'est pas ERROR_NO_MORE_ENTRIES (toutes les entrées du
répertoire ont été examinées) alors il y a eu une erreur de lecture.
11.7.5.3 Exemple
Voici une partie d'un programme qui examine le contenu d'un répertoire ou
d'un périphérique, et affiche ce contenu :
if( Examine( verrou, fib_ptr ) )
{
if( fib_ptr->fib_DirEntryType > 0 )
{
printf("Nom du répertoire : %s\n", fib_ptr->fib_FileName );
while( ExNext( verrou, fib_ptr ) )
{
printf("nom : %s\n", fib_ptr->fib_FileName );
}
if( IoErr() == ERROR_NO_MORE_ENTRIES )
printf("Fin du répertoire !\n");
else
printf("ERREUR DE LECTURE !!!\n");
}
else
printf("C'est un fichier !\n");
}
else
printf("Impossible d'examiner le répertoire/périphérique !\n");
|
11.8 Fonctions
Voici une liste des fonctions les plus utilisées d'AmigaDOS :
Open()
Ouvre un fichier. Un fichier doit être ouvert pour que vous puissiez le lire ou y écrire.
- Synopsis : file_handle = Open( nom_du_fichier , mode ) ;
- file_handle : (BPTR). En fait, c'est un pointeur vers une structure
FileHandle. Si AmigaDOS n'a pas pu ouvrir le fichier, Open() retourne la valeur NULL.
- nom_du_fichier : (char *). Pointeur vers une chaîne de caractères qui
indique le nom du fichier, avec éventuellement le nom du
périphérique et/ou du répertoire où il se trouve.
- mode : (long). Pour ouvrir un fichier, vous devez dire au système
ce que vous comptez faire avec ce fichier. Les valeurs
possibles pour ce paramètre sont :
- MODE_OLDFILE : ouverture d'un fichier existant en lecture.
- MODE_NEWFILE : ouverture d'un nouveau fichier en écriture
- MODE_READWRITE : ouverture d'un fichier existant, avec un
verrou d'accès exclusif.
- MODE_READONLY : pareil que MODE_OLDFILE.
Close()
Ferme un fichier ouvert par Open(). Pensez à fermer TOUS les fichiers que vous ouvrez !
- Synopsis : Close( file_handle ) ;
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été obtenu par un appel à la fonction Open().
Read()
Lit un certain nombre d'octets depuis un fichier.
- Synopsis : octets_lus = Read( file_handle , tampon , longueur );
- octets_lus : (long). Nombre d'octets réellement lus. Même si vous dites
à AmigaDOS que vous voulez lire "n" octets, il n'est pas
certain que cela soit possible : le fichier peut être endommagé, pas aussi grand que vous le pensez, etc.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- tampon : (char *). Pointeur vers la zone mémoire où seront copiés les octets lus.
- longueur : (long). Nombre d'octets que vous voulez lire.
Write()
Écrit un certain nombre d'octets dans un fichier.
- Synopsis : octets_écrits = Write( file_handle , tampon , longueur );
- octets_écrits : (long). Nombre d'octets réellement écrits. Même si vous
dites à AmigaDOS que vous voulez écrire "n" octets, il n'est pas certain que cela soit possible :
la disquette peut être pleine, protégée contre l'écriture, etc.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- tampon : (char *). Pointeur vers la zone mémoire où se trouvent les octets à écrire.
- longueur : (long). Nombre d'octets que vous voulez écrire.
Seek()
Déplace le "curseur" indiquant la position courante dans un fichier.
- Synopsis : ancienne_pos = Seek( file_handle , nouvelle_pos , mode );
- ancienne_pos : (long). Position précédente dans le fichier, ou -1 en cas d'erreur.
- file_handle : (BPTR). Pointeur vers une structure FileHandle qui a été
obtenu par un appel à la fonction Open().
- nouvelle_pos : (long). Nouvelle position, relative à "mode".
- mode : (long). La nouvelle position peut être relative :
- OFFSET_BEGINNING : au début du fichier.
- OFFSET_CURRENT : à la position courante.
- OFFSET_END : à la fin du fichier.
Lock()
Verrouille un fichier de façon à ce qu'aucune autre tâche ne modifie son
contenu (SHARED_LOCK) ou même ne puisse lire ce fichier (EXCLUSIVE_LOCK).
- Synopsis : verrou = Lock( nom_de_fichier , mode );
- verrou : (BPTR) Pointeur vers une structure FileLock.
- nom_de_fichier: (char *). Pointeur vers une chaîne de caractères contenant
le nom du fichier, avec éventuellement le nom du périphérique et/ou du répertoire où il se trouve.
- mode : (long). Type du verrou :
- SHARED_LOCK : d'autres tâches peuvent lire le fichier.
- ACCESS_READ : d'autres tâches peuvent lire le fichier.
- EXCLUSIVE_LOCK : aucune tâche ne peut accéder au fichier.
- ACCESS_WRITE : aucune tâche ne peut accéder au fichier.
UnLock()
Déverrouille un fichier verrouillé par Lock(). Pensez à déverrouiller tous les fichiers que vous verrouillez !
- Synopsis : UnLock( verrou );
- verrou : (BPTR). Pointeur vers une structure FileLock qui a été obtenu par un appel à la fonction Lock().
Rename()
Renomme un fichier ou un répertoire. Vous pouvez même déplacer un fichier
d'un répertoire à un autre (par exemple, Rename( "df0:Documents/Ventes" ,
"df0:Lettres/Ventes" ) déplacera le fichier "Ventes" depuis le répertoire
"Documents" vers le répertoire "Lettres"). Notez cependant que vous ne
pouvez pas déplacer un fichier d'un volume vers un autre.
- Synopsis : résultat = Rename( ancien_nom , nouveau_nom ) ;
- résultat : (long) TRUE si AmigaDOS a pu renommer le fichier ou le
répertoire, ou FALSE si quelque chose ne va pas (disque protégé, etc.).
- ancien_nom : (char *). Pointeur vers une chaîne de caractères indiquant
l'ancien nom du fichier ou du répertoire.
- nouveau_nom : (char *). Pointeur vers une chaîne de caractères indiquant
le nouveau nom du fichier ou du répertoire.
SetComment()
Associe un commentaire à un fichier ou à un répertoire.
- Synopsis : résultat = SetComment( nom , commentaire ) ;
- résultat : (long). TRUE si AmigaDOS a pu associer le commentaire, ou
FALSE si quelque chose ne va pas (disque protégé, etc.).
- nom : (char *). Pointeur vers une chaîne de caractères indiquant
le nom du fichier ou du répertoire auquel vous voulez associer un commentaire.
- commentaire : (char *). Pointeur vers une chaîne de caractères indiquant
le commentaire à associer (maximum 80 caractères).
SetProtection()
Modifie les attributs de protection d'un fichier. Voici la liste des bits que vous pouvez changer :
- FIBF_DELETE : le fichier (ou le répertoire) ne peut être détruit.
- FIBF_EXECUTE : le fichier ne peut être exécuté.
- FIBF_WRITE : le fichier (ou le répertoire) ne peut être modifié.
- FIBF_READ : le fichier (ou le répertoire) ne peut être lu.
- FIBF_ARCHIVE : le fichier (ou le répertoire) a été archivé.
- FIBF_PURE : le fichier peut être rendu résident.
- FIBF_SCRIPT : le fichier est un fichier de commandes.
Notez que pour l'instant tous les attributs ne sont pas utilisés par AmigaDOS.
- Synopsis : résultat = SetProtection( nom , masque ) ;
- résultat : (long). TRUE si AmigaDOS a pu modifier la protection, ou
FALSE si quelque chose ne va pas (disque protégé, etc.).
- nom : (char *). Pointeur vers une chaîne de caractères indiquant
le nom du fichier ou du répertoire que vous voulez protéger.
- masque : (long). Attributs de protection. Par exemple, pour empêcher la
destruction et l'exécution d'un fichier, la valeur de masque devra être FIBF_DELETE | FIBF_EXECUTE.
DeleteFile()
Détruit un fichier ou un répertoire. Notez que pour pouvoir être détruit,
un répertoire doit être vide.
- Synopsis : résultat = DeleteFile( nom ) ;
- résultat : (long) TRUE si AmigaDOS a pu détruire le fichier ou le
répertoire, ou FALSE si quelque chose ne va pas (disque protégé, répertoire non vide, etc.).
- nom : (char *). Pointeur vers une chaîne de caractères indiquant le nom du fichier ou du répertoire à détruire.
CreateDir()
Crée un nouveau répertoire et retourne un verrou exclusif sur ce
répertoire. Pensez à déverrouiller le répertoire par la suite !
- Synopsis : verrou = CreateDir( nom ) ;
- verrou : (BPTR). Pointeur vers une structure FileLock, ou NULL si
AmigaDOS n'a pas pu créer le nouveau répertoire.
- nom : (char *). Pointeur vers une chaîne de caractère indiquant
le nom du nouveau répertoire.
CurrentDir()
Change le répertoire courant. Vous devez auparavant obtenir un verrou sur
ce répertoire. La fonction retourne un verrou sur l'ancien répertoire
courant afin que vous puissiez le déverrouiller si besoin.
- Synopsis : ancien = CurrentDir( nouveau ) ;
- ancien : (BPTR). Pointeur sur une structure FileLock correspondant
à l'ancien répertoire courant.
- nouveau : (BPTR). Pointeur sur une structure FileLock correspondant
au nouveau répertoire courant.
Info()
Retourne des informations sur une disquette. Vous indiquez la disquette à
examiner en passant à la fonction un verrou sur n'importe quel fichier ou
répertoire de cette disquette.
- Synopsis : résultat = Info( verrou , info_ptr ) ;
- résultat : (long). TRUE si AmigaDOS a pu examiner la disquette, ou
FALSE si quelque chose ne va pas.
- verrou : (BPTR). Pointeur sur une structure FileLock.
- info_ptr : (struct InfoData *). Pointeur sur une structure InfoData
qui sera remplie par la fonction. Attention : cette
structure doit être alignée sur un long mot !
IoErr()
Peut être utilisée pour connaître la cause d'une erreur. Quand une
fonction AmigaDOS indique qu'une erreur s'est produite, appelez cette
fonction pour obtenir un code décrivant cette erreur.
- Synopsis : code = IoErr() ;
- code : (long). Contient un code d'erreur, qui peut être :
- ERROR_NO_FREE_STORE : pas assez de mémoire libre.
- ERROR_TASK_TABLE_FULL : table des tâches pleine.
- ERROR_LINE_TOO_LONG : ligne trop longue.
- ERROR_FILE_NOT_OBJECT : n'est pas un fichier exécutable.
- ERROR_INVALID_RESIDENT_LIBRARY : bibliothèque incorrecte.
- ERROR_NO_DEFAULT_DIR : pas de répertoire par défaut.
- ERROR_OBJECT_IN_USE : objet verrouillé par une autre tâche.
- ERROR_OBJECT_EXISTS : cet objet existe déjà.
- ERROR_DIR_NOT_FOUND : répertoire non trouvé.
- ERROR_OBJECT_NOT_FOUND : objet non trouvé.
- ERROR_BAD_STREAM_NAME : nom de fenêtre incorrect.
- ERROR_OBJECT_TOO_LARGE : objet trop grand.
- ERROR_ACTION_NOT_KNOWN : action inconnue.
- ERROR_INVALID_COMPONENT_NAME : chemin d'accès incorrect.
- ERROR_INVALID_LOCK : verrou incorrect.
- ERROR_OBJECT_WRONG_TYPE : cet objet n'est pas du type requis.
- ERROR_DISK_NOT_VALIDATED : disquette non validée.
- ERROR_DISK_WRITE_PROTECTED : disquette protégée contre l'écriture.
- ERROR_RENAME_ACROSS_DEVICES : Rename() sur des périphériques différents.
- ERROR_DIRECTORY_NOT_EMPTY : répertoire non vide.
- ERROR_TOO_MANY_LEVELS : trop de niveaux.
- ERROR_DEVICE_NOT_MOUNTED : périphérique non installé.
- ERROR_SEEK_ERROR : erreur de déplacement avec Seek().
- ERROR_COMMENT_TOO_BIG : commentaire trop long.
- ERROR_DISK_FULL : disquette pleine.
- ERROR_DELETE_PROTECTED : protégé contre l'effacement.
- ERROR_WRITE_PROTECTED : protégé contre l'écriture.
- ERROR_READ_PROTECTED : protégé contre la lecture.
- ERROR_NOT_A_DOS_DISK : disquette non DOS.
- ERROR_NO_DISK : pas de disquette.
- ERROR_NO_MORE_ENTRIES : plus d'entrées dans le répertoire.
11.9 Exemples
Voici des exemples
(dans le répertoire "Amiga_C_Manual/11.AmigaDOS") montrant des fonctions en relation avec AmigaDOS :
Exemple 1
Ce programme demande dix entiers à l'utilisateur, et les sauvegarde dans
un fichier ("HighScore.dat") sur le disque RAM:. La mémoire est alors
effacée, et le "curseur" dans le fichier remit au début du fichier. Le
fichier est alors rechargé en mémoire, et affiché.
Exemple 2
Cet exemple montre comment créer un répertoire nommé "MyDirectory" sur le disque RAM:.
Exemple 3
Cet exemple montre comment renommer un fichier ou un répertoire.
Il renommera le fichier créé dans l'exemple 1 ("HighScore.dat") en
"Numbers.dat". Il renommera également le répertoire créé dans l'exemple 2
("MyDirectory") en "NewDirectory".
Exemple 4
Cet exemple montre comment détruire un fichier ou un répertoire.
Il détruira le fichier créé dans l'exemple 1 et le répertoire créé dans
l'exemple 2 (en supposant qu'ils ont été renommés par l'exemple 3).
Exemple 5
Cet exemple montre comment associer un commentaire à un fichier.
Un fichier "Letter.doc" sera créé et un commentaire lui sera associé.
Pour voir ce commentaire, utilisez la commande "List" du CLI.
Exemple 6
Cet exemple montre comment protéger et déprotéger un fichier.
Le fichier créé dans l'exemple 5 ("Letter.doc") sera protégé, puis on
essayera de le détruire (sans succès !). Il sera ensuite déprotégé et
on essayera à nouveau de le détruire (cette fois ça marchera !).
Exemple 7
Ce programme prend comme argument un nom de fichier, de répertoire ou de
périphérique et affiche quelques informations intéressantes sur l'objet indiqué.
Exemple 8
Ce programme prend comme argument un nom de répertoire ou de périphérique
et affiche le nom de tous les fichiers ou répertoires qu'il contient. Cet
exemple montre comment utiliser Examine() et ExNext().
|