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