Obligement - L'Amiga au maximum

Dimanche 26 septembre 2021 - 15:13  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Quizz
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Trucs et astuces
 · Articles divers

 · Articles in english


Twitter

Suivez-nous sur Twitter




Liste des jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Galeries

 · Menu des galeries

 · BD d'Amiga Spécial
 · Caricatures Dudai
 · Caricatures Jet d'ail
 · Diagrammes de Jay Miner
 · Images insolites
 · Fin de jeux (de A à E)
 · Fin de Jeux (de F à O)
 · Fin de jeux (de P à Z)
 · Galerie de Mike Dafunk
 · Logos d'Obligement
 · Pubs pour matériels
 · Systèmes d'exploitation
 · Trombinoscope Alchimie 7
 · Vidéos


Téléchargement

 · Documents
 · Jeux
 · Logiciels
 · Magazines
 · Divers


Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


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 :

EX:test1

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 :

Assign C: RAM:

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 
#include 

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().


[Retour en haut] / [Retour aux articles] [Chapitre précédent : Sprites] / [Chapitre suivant : Les routines graphiques de bas niveau]