Les fichiers sous Visual Basic

Transcription

Les fichiers sous Visual Basic
Université de Valenciennes - La Programmation en Visual Basic par MARLIN B.
Les fichiers sous Visual Basic
I - Petit rappel sur les fichiers
Sous DOS et Win 3.xx les fichiers sont de la forme 8.3 soit 8 caractères pour le nom à proprement parler puis un " . " pour une extension facultative pouvant aller jusqu'à 3 caractères.
Sous win95 / 98 les noms des fichiers peuvent aller jusqu'à 255 caractères (chemin compris), la
règle de l’extension reste inchangée. Avec VB, pour ouvrir un fichier, il faut lui allouer un numéro
de canal valide, cette opération peut être gérée par le système grâce à la commande Freefile définie plus loin. Le travail sur fichier, quel qu’il soit passe par les 3 phases : Ouverture (Open), traitement, fermeture (Close). Cette dernière peut être faite automatiquement par le système lors de
la commande End mais il vaut mieux, par soucis de rigueur toujours décharger un fichier après
traitement car aucune action (destruction, réouverture …) n’est possible sur un fichier chargé ou
un canal encore utilisé. Il existe dans Visual Basic 3 types d’accès au fichiers. Nous allons les
étudier dans cet ordre : Accès binaire, Accès aléatoire et Accès séquentiel.
II - Accès binaire
Les fichiers en accès binaire ne sont en fait que de " vulgaires " suites d’octets. Le seul point important est que le caractère nul de code ASCII 0 (char(0)) marque la fin d’un fichier accès binaire.
L’ouverture d’un fichier en accès binaire :
dim canal as byte
canal = Freefile ‘canal reçoit un numéro d’enregistrement valide automatiquement
Open " nom_et_chemin_du_fichier " For Binary as canal
Les instruction Get et Put sont utilisées pour lire / écrire des données. L’emplacement spécifié
marque l’emplacement du premier octet de la séquence.
Exemple : pour accéder aux 64 octets situés après le 8ème
Dim reponse as String * 32 ‘Déclaration d’une variable chaîne de 32 caractères de longueur
Get canal, 8, reponse ‘Acquisition
Il est important de noter qu'après une lecture le curseur de lecture est positionné après le dernier
caractère lu. Pour se positionner à un emplacement précis dans le fichier, on peut employer la
commande Seek. Pour changer, nous allons employer la commande Input :
Dim reponse as String*32
Seek canal, 8
Reponse = input (32, canal)
Bien sûr, ce mode d'accès ne transmet que des caractères, c'est ensuite à vous a donner du sens
à ces données.
III - Accès aléatoire
Un fichier en accès aléatoire (appelé aussi accès direct ) est composé d’enregistrements ayant
tous la même structure (même suite de même type d’une même longueur). Pour cela, il faut définir un Type personnalisé de la façon suivante (de préférence à Général à Déclarations) :
Private type un_perso
Nom as string * 20
Prénom as String * 15
Age as Integer
Adresse as string * 80
End type
MB Page 1
Université de Valenciennes - La Programmation en Visual Basic par MARLIN B.
On pourra alors déclarer des variables de type un_perso de la sorte :
Dim perso as un_perso
Dim canal as byte
Canal = Freefile
Open "c:\mesprogs\classe.dat" For Random as canal len = len(perso) 'Ouvre le fichier c:
\mesprogs\classe.dat en accès aléatoire avec une longueur d'enregistrement égale à la longueur
de la variable
Les Action de lecture/écriture se font là aussi grâce à Get et Put :
Get canal, 5, élève1 'Lit le 5e enregistrement et la place dans élève 1
Put canal, 1, élève1 'Ecrit le contenu de élève 1 en première position de "classe.dat"
On peut noter que le premier élément d'un fichier porte l'indice 1 et non pas 0. Et en finissant on
ferme grâce à la commande :
Close canal 'ferme canal
Ou encore Close 'ferme tous les fichiers ouverts. A utiliser avec parcimonie car elle pourrait fermer un fichier que l'on souhaite garder ouvert. Utile dans le Unload du projet pour s'assurer que
tous les fichiers sont bien fermés à la sortie du programme
IV - Accès séquentiel
Un fichier en accès séquentiel permet d'accéder à des fichers dont la structure est composée de
lignes de texte, toutes finies par le code ASCII retour chariot + saut de ligne soit char(13) + char
(10) en VB.
Soit vbCrlf (constante existante dans VB pour VB Carriage return,
line feed) dans tout ce qui va suivre. Il y a 3 modes d'accès séquentiel :
- Input : lecture seule
- Output : accès en écriture, un tel accès détruit le contenu précédant.
- Append : accès en écriture après le contenu actuel.
Nous allons faire un petit visualiseur de fichier .ini . Pour cela, on va lire lignes par lignes le fichier
et placer le contenu dans un textbox nommé textini. On lit une ligne grâce à la commande Line
input. On utilise aussi la commande EOF pour savoir si l'on est arrivé à la fin du fichier, une lecture au delà n'étant pas possible et provoquerait une erreur.
Dim nextline as string
dim canal as byte
Canal = Freefile
Open 'fichier.ini' For Input as #canal
Do until EOF(canal)
Line Input #canal, nextline
textini.text = textini.text + nextline + vbcrlf
Loop
Close canal
On pourra alors récupérer le contenu de la ligne, connaissant la structure d'un fichier ini :
[Rubrique]
mot_clef=valeur
Grâce à une fonction utilisateur :
Function lectureINI(rubr As String, motclef As String) As String
Dim pos1, pos2, pos3
canal = FreeFile
MB Page 2
Université de Valenciennes - La Programmation en Visual Basic par MARLIN B.
Open "fichier.ini" For Input As canal
Do Until EOF(canal)
Line Input #canal, nextline
inivar = inivar + nextline + vbCRLF
Loop
Close canal
lectureINI = vbNullstring
rubr = "[" + rubr + "]"
pos1 = InStr(1, inivar, rubr) + Len(rubr) + 2
motclef = motclef + "="
pos2 = InStr(pos1, inivar, motclef) + Len(motclef) 'position du début de la réponse
pos3 = InStr(pos2, inivar, Chr(13)) 'position de la fin de la réponse
lectureINI = Mid(inivar, pos2, pos3 - pos2)
End Function
Qui s'utilise de la façon suivante :
valeur = lectureNI("rubrique", "Motclef")
On pourra ainsi écrire et modifier un fichier ini :
Function (ou sub) EcritureINI(rubr As String, motclef As String, param As string)
dim canal as byte
canal8 = FreeFile
Open "fichier.ini" For Input As canal8
Do Until EOF(canal8)
Line Input #canal8, nextline
inivar = inivar + nextline + vbCRLF
Loop
Close canal
rubr = "[" + rubr + "]"
pos1 = InStr(1, inivar, rubr) + Len(rubr) + 2
motclef= motclef + "="
pos2 = InStr(pos1, inivar, motclef) + Len( motclef)
pos3 = InStr(pos2, inivar, Chr(13))
inivar = Left(inivar, pos2 - 1) + param + Mid(inivar, pos3)
Close
canal = FreeFile
Open "fichier.ini" For Output As canal
Print #canal, inivar
Close canal
End Function
Le début reprend lectureINI. Celle là s'utilise de la façon suivante :
Newini = EcritureINI
("rubrique", "mot_clef", nouvelle valeur de typer chaine, ou str(valeur non chaine))
V - Petit complément sur les fichiers sous VB
Voici diverses commandes qui vous seront très utiles pour peu que vous vouliez travailler avec
des fichiers :
- Filelen("nom et chemin du fichier cible") renvoie la taille du fichier spécifié.
- Filecopy source, cible copie le fichier source en cible.
- Kill ("nom et chemin du fichier cible") détruit le fichier cible qui doit être fermé, faites précéder de
close)
Ajouter shared dans la commande open permet de partager l'accès au fichier avec d'autres procédures de l'application. Peut être utile dans certains cas.
MB Page 3