Programme de base
Bon continuons, créons une petite interface basique permettant de lire / écrire dans le fichier. J'aimerais donc que vous créiez quelque chose qui ressemble à ça :
Alors, pour ce qui est des noms des contrôles je pense que vous êtes grands maintenant, ils ne vont plus poser problème.
Mes deux textBox (TXT_LECTURE, TXT_ECRITURE) ont la propriété
Multiline à true, celle du haut a
ReadOnly à true.
Des boutons (BT_LIRE, BT_CLEARLIRE, BT_ECRIRE, BT_CLEARECRIRE et BT_CLEAR tout en bas) et une checkbox (CHK_DEBUT).
Voici pour ce qui est du design. Pour le code je vais vous montrer le mien et on va détailler le tout. Attention, je reprends pas mal de concepts abordés avant tout en intégrant des nouveaux, accrochez-vous !
Code : VB.NET 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 | Imports System.IO
Public Class Form1
Dim MonFichier As IO.FileStream
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Création d'un objet de type FileStream
MonFichier = New IO.FileStream("Zero.txt", IO.FileMode.OpenOrCreate)
End Sub
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
'Libère la mémoire
MonFichier.Dispose()
End Sub
#Region "Gestion des boutons"
Private Sub BT_LIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_LIRE.Click
If MonFichier.CanRead() Then
'Crée un tableau de Byte
Dim Contenu(1024) As Byte
'Lit 1024 bytes et les entre dans le tableau
MonFichier.Position = 0
MonFichier.Read(Contenu, 0, 1024)
'L'affiche
Me.TXT_LECTURE.Text = ""
For Each Lettre As Byte In Contenu
Me.TXT_LECTURE.Text += Chr(Lettre)
Next
End If
End Sub
Private Sub BT_ECRIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ECRIRE.Click
If MonFichier.CanWrite Then
Dim Contenu(1024) As Byte
Dim Compteur As Integer = 0
'Parcours la txtbox
For Each Lettre As Char In Me.TXT_ECRITURE.Text.ToCharArray
'Convertit une lettre en sa valeur ascii et l'entre dans compteur
Contenu(Compteur) = Asc(Lettre)
Compteur += 1
Next
'Ecrit dans le fichier
If Me.CHK_DEBUT.Checked Then
MonFichier.Position = 0
End If
MonFichier.Write(Contenu, 0, Compteur)
End If
End Sub
Private Sub BT_CLEARLIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_CLEARLIRE.Click
Me.TXT_LECTURE.Text = ""
End Sub
Private Sub BT_CLEARECRIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_CLEARECRIRE.Click
Me.TXT_ECRITURE.Text = ""
End Sub
Private Sub BT_CLEAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_CLEAR.Click
'Je ferme le fichier actuel
MonFichier.Dispose()
'Je le réouvre en écrasant ses données
MonFichier = New IO.FileStream("Zero.txt", FileMode.Create)
End Sub
#End Region
End Class
|
Explications
Bien bien, vous voilà avec des codes de plus en plus conséquents. Prenons le problème par étapes. Tout d'abord nous avons les boutons de vidage des TextBox qui ne sont pas sorciers, une simple instruction pour remplacer leur contenu.
Alors commençons à étudier le voyage de notre fichier. Je déclare en variable
Globale le fichier, de façon à ce qu'il soit accessible dans toutes les fonctions. Lors du
load j'ouvre mon fichier comme nous l'avons vu dans la partie d'avant.
Et, chose importante, j'ai réagi à l'évènement
FormClosing (traduisible par
fenêtre en cours de fermeture, à ne pas confondre avec
FormClosed :
fenêtre fermée). Lorsque cet évènement se produit, je
Dispose() le fichier.
La fonction
Dispose permet de vider les ressources mémoire que prenait le fichier. En résumé, cela le
ferme.
Donc, fichier ouvert et chargé à l'ouverture du programme, fermé à la fermeture. Parfait !
Travaillons.
Nous arrivons aux deux boutons
Lire et
Ecrire.
L'écriture
Bien, commençons par l'écriture (on ne va pas lire avant d'avoir écrit

).
Code : VB.NET 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | Private Sub BT_ECRIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ECRIRE.Click
If MonFichier.CanWrite Then
Dim Contenu(1024) As Byte
Dim Compteur As Integer = 0
'Parcours la txtbox
For Each Lettre As Char In Me.TXT_ECRITURE.Text.ToCharArray
'Convertit une lettre en sa valeur ascii et l'entre dans compteur
Contenu(Compteur) = Asc(Lettre)
Compteur += 1
Next
'Ecrit dans le fichier
If Me.CHK_DEBUT.Checked Then
MonFichier.Position = 0
End If
MonFichier.Write(Contenu, 0, Compteur)
End If
End Sub
|
- Alors, première instruction, déjà une nouvelle chose : MonFichier.CanWrite
C'est une propriété de l'objet. Elle nous informe sur la possibilité d'écriture dans notre fichier. Si c'est true, c'est parfait, on continue (ces petites vérification sont souvent inutiles mais il ne coute rien de les faire et elles peuvent parfois éviter des erreurs, pensez aussi à gérer les cas d'erreur aussi).
- Je crée ensuite un tableau de Byte, 1025 cases (je prévois grand !). Sachant que chaque byte (je n'ai pas expliqué mais un byte est aussi de 8 bits dans notre cas soit ... Un octet soit ... Un caractère !) peut contenir un caractère, nous avons une possibilité d'écriture de 1025 caractères.
- Un petit compteur, il va nous servir après.
- Puis un For Each grâce auquel je parcours tous les caractères contenus dans ma textbox : Me.TXT_ECRITURE.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.
- Je rentre chaque lettre dans mon tableau de Byte. Mais attention, les Bytes 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 (j'ai expliqué au début de ce chapitre =), transformation ASCII => 8 Bits grâce à la fonction Asc()) de façon a pouvoir l'inscrire dans le Byte.
- Viens ensuite l'incrémentation du compteur pour pouvoir écrire chaque caractère dans une case différente.
- Ensuite, si la case est cochée on déplace le curseur au début du fichier. Je vais parler des curseurs juste après.
- Puis on écrit le contenu de notre tableau en indiquant combien de Bytes écrire (avec Compteur)
Eh bien, je sais qu'il y a pas mal de notions d'un coup. Reprenez-le tout lentement en essayant de comprendre chaque ligne individuellement.
Les curseurs
Petit aparté sur les curseurs.
Alors je viens de parler de curseur dans notre fichier mais qu'est-ce que cela ?
Non, n'y pensez même pas, ce n'est pas un curseur de souris qui bouge dans notre fichier mais c'est comparable :
Un curseur doit être représenté mentalement. C'est 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 tout à la fin. Si on ne lit que la moitié, à la moitié.
Quelques schémas :

Ici le charriot est au début du fichier, une demande de lecture a été effectué, il lit ce caractère puis se déplace au suivant.

Ainsi de suite.

Arrivé à la fin du fichier, il s'arrête et se met en attente d'une commande lui demandant de se déplacer.
Bref, tout ça pour dire que ce petit charriot ne bouge pas tout seul si on ne lui en donne pas l'ordre. Si je lis mon fichier, le curseur va se retrouver à la fin, lors d'une écriture sans bouger le curseur, l'écriture s'effectuera au début.
Pareil pour la lecture, si le curseur est à la fin et qu'on demande une lecture, il n'y aura rien à lire. Donc la propriété
Position permet de spécifier l'index de ce curseur. Ici je le replace au début à chaque fois (0).
Mais attention, si je reprends l'écriture 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 purement et simplement le remplacer.
Faites bien attention donc et représentez-vous mentalement le trajet du curseur dans votre fichier pendant votre programme.
La lecture
Reprenons l'évènement qui s'effectue lors du clic sur le bouton lire :
Code : VB.NET 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | Private Sub BT_LIRE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_LIRE.Click
If MonFichier.CanRead() Then
'Crée un tableau de Byte
Dim Contenu(1024) As Byte
'Lit 1024 bytes et les entre dans le tableau
MonFichier.Position = 0
MonFichier.Read(Contenu, 0, 1024)
'L'affiche
Me.TXT_LECTURE.Text = ""
For Each Lettre As Byte In Contenu
Me.TXT_LECTURE.Text += Chr(Lettre)
Next
End If
End Sub
|
- Première ligne, le même principe que pour l'écriture, on effectue un petite vérification pour savoir si l'on peut effectuer notre lecture.
- On crée un tableau de Byte (comme l'écriture : 1025 cases)
- On place le curseur à la position 0 (début de mon fichier).
- On lit sur 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 Bytes déclaré juste avant.
- Puis un traditionnel For Each afin de parcourir toutes les cases de ce tableau de Bytes.
- On effectue une conversion Numerique => Caractère (soit Byte => ASCII grâce à la fonction Chr()) sinon vous ne liriez que des chiffres dans votre résultat ! On place le tous dans la textBox (grâce à += on ajoute les caractères à la suite).
Eh bien voilà, ce qui nous donne en résultat de tests :

Une demande d'écriture dans notre fichier.
Résultat dans le fichier : "Bonjour les Zéros !"

Une demande de lecture, le fichier n'a pas changé, son contenu est toujours le même.

L'écriture d'une seconde ligne, le contenu du fichier est devenu :
"Bonjour les Zéros !
Une seconde ligne !"
J'en profite pour vous dire que les caractères permettant de matérialiser le retour à la ligne sont contenus dans la chaîne que vous récupérez de votre textBox, donc lorsqu'on demande une écriture de tout son contenu, le caractère est également écrit dans le fichier, le retour à la ligne s'effectue donc également dans le fichier sans manipulations supplémentaires.
Déjà une bonne chose de faite, ne partez pas ! On va apprendre de nouvelles fonctions et manipulations sur nos nouveaux amis les fichiers dans la partie suivante.