Section courante

A propos

Section administrative du site

Utilisation de fichiers et de répertoires

Le QuickPascal n'offre pas juste la possibilité de faire des programmes effectuant des entrées et sorties du clavier et de l'écran, il permet également de manipuler de façon assez profondes les fichiers et les répertoires du système d'exploitation DOS. Cette possibilité est très utiles car elle permet d'entreposer des données au-delà de la fin de chaque session. Le QuickPascal résout ce problème en prenant en charge l'utilisation de fichiers sur disque.

Effectuer l'entrée et la sortie de fichiers

Le concept de fichier est fondamental pour la conception du système d'exploitation. Le DOS, par exemple, considère tout ce qui se trouve en dehors de la mémoire interne du compatible IBM PC sous forme de fichier. Par conséquent, le clavier est un fichier d'entrée, l'écran et l'imprimante sont des fichiers de sortie et un unité de disque peut servir de fichier d'entrée ou de sortie.

Pour le DOS, chacun de ces attachements physiques est appelé un périphérique. Tous les périphériques de même nature doivent - en interne, au moins - répondre aux mêmes instructions électroniques. Étant donné que tous les périphériques sont conçus pour être électroniquement identiques, les mêmes services DOS communiquant avec un périphérique peuvent également être utilisés pour communiquer avec n'importe quel autre périphérique. C'est pourquoi DOS peut fournir une prise en charge équivalente pour une si grande variété de périphériques, comme les imprimantes matricielles et laser, les unités de disquettes et de disque dur et les moniteurs monochromes et couleur.

Étant donné que tous les périphériques répondent aux mêmes commandes DOS, vous pouvez utiliser les mêmes procédures QuickPascal que vous avez utilisées pour échanger des données avec le clavier et l'écran (Read, ReadLn, Write et WriteLn) pour échanger des informations avec les fichiers disque.

Utilisation de fichiers d'entrée et de sortie standard

Tout d'abord, il existe l'unité Printer contenant un code associant l'identificateur Lst au périphérique LPT1 de votre compatible IBM PC, étant très probablement votre imprimante système. L'utilisation de l'imprimante système devient alors un processus en deux étapes. Tout d'abord, vous incluez la déclaration suivante au début de votre programme :

  1. Uses Printer;

Ensuite, vous incluez Lst comme premier paramètre dans une procédure Write ou WriteLn :

  1. WriteLn('Ce message va vers l''écran');
  2. WriteLn(Lst,'Ce message va vers l''imprimante');

De la même manière, l'unité System associe automatiquement les identificateurs Input et Output à vos périphériques d'entrée et de sortie standard - en d'autres termes, votre clavier et votre écran, respectivement. D'où l'énoncé suivant :

  1. ReadLn(Input,Value);

est interprété par QuickPascal comme signifiant «Prenez la prochaine entrée du clavier et attribuez-la à l'élément de données nommé Value». La déclaration :

  1. WriteLn(Output,'Bonjour !');

est interprété comme signifiant «Afficher Bonjour ! à l'écran.»

Certains compilateurs Pascal exigent que vous utilisiez les identificateurs d'entrée et de sortie à chaque fois que vous accédez au clavier et à l'écran. Heureusement, le QuickPascal est plus tolérant. Dans QuickPascal, Input est le fichier par défaut pour Read et ReadLn, et Output est le fichier par défaut pour Write et WriteLn. Par conséquent, chaque fois que vous omettez un nom de fichier dans l'une de ces procédures, le QuickPascal insère simplement le fichier par défaut automatiquement.

Comprendre les fichiers logiques et physiques

Le DOS (signifiant Disk Operating System) est responsable de la gestion de toutes les entrées et sorties de fichiers disque. Le DOS prend en charge des détails potentiellement gênants tels que la taille et la configuration de l'unité de disque, si de l'espace libre est disponible ou non sur le disque, et l'emplacement physique du fichier sur le support d'entreposage lui-même. De même, lorsque vous créez ou modifiez un fichier, le DOS garantit que la date et l'heure actuelles (les informations que vous voyez lorsque vous exécutez une commande DIR) sont mises à jour.

En fait, DOS gère si bien ses tâches de gestion de fichiers que le QuickPascal est inconscient de tout sauf des données transférées. Le fichier physique est caché derrière un mur de services DOS. Le QuickPascal donne simplement au système d'exploitation le nom du fichier physique qu'il souhaite utiliser, puis envoie et reçoit des informations. En conséquence, un programme QuickPascal peut se concentrer sur le fichier logique, se composant d'un nom d'identificateur et des données elles-mêmes. En d'autres termes, dans QuickPascal, un fichier logique n'est qu'un autre type de données, et l'utilisation d'un fichier logique est aussi simple que d'inclure l'identificateur du fichier comme premier paramètre dans un Read, ReadLn, Write ou WriteLn déclaration.

Utilisation des fichiers disque dans QuickPascal

Vous pouvez considérer le type de données du fichier comme une séquence de données. (Dans le langage de programmation C, cette séquence est appelée un flux de données.) Comme dans un tableau, chaque composante d'un fichier doit être du même type de données. Et tout comme la déclaration d'un tableau dépend de la nature des données la composant, la déclaration d'un fichier dépend du type de données qu'il entrepose. En particulier, le QuickPascal prend en charge trois types de fichiers logiques, nommés en fonction du type de données qu'ils contiennent :

De toute évidence, le type de fichier que vous utilisez dépend de la nature des données que vous souhaitez traiter.

Déclarer un identificateur de fichier

Déclarer un identificateur de fichier revient à déclarer n'importe quel autre type de données, bien que chaque type de fichier soit déclaré à sa manière. Vous déclarez un fichier texte avec le mot clef TEXT :

  1. Var
  2.  TextFileID:Text;

Vous déclarez un fichier typé en donnant explicitement son type de données composant. Voici les déclarations de deux fichiers typés :

  1. Type
  2.  EtudiantEnr=Record
  3.   Nom:String[30];
  4.   Cours:String;
  5.   Grade:Word;
  6.  End;
  7.  
  8. Var
  9.  FicheEtudiante:File Of EtudiantEnr;
  10.  FichierDonnees:File Of Real;

Un fichier non typé a la déclaration la plus générale :

  1. Var
  2.  UntypedFileID:File;

Vous pouvez définir n'importe quel nombre d'identificateurs de fichiers dans votre programme. Bien que chaque déclaration puisse être locale ou globale, presque toutes les déclarations de fichiers sont globales.

Spécification du fichier physique

Avant de pouvoir travailler avec un fichier, vous devez utiliser la procédure Assign pour associer votre identificateur de fichier (votre fichier logique) aux données réelles entreposées sur le disque (le fichier physique). La procédure Assign a la même syntaxe pour les trois types de fichiers. Il prend deux paramètres : l'identificateur du fichier et une chaîne de caractères contenant le nom du fichier disque.

Voici quelques instructions d'affectation pour les identificateurs déclarés dans la dernière section :

  1. StrVar:='ENTREPOS.FAX';
  2. Assign(TextFileID,'QP_DEMO.PAS');
  3. Assign(FicheEtudiant,'C:\BACKUP\ETDINFO.DAT');
  4. Assign(DataFile,StrVar);
  5. Assign(UntypedFileID,ParamStr(1));

Si vous n'incluez pas l'unité de disque et le chemin, le QuickPascal supposera que le fichier réside dans le répertoire actuel.

Ouvrir un fichier

Après avoir donné à DOS le nom du fichier que vous souhaitez utiliser, vous devez physiquement ouvrir le fichier. Ouvrir un fichier signifie dire à DOS comment vous voulez que le fichier soit accessible. Vous avez trois choix, selon le type de fichier que vous déclarez :

Le QuickPascal propose trois procédures différentes pour ouvrir un fichier : Reset, Rewrite et Append. Le fonctionnement de chacun dépend du type de fichier que vous souhaitez utiliser.

Ouvrir un fichier texte

Vous pouvez ouvrir un fichier texte pour l'entrée ou la sortie, mais pas pour les deux opérations en même temps. Voici les trois procédures que vous pouvez utiliser :

Ouvrir un fichier typé

Vous pouvez ouvrir un fichier typé pour l'entrée et la sortie avec les procédures suivantes :

Étant donné que les éléments de données dans un fichier tapé ne sont pas séparés par des caractères de fin de ligne, vous ne pouvez pas utiliser ReadLn et WriteLn pour l'entrée ou la sortie. Seules les procédures Read et Write sont disponibles. Rappelons que l'identificateur du fichier typé doit apparaître en premier paramètre.

Ouvrir un fichier non typé

Vous pouvez ouvrir un fichier non typé pour l'entrée et la sortie. Les fichiers non typés étant conçus pour traiter des blocs de données plus volumineux, vous ne pourrez pas utiliser les procédures Read et Write. Au lieu de cela, vous devez utiliser l'instruction BlockWrite pour toutes les sorties de fichiers et l'instruction BlockRead pour toutes les entrées de fichiers. Voici les procédures que vous pouvez utiliser pour ouvrir un fichier non typé :

Pour Rewrite et Reset, le paramètre BlockSize est facultatif. Cependant, étant donné que BlockRead et BlockWrite ne peuvent transférer que des blocs complets, vous devez sélectionner une taille de bloc se divisant uniformément dans la taille du fichier. Si vous n'êtes pas sûr de la taille du fichier, vous devez définir BlockSize sur 1.

Fermeture d'un fichier

Le QuickPascal ferme automatiquement tous les fichiers ouverts lorsque votre programme se termine. Vous pouvez également utiliser la procédure Close pour fermer un fichier dès que vous avez fini de l'utiliser. Puisque DOS place une limite supérieure sur le nombre de fichiers pouvant être ouverts à tout moment, la fermeture d'un fichier inutilisé est une bonne pratique de programmation.

Si le fichier a été ouvert pour la sortie, Close garantit que toutes les données restantes dans la mémoire tampon du programme sont écrites sur le disque. De plus, Close met à jour l'entrée du répertoire du disque DOS du fichier avec la nouvelle taille de fichier et la date et l'heure actuelles.

Vous pouvez rouvrir un fichier fermé plus tard dans le programme avec un autre Reset, Rewrite ou Append. Étant donné que QuickPascal conserve le lien d'origine entre l'identificateur de fichier et le fichier physique, vous n'avez pas besoin d'effectuer d'autres opérations Assign.

Détecter la fin d'un fichier et la fin d'une ligne

Lorsque vous lisez un fichier, vous ne savez généralement pas combien de composants il contient. Par exemple, vous avez peut-être considérablement modifié un fichier texte source de programme lors de votre dernière session d'édition. Même si vous saviez combien de lignes il contenait à l'origine, combien de lignes contient-il maintenant ?

Dans le monde réel, peu de programmes connaissent à l'avance le nombre de composantes de données entreposés dans un fichier donné. Après tout, un programme de paie ne doit se soucier que du fait qu'un fichier contienne les enregistrements de travail des employés - le nombre d'enregistrements n'a pas d'importance. (Imaginez le recodage et la recompilation de vos programmes simplement parce que vous ne pouvez pas prédire la taille des fichiers qu'ils doivent lire.)

De toute évidence, vous avez besoin d'un moyen de savoir quand vous avez rencontré le dernier composant d'un fichier. Dans QuickPascal, vous pouvez tester cette situation avec la fonction booléenne Eof (fin de fichier). La fonction Eof renvoie TRUE lorsque vous ouvrez un fichier vide en entrée, ou lorsqu'il ne reste plus de composantes à lire.

L'exemple suivant montre un programme affichant le contenu d'un fichier texte à l'écran. Remarquez comment la fonction Eof teste un fichier texte à l'écran. Remarquez comment la fonction Eof teste si le fichier est vide ou non avant que la première ligne ne soit entrée.

  1. Program VoirFich;
  2.  
  3. Var
  4.  FileIdent:Text;
  5.  FileName:String;
  6.  Info:String[79];
  7.  
  8. BEGIN
  9.  Write('Nom de fichier : ',FileName);
  10.  Assign(FileIdent,FileName);
  11.  Reset(FileIdent);
  12.  While Not Eof(FileIdent)do Begin
  13.    ReadLn(FileIDent,Info);
  14.    WriteLn(Info);
  15.  End;
  16.  Close(FileIdent);
  17. END.

Vous pouvez utiliser Eof avec n'importe quel type de fichier : texte, typé ou non typé. Lorsque vous travaillez avec des fichiers texte, vous pouvez utiliser la fonction SeekEof au lieu de la fonction Eof. La fonction SeekEof renvoie également TRUE lorsqu'il ne reste plus de données dans le fichier. Cependant, SeekEof ignorera tous les caractères d'espacement restants tels que les blancs, les tabulations, les sauts de ligne et les retours chariot. Ainsi, lorsque vous utilisez la fonction SeekEof, votre programme ignore les lignes vides restant à la fin de votre fichier.

De plus, les fichiers texte prennent également en charge les fonctions Eoln et SeekEoln. La fonction Eoln renvoie TRUE lorsque vous avez lu la dernière donnée de la ligne courante. La fonction SeekEoln est comme la fonction Eoln mais il saute les blancs et les tabulations. Par conséquent, l'utilisation de SeekEoln permet à votre programme d'ignorer tout espace vide à la fin d'une ligne.

Vérification des erreurs d'entrée/sortie

Par défaut, toutes les erreurs d'entrée/sortie d'exécution sont fatales. Cependant, vous pouvez désactiver la vérification des erreurs d'entrées/sorties avec la directive du compilateur {$I-} à tout moment. En désactivant la vérification des erreurs d'entrées/sorties, vous désactivez la capacité de QuickPascal à répondre automatiquement à une erreur d'entrée ou de sortie. Au lieu de cela, vous devez utiliser la fonction IOResult pour tester l'état de chaque routine d'entrée et de sortie. Si la routine d'entrée/sortie a réussi, la fonction IOResult renvoie 0 ; sinon, la fonction IOResult renvoie une valeur non nulle correspondant à l'erreur qui s'est produite. Vous pouvez utiliser le résultat de la fonction IOResult pour déterminer l'action corrective la plus appropriée.

Si une erreur se produit alors que la vérification des erreurs d'entrée/sortie est désactivée, le QuickPascal ignorera tous les appels de procédure et de fonction d'entrée/sortie jusqu'à ce que la fonction IOResult soit appelé. Habituellement, l'erreur spécifique peut être déduite du contexte du programme. Par exemple, vous pouvez utiliser la routine suivante pour tester l'existence d'un fichier :

  1. Function FileExists(NomFichier:String):Boolean;
  2. Var
  3.  FichierLocal:File of Byte;
  4.  Rechercher:Word;
  5. Begin
  6.  Assign(FichierLocal,NomFichier);
  7.  {$I-} Reset(FichierLocal);
  8.  Rechercher:=IOResult; {$I+}
  9.  If Rechercher=0 Then FileExists:=True
  10.                  Else FileExists:=False;
  11.  Close(FichierLocal);
  12. End;

De même, une erreur survenant lors de la procédure d'ajout indique généralement un fichier inexistant. Le code suivant teste si le fichier OUTNAME existe. Si tel est le cas, la sortie est dirigée vers la fin du fichier ; sinon, un nouveau fichier est créé :

  1. Program TESTFICH;
  2.  
  3. Var
  4.  OutName:String;
  5.  FileParam:File Of Byte;
  6.  Finding:Word;
  7.  
  8. BEGIN
  9.  OutName:='MONFICH.TXT';
  10.  {$I-}
  11.  Assign(FileParam,OutName);
  12.  Finding:=IOResult;
  13.  {$I+}
  14.  If Finding<>0 Then ReWrite(FileParam);
  15. END.

Remarquez comment ces exemples affectent IOResult à une variable, puis testez la valeur de la variable. Cela est dû au fait que l'appel à la fonction IOResult réinitialise l'indicateur d'état d'erreur QuickPascal ; par conséquent, appeler IOResult une deuxième fois renverra toujours 0.

Gestion des répertoires DOS

Lorsque vous exécutez la commande DIR de DOS, vous voyez des informations sur votre système. Par exemple, vous pouvez apprendre le nom, la taille et la date et l'heure de création des fichiers sélectionnés. Vous pouvez également connaître l'unité de disque et le répertoire actuellement actifs, ainsi que la quantité d'espace libre restant sur l'unité de disque.

Demande d'informations sur l'unité de disque

Vous pouvez utiliser la fonction DiskSize pour obtenir l'espace d'entreposage total, en octets, sur un unité de disque spécifié. La fonction DiskFree renvoie le nombre d'octets actuellement disponibles.

Les deux fonctions prennent un seul paramètre pour indiquer l'unité de disque : 1 désigne l'unité de disque A, 2 désigne l'unité de disque B, et ainsi de suite. Une valeur de 0 indique l'unité de disque par défaut actuel. Voici une fonction renvoyant la proportion d'espace disponible (PourcentageDisponible) sur un unité de disque sélectionné :

  1. Program PourDisp;
  2.  
  3. Uses DOS;
  4.  
  5. Function PourcentageDisponible(NumeroDisque:Byte):Real;Begin
  6.  PourcentageDisponible:=DiskFree(NumeroDisque)/DiskSize(NumeroDisque);
  7. End;
  8.  
  9. BEGIN
  10.  WriteLn('Pourcentage disponible de l''unité courante : ',PourcentageDisponible(0),'%');
  11. END.

Les fonctions DiskSize et DiskFree renvoient -1 lorsque vous spécifiez un unité de de disque non valide. Le code suivant montre comment vous pouvez utiliser ce fait pour tester la disponibilité d'un unité de disque :

  1. Program DSTest;
  2.  
  3. Uses DOS;
  4.  
  5. BEGIN
  6.  If DiskSize(1)=-1 Then Begin
  7.   WriteLn('Unité de disque A: pas prête.');
  8.   WriteLn('SVP inséré l''unité de disquette à formater.');
  9.  End;
  10. END.

Sélection de répertoires

Vous pouvez utiliser la procédure GetDir pour obtenir le répertoire actuellement actif pour n'importe quel unité de disque. La procédure GetDir accepte le numéro d'unité de disque (0 pour la valeur par défaut, 1 pour l'unité de disque A, 2 pour l'unité de disque B,...) et une chaîne de caractères pour contenir le nom du répertoire une fois la procédure terminée :

  1. Procedure ShowDirInfo(DrvNum:Byte);
  2. Var
  3.  CurrDir:String;
  4.  Finding:Word;
  5. Begin
  6.  {$I-}
  7.  GetDir(DrvNum,CurrDir);
  8.  Finding:=IOResult;
  9.  {$I+}
  10.  If Finding=0 Then WriteLn('Unité de disque ',DrvNum,' : ',CurrDir);
  11. End; 
  12.  
  13. BEGIN
  14.  ShowDirInfo(0);
  15. END.

La chaîne de caractères renvoyée par GetDir contient la spécification complète de l'unité de disque et du chemin. Ainsi, l'unité de disque actuel est dans la première position de la chaîne de caractères :

  1. Function GetCurrentDrive:Char;
  2. Var
  3.  CurrDir:String;
  4.  Finding:Word;
  5. Begin
  6.  {$I-}
  7.  GetDir(0,CurrDir);
  8.  Finding:=IOResult;
  9.  {$I+}
  10.  If Finding=0 Then GetCurrentDrive:=CurrDir[1];
  11. End;
  12.  
  13. BEGIN
  14.  WriteLn(GetCurrentDrive);
  15. END.

Le QuickPascal fournit également la procédure ChDir pour modifier l'unité de disque et le répertoire par défaut, la procédure MkDir pour créer un nouveau répertoire et la procédure RmDir pour supprimer un répertoire vide. Ces routines se comportent exactement comme les commandes CD, MD et RD du DOS, respectivement.

Déterminer la taille d'un fichier

Vous pouvez utiliser la fonction FileSize sur des fichiers typés et non typés pour obtenir la taille d'un fichier disque. Dans un fichier typé, FileSize renvoie le nombre de composantes. Dans un fichier non typé, la fonction FileSize renvoie le nombre de blocs. (La taille par défaut d'un bloc est de 128 octets, mais vous pouvez modifier ce nombre en utilisant un paramètre de taille de bloc différent dans la routine Reset ou Rewrite que vous avez utilisée lors de la dernière mise à jour du fichier.)

Évidemment, à moins d'avoir des connaissances spécifiques sur ce que contient un fichier, connaître le nombre de composantes ou de blocs n'est pas très utile. Pour aggraver les choses, FileSize ne fonctionnera pas sur un fichier texte car chaque ligne (la composante de base des informations textuelles) peut varier en longueur.

Vous pouvez contourner ce problème en déclarant qu'un fichier contenant du texte ASCII est un FILE OF BYTE ou un FILE OF CHAR. Cela rend chaque composante long de 1 octet ; par conséquent, le nombre de composantes correspond à la taille du fichier.

Vous pouvez utiliser la routine suivante pour obtenir la taille d'un fichier. Notez que la fonction renvoie -1 si le fichier est introuvable :

  1. Function SizeOfFile(FileName:String):LongInt;
  2. Var
  3.  Handle:File Of Byte;
  4.  Finding:Word;
  5. Begin
  6.  Assign(Handle,FileName);
  7.  {$I-}
  8.  Reset(Handle);
  9.  Finding:=IOResult;
  10.  {$I+}
  11.  If Finding = 0 Then Begin
  12.   SizeOFFile:=FileSize(Handle);
  13.   Close(Handle)
  14.  End
  15.   Else
  16.  SizeOfFile:=-1;
  17. End; 

Comprendre l'octet d'attribut

Une information que le DOS entrepose dans le répertoire mais n'affiche pas avec la commande DIR sur les anciennes versions de DOS est l'attribut du fichier. Les attributs sont des caractéristiques de fichier que vous pouvez utiliser pour affiner une recherche. Voici les catégories d'attributs de fichier :

Le DOS entrepose chacun de ces attributs sous la forme d'un seul bit dans l'octet d'attribut du fichier. La disposition de ces bits est illustrée dans le tableau suivant :

Bits Description
6 et 7 Non-utilisé
5 Archive
4 Répertoire
3 Étiquette de volume
2 Système
1 Caché
0 Lecture seulement

Les attributs ne sont pas mutuellement exclusifs. Par exemple, un fichier caché peut également être en lecture seulement. L'octet d'attribut inclut également l'état d'archivage du fichier. L'octet d'attribut inclut également l'état d'archivage du fichier. Le DOS définit le bit d'archive chaque fois qu'il modifie la date ou l'horodatage du fichier - en d'autres termes, chaque fois qu'un fichier est créé ou modifié.

La commande BACKUP de DOS utilise le bit d'archive pour identifier les changements dans le répertoire. Étant donné que BACKUP réinitialise toujours le bit à 0 après la copie du fichier sur le disque, les exécutions ultérieures de la commande BACKUP peuvent ignorer les fichiers n'ayant pas changé.

Le QuickPascal a prédéfini plusieurs constantes que vous pouvez utiliser lorsque vous accédez à un octet d'attribut :

Constante prédéfinie Valeur Bits affecté
ReadOnly $01 0
Hidden $02 1
SysFile $04 2
VolumeID $08 3
Directory $10 4
Archive $20 5
AnyFile $3F 0 à 5

N'oubliez pas que plusieurs bits peuvent être définis en même temps. Par conséquent, un fichier caché avec un état en lecture seulement peut être représenté comme :

  1. Hidden + ReadOnly

De même, tous les fichiers, à l'exception de ceux en lecture seulement, peuvent être représentés avec :

  1. AnyFile - ReadOnly

Accéder à une entrée du répertoire

Vous pouvez utiliser les procédures FindFirst et FindNext pour examiner un répertoire et identifier tous les fichiers correspondant à un masque de fichier et à un ensemble d'attributs spécifiques. Utilisez FindFirst pour localiser le premier fichier correspondant à ces caractéristiques ; puis utilisez FindNext pour localiser chaque correspondance suivante. La procédure FindFirst accepte trois paramètres :

Vous devez examiner la variable DosError pour surveiller la progression des procédures FindFirst et FindNext. Deux erreurs possibles peuvent découler de FindFirst : une erreur de 2 indique qu'aucun fichier correspondant n'a été trouvé et une erreur de 18 indique qu'il ne reste plus de fichiers.

De même, lorsque vous utilisez FindNext, une erreur de 18 signale qu'aucun fichier supplémentaire ne correspond à votre spécification d'origine. Voici la déclaration de SearchRec de l'unité DOS :

  1. Type
  2.  SearchRec=Record
  3.   Fill:Array[1..21]of Byte;
  4.   Attr:Byte;
  5.   Time:LongInt;
  6.   Size:LongInt;
  7.   Name:String[12];
  8.  End;

Vous pouvez librement examiner n'importe quel champ de cet enregistrement. Par exemple, Name contient le nom du fichier DOS, y compris la période et l'extension, mais pas l'unité de disque ou le chemin. Le champ Size est la taille du fichier en octets. Le champ Attr est l'octet d'attribut. Le champ Time est la date et l'heure du fichier. Le seul champ ne contenant pas d'informations utiles est le champ Fill de 21 octets ; il contient des données significatives uniquement pour le DOS lui-même.

L'exemple suivant montre un programme utilisant FindFirst et FindNext pour afficher les fichiers cachés et en lecture seulement dans le répertoire racine de votre disque dur :

  1. Program LitReper;
  2.  
  3. Uses DOS;
  4. Const
  5.  AttrMatch=Hidden+SysFile;
  6. Var
  7.  Result:SearchRec;
  8. BEGIN
  9.  FindFirst('C:\*.*',AnyFile,Result);
  10.  While DosError=0 do Begin
  11.   With Result Do If Attr and AttrMatch <> 0 Then WriteLn(Name:12,Size:7,' octets');
  12.   FindNext(Result);
  13.  End;
  14. END. 

Utilisation du champ Time

Le champ Time dans SearchRec contient la date et l'heure du fichier sous forme compressée. Vous pouvez convertir le champ en champs individuels (et plus intelligibles) avec la procédure UnpackTime. La procédure UnpackTime prend deux paramètres : le champ Time de SearchRec lui-même, et une variable déclarée comme l'enregistrement prédéclaré DateTime :

  1. Type
  2.  DateTime=Record
  3.    Year,Month,Day,Hour,Min,Sec:Word;
  4.  End; 

Si vous avez un fichier en tête, vous pouvez accéder directement à la date et à l'horodatage du fichier avec la procédure GetFTime. De même, vous pouvez modifier la date et l'heure d'un fichier avec SetFTime. La procédure suivante affiche la date et l'heure de n'importe quel fichier :

  1. Procedure ShowFileDate(FileName:String);
  2. Var
  3.  LocalFileVar:File;
  4.  Finding:Word;
  5.  TimeStamp:LongInt;
  6.  TimeRec:DateTime;
  7. Begin
  8.  Assign(LocalFileVar,FileName);
  9.  {$I-}
  10.  Reset(LocalFileVar);
  11.  Finding:=IOResult;
  12.  {$I+}
  13.  If Finding<>0 Then WriteLn('Fichier introuvable')
  14.   Else
  15.  Begin
  16.   GetFTime(LocalFileVar,TimeStamp);
  17.   UnpackTime(TimeStamp,TimeRec);
  18.   With TimeRec do WriteLn('Crée le ',Year,'-',Month,'-',Day);
  19.   Close(LocalFileVAr);
  20.  End;
  21. End;

Vous pouvez également modifier l'horodatage d'un fichier via le processus en deux étapes suivant :

Modification de l'octet d'attribut

Vous pouvez accéder et modifier directement l'octet d'attribut d'un fichier avec les procédures GetFAttr et SetFAttr. Les deux procédures prennent deux paramètres : un identificateur de fichier attribué mais non ouvert et un paramètre de la taille d'un mot contenant l'octet d'attribut. Le programme suivant indique si un fichier a été archivé ou non :

  1. Program BackedUp;
  2.  
  3. Uses DOS;
  4.  
  5. Var
  6.  FileName:String;
  7.  FileVar:File;
  8.  AttrByte:Word;
  9.  
  10. BEGIN
  11.  FileName:=ParamStr(1);
  12.  Assign(FileVar,FileName);
  13.  GetFAttr(FileVar,AttrByte);
  14.  If DosError<>0 Then WriteLn('Fichier introuvable') Else
  15.  If AttrByte and Archive=0 Then WriteLn(FileName,' est une copie de sauvegarde')
  16.                            Else WriteLn(FileName,' n''est pas une copie de sauvegarde');
  17.   
  18. END.

Renommer et effacer un fichier

Le QuickPascal fournit également deux routines spéciales de gestion de fichiers. Vous pouvez supprimer un fichier avec Erase et vous pouvez modifier le nom d'un fichier avec Rename. Les deux procédures fonctionnent avec un fichier ayant été attribué mais pas encore ouvert :

  1. Assign(PremierFichier,'SUPPRIME.DAT');
  2. Erase(PremierFichier);
  3. Assign(DeuxiemeFichier,'ORIGINAL.DAT');
  4. Assign(DeuxiemeFichier,'NOUVEAU.DAT');

N'oubliez pas que vous ne pourrez pas renommer ou effacer un fichier si le bit en lecture seulement dans son octet d'attribut est défini.

Développer le nom d'un fichier

Vous pouvez utiliser la fonction FExpand pour développer un nom de fichier en un nom de fichier complet en utilisant l'unité de disque et le répertoire actuels comme valeurs par défaut. Les exemples suivants supposent que le répertoire actuel est C:\QP\SOURCE :

FileName FExpand(FileName)
SAMPLE.PAS C:\QP\SOURCE\SAMPLE.PAS
SAMPLE.* C:\QP\SOURCE\SAMPLE.*
.\SAMPLE.EXT C:\QP\SOURCE\SAMPLE.EXT
..\SAMPLE.EXT C:\SOURCE\SAMPLE.EXT
..\*.EXT C:\SOURCE\.EXT
A:*.* A:\*.*
C:\UP\CODE\SAMPLE.EXT C:\UP\CODE\SAMPLE.EXT

Recherche d'un fichier dans plusieurs répertoires

Toutes les routines discutées jusqu'à présent supposent que le fichier auquel vous souhaitez accéder se trouve dans le répertoire actuel. Malheureusement, ce n'est pas toujours vrai. En fait, il est assez courant d'entreposer votre texte source, votre code exécutable et vos données dans des répertoires séparés.

Le DOS lui-même suit un tel processus. Par exemple, chaque fois que vous exécutez un programme, DOS recherche d'abord le programme dans le répertoire courant. Si le programme ne se trouve pas dans ce répertoire, le DOS recherche chaque répertoire dans la commande PATH de votre système.

De même, vous pouvez utiliser la fonction FSearch pour rechercher un fichier dans plusieurs répertoires. La fonction FSearch prend comme ses deux paramètres une chaîne de caractères contenant le nom du fichier que vous voulez trouver, et une chaîne de caractères contenant le nom du fichier que vous voulez trouver, et une chaîne de caractères contenant les répertoires cibles. Si FSearch trouve le fichier dans l'un des répertoires, il renvoie, il renvoie le nom de fichier complet ; sinon, il renvoie une chaîne de caractères nulle.

Si vous souhaitez rechercher le fichier dans les mêmes répertoires que dans la chaîne de caractères PATH de votre système, appelez GetEnv('PATH') et utilisez son résultat comme paramètre de répertoire lorsque vous appelez FSearch. Le code suivant montre comment vous pouvez rechercher FileName dans les répertoires du chemin de votre système :

  1. Program SPath;
  2.  
  3. Uses DOS;
  4.  
  5. Var
  6.  FileStr,FileName:String;
  7. BEGIN
  8.  FileName:=ParamStr(1);
  9.  FileStr:=FSearch(FileName,GetEnv('PATH'));
  10.  If Length(FileStr) = 0 Then WriteLn('Le fichier ',FileName,' est introuvable')
  11.   Else
  12.  Begin
  13.   { Assigne et ouvre le fichier } 
  14.  End;
  15. END.

Demander les composantes d'un nom de fichier

Enfin, vous pouvez utiliser la procédure FSplit de QuickPascal pour diviser un nom de fichier complet en chaînes de caractères de répertoire, de nom et d'extension distinctes. Supposons que vous déclariez les variables suivantes :

  1. Var               { Provient de l'unité DOS }
  2.  PathVar:PathStr; { Chemin complet de fichier STRING[79] }
  3.  DirVar:DirStr;   { Unité de disque et répertoire STRING[67] }
  4.  NameVar:NameStr; { Nom de fichier STRING[8] }
  5.  ExtVar:ExtStr;   { Extension de fichier STRING[4] }

Supposons ensuite que vous exécutiez ces instructions :

  1. PathVar:='C:\QP\SOURCE\PROGRAM1.PAS';
  2. FSplit(PathVar,DirVar,NameVar,ExtVar);

À ce stade, DirVar contiendra C:\QP\SOURCE, NameVar contiendra PROGRAM1 et ExtVar contiendra .PAS. Vous pouvez utiliser FSplit chaque fois que vous devez créer un nom de fichier basé sur un autre nom de fichier. Par exemple, le code suivant demande à l'utilisateur le nom d'un fichier ; TEMP et .DAT seront utilisés comme valeurs par défaut pour le nom et l'extension :

  1. WriteLn('Nom du programme (TEMP.DAT) :');
  2. ReadLn(PathVar);
  3. FSplit(PathVar,DirVar,NameVar,ExtVar);
  4. If NameVar=''Then NameVar:='TEMP';
  5. If ExtVar=''Then ExtVar:='.DAT';
  6. PathVar:=DirVar+NameVar+ExtVar;
  7. WriteLn('Nous allons utiliser ce fichier : ',PathVar);


Dernière mise à jour : Mercredi, le 15 décembre 2021