PROGRAMMATION ET ENSEIGNEMENT
Contenu du cours 8 Notions de Fichiers Notes de cours (site ftp UQTR) Introduction Namespace IO Création d’un fichier texte Manipulation d’un fichier texte Manipulation d’un fichier Binaire Notes de cours (site ftp UQTR) https://openclassrooms.com/courses/apprenez-a-programmer-en-vb-net/les-fichiers-partie-1-2 https://docs.microsoft.com/fr-fr/dotnet/visual-basic/developing-apps/programming/drives-directories-files/how-to-read-from-binary-files
Introduction Les fichiers peuvent être imaginés comme une suite d’octets stockés sur disque. Il est alors possible d’enregistrer des données, ensuite de les récupérer (lire), et ce, même si le programme s'est fermé entre temps (ce qui n'était pas possible avec les variables). Il sera donc possible de créer différents types de fichiers: de configuration, sauvegarder des textes, des images, des chiffriers, des données binaires (ex: copie de matrices etc).
Introduction Sur le disque dure de votre ordinateur (ou tout autres dispositifs de stockage: ex. SSD), vous pouvez parcourir suivant un système d'arborescence : le disque dur contient des dossiers, ces dossiers contiennent des fichiers (récursif : les disques durs peuvent contenir des fichiers et les dossiers d'autres dossiers). Le disque dur contient toutes vos données ; le dossier permet de gérer, organiser et hiérarchiser votre disque dur Les fichiers contiennent des données comme telles essentiellement sous forme binaire.
Introduction Ces données sous forme binaire sont codés selon le type de fichier sauvegardé. Les fichiers textes contiennent des caractères codés chacun sur un (Code ASCII) ou deux (code Unicode 16) octets La norme ASCII est la norme de codage de caractères standardisée. Chaque caractère est un groupement de 8 bits dans la une table ASCII. Exemple : la suite de bits (01100011) correspond au caractère "c"
Introduction Sachant maintenant qu’un fichier texte est une suite de caractères (octets) il est alors possible de comprendre la taille de vos fichiers. Windows note les tailles en ko (kilooctets) pour les petits fichiers, jusqu'aux Mo (mégaoctets), voire aux Go (gigaoctets) : 1 ko = 1024 octets, 1 Mo = 1 048 576 octets et 1 Go = 1 073 741 824 octets.
Namespace IO Microsoft, au travers de son framework (qui est une bibliothèque contenant des centaines de classes, fonctions, objets) offre les outils nécessaires pour manipuler les fichiers
Namespace IO Ce namespace (un namespace représente un dossier contenant des classes et fonctions spécifiques) est le namespace IO. Ce namespace IO (Entrée/Sortie) contient des fonctions et objets pour manipuler les fichiers, mais aussi des fonctionnalités permettant de gérer les communications inter-processus, la communication série et la compression Ce namespace comprend la classe FileStream qui permet de créer un objet de type FileStream et de le manipuler. La classe File ne permet pas de créer un objet, mais seulement de manipuler une instance d’un objet FileStream
Namespace IO Il existe aussi une classe Directory permettant de manipuler les répertoires. Pour pouvoir manipuler un objet FileStream, il faut d’abord créer (une instance, instancier) un objet et ensuite le manipuler Pour créer un objet nous utilisons le mot réservé: New
Création d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Avant de créer un fichier il faut tout d’abord déclarée une variable permettant d’identifier le fichier Dim MonFichier As IO.FileStream La variable MonFichier est de type FileStream Pourquoi le IO, sachant que nous utilisons le namespace IO, il faut donc faire IO. avant de pouvoir accéder aux membres de ce namespace
Création d’un fichier En insérant l’énoncé: Imports System.IO tout en haut de votre programme, avant la déclaration du module. Cette ligne va permettre d’omettre le IO. avant les fonctions utilisant ce namespace L’énoncé = New IO.FileStream permet d'assigner (initialiser) une valeur à notre variable dès sa déclaration Le mot-clé New, permets de créer un nouvel objet de type FileStream.
Création d’un fichier texte Lorsque nous instancions (créons) un objet, la classe utilisée pour déclarer l'objet fait appel à son constructeur. Le mot "constructeur" est spécifique à la POO. Un constructeur est une méthode appelée pour initialiser certaines propriétés de cet objet, donc parfois ce constructeur nécessite des arguments. Le constructeur de FileStream accepte plusieurs combinaisons d'arguments possibles. Par exemple : le Path du fichier (en String) avec lequel nous allons travailler, et un argument qui nous permet de déterminer comment ouvrir ou créer le fichier (de type IO.FileMode)(mode d’ouverture du fichier)
Création d’un fichier texte Le Path, signifie le chemin d’accès au fichier et peut être de deux types : Absolu : le chemin n'a pas de référence, mais n'est pas exportable (ex : C:\Windows\System32… est un chemin absolu) Relatif : le chemin prend comme référence le dossier d'exécution de notre programme (ex : FichierEX19.txt sera dans le même dossier que le programme) Il est donc préférable d'utiliser des chemins relatifs dans nos programmes, à moins que vous ne soyez certains de l'emplacement des fichiers que vous voulez manipuler.
Création d’un fichier texte Le FileMode Dans notre exemple, le Path est relatif, le fichier FichierEX19.txt sera créé s'il n'existe pas, sinon il sera ouvert. En inscrivant l'argument IO.FileMode.OpenOrCreate.
Création d’un fichier texte FileMode: différents mode d’ouverture
Création d’un fichier texte L’option FileMode.OpenOrCreate (aussi remplaçable par le chiffre 4), rend notre programme plus flexible En utilisant l'argument FileMode.CreateNew, le premier lancement du programme se déroulera bien, mais lors du second lancement une erreur se produira parce que le fichier existe déjà. Cette instruction permet d’ouvrir le fichier FichierEX19.txt (création s'il n'existe pas) et ce fichier peut alors être référencé par la variable MonFichier
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Composantes de l’application: Les boutons de vidage des textboxEntree et TextBoxSortie, une simple instruction pour remplacer leur contenu par un " " Déclaration globale de la variable référant au fichier MonFichier, de façon à ce qu'il soit accessible dans toutes les fonctions. Lors du Load(), le fichier est ouvert Lors de l'événement FormClosing (traduisible par « fenêtre en cours de fermeture », nous disposons du fichier par l’appel à la méthode Dispose() La fonction Dispose() permet de vider les ressources mémoire que prenait le fichier. En résumé, cela le ferme. Le fichier est ouvert et chargé à l'ouverture du programme et fermé à la fermeture. Deux boutons Lire et Ecrire, donc Ecrire dans un fichier et Lire dans un fichier (FichierEX19.txt)
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Écriture (voir Sub BEcrireSortie_Click()) Instruction: MonFichier.CanWrite est une propriété de l'objet. Elle nous informe sur la possibilité d'écriture dans notre fichier. (TRUE veut dire qu’il est possible d’écrire) Un tableau de Byte, 1025 octets, est ensuite déclaré, pour le stockage de caractères Un compteur est aussi déclaré, il sert d’indice dans un vecteur de caractères Le For Each permet de parcourir tous les caractères contenus dans le textboxTextBoxSortie.Text.ToCharArray. La fonction ToCharArray permet, comme son nom anglais l'indique, de convertir en tableau de Char. Pour chaque caractère donc, ce caractère est entré dans la variable Lettre Chaque lettre est insérée dans un tableau de Byte. Mais sachant que les Byte et les Char ne sont pas homogènes, il faut passer par une fonction qui va récupérer la valeur binaire de notre caractère (transformation ASCII => 8 Bits grâce à la fonction Asc()) de façon à pouvoir l'inscrire dans le Byte Le compteur est incrémenté pour pouvoir écrire chaque caractère dans un emplacement du vecteur différent Si la case est cochée on déplace le curseur au début du fichier Le contenu de notre tableau en indiquant combien de Byte (avec compteur) à écrire dans le fichier
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Notions de curseurs de fichier Un curseur peut être représenté par un petit charriot qui avance dans notre fichier. Lorsqu'on lui demande de lire ou d'écrire, ce petit charriot va se déplacer de caractère en caractère et l'écrire (ou le lire). Donc lorsqu'on lit un fichier entier, le curseur se retrouve à la fin. Si on ne lit que la moitié, le curseur sera à la moitié.
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Notions de curseurs de fichier
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Notions de curseurs de fichier Lors d’une lecture complète du fichier, le curseur va se retrouver à la fin, lors d'une écriture sans bouger au préalable le curseur, l'écriture s'effectuera au début. Si le curseur est déjà à la fin et qu'on demande une lecture, il n'y aura rien à lire. La propriété Position permet de spécifier l'index de ce curseur. Dans l’exemple la position est fixée au début à chaque fois (0). Attention, si l'écriture reprend au début, le curseur ne s'occupe pas de ce qu'il y a avant, lorsqu'il va rencontrer un caractère déjà écrit dans le fichier il va l’écraser.
Manipulation d’un fichier texte (Voir: VBNET-EX19-FICHIER-TEXTE) Lecture: Sub BLireEntree_Click() Vérifier la possibilité de lecture. Création d’un tableau de Byte (comme l'écriture : 1025 emplacements). Le curseur est mis à la position 0 (début du fichier). Lecture de 1024 bytes (si le curseur rencontre la fin du fichier, la lecture s'arrête), et on place ce qui a été lu dans le tableau de Byte déclaré avant. Puis le For Each parcourt toutes les cases de ce tableau de Byte. Une conversion Numerique => Caractère (soit Byte => ASCII grâce à la fonction Chr()), sinon que des chiffres seraient affichés (code ascii) Le texte lu est copié dans le textbox (grâce à += on ajoute les caractères à la suite)
Manipulation d’un fichier binaire (Voir: VBNET-EX20-FICHIER-BINAIRE) Ecriture: Sub Button2_Click() Création d’un objet BinaryWriter Écriture de chaque objet single (temperatures(i)) dans le fichier FichierEX-20.bin
Manipulation d’un fichier binaire (Voir: VBNET-EX20-FICHIER-BINAIRE) Lecture: Sub Button3_Click() Création d’un objet BinaryReader Lecture de chaque objet single dans le fichier FichierEX-20.bin et affichage dans le textBoxLire La fin de fichier est détecté avec la condition: fs.Position < fs.Length