Manipulation des fichiers dans le langage VB Chapitre 4 Manipulation des fichiers dans le langage VB Cours VB 2007/2008
Plan Fichiers en VB Types de fichiers en VB: séquentiels (Textes) à accès direct Random Binary Différentes opérations de gestion de répertoires et de fichiers en VB Cours VB – ISG 2007/2008
Introduction Un fichier est un ensemble de données qui sert soit: à la lecture : pour rentrer des informations dans un programme; à l’écriture : pour sauvegarder les résultats obtenus. Les fichiers sont caractérisés par deux notions : le mode d’organisation : comment sont organisées les données dans le fichier (par enregistrement, en bloc…) le mode d’accès : comment sont accédées les données dans le fichier (séquentiel, direct). Ces caractéristiques influencent l’utilisation des fichiers selon les langages de programmation. La combinaison de ces derniers offre différents types de fichiers. L’utilisation d’un fichier se fait toujours selon les phases suivantes : Ouverture du fichier Traitement Fermeture du fichier Binaire: pas d'organisation et la lecture se fait par octets Texte: caractérisé par des lignes et des retours chariot Cours VB – ISG 2007/2008
I. Les fichiers en VB VB gère : Les fichiers séquentiels Les fichiers à accès direct Les noms de fichiers obéissent aux règles du DOS : La longueur est limitée à 8 caractères maximum et une extension de 3 caractères au maximum. L’instruction Open est employée pour ouvrir un fichier, sa syntaxe varie suivant le type de fichier et le mode d’accès choisi. VB numérote les fichiers ouverts. Exemple : Open nom_fichier For Input As #1 affecte le n° 1 au fichier. C’est par ce numéro que l’on désigne le fichier dans les instructions. A la fin du travail il faut fermer le fichier avec l’instruction Close. Cours VB – ISG 2007/2008
I.1 Syntaxe de L'instruction Open OPEN FileName FOR AccessMode [Lock] AS [#] FileNumber [LEN=RecLength] OPEN “c:\fichier.txt” FOR Random AS # 1 LEN= len(Etudiant) OPEN “c:\fichier.txt” FOR Random Lock Read AS # 1 LEN= len(Etudiant) OPEN “c:\fichier.txt” FOR Output AS #1 OPEN “c:\fichier.txt” FOR Binary AS #1 OPEN “c:\fichier.txt” FOR Input AS #1 OPEN “c:\fichier.txt” FOR Append AS #1 FileName Nom du fichier avec son chemin complet For Append Mode d'accès séquentiel qui permet aux données d'être ajoutées à la fin du fichier For Input Mode d'accès séquentiel qui permet au fichier d'être lu uniquement For Output Mode d'accès séquentiel qui permet au fichier d'être écrit(écrase le fichier s'il existe déjà) For Binary Mode d'accès direct qui permet aux données d'être lues ou écrites octet par octet For Random Mode d'accès direct qui permet aux données d'être lues ou écrites dans des enregistrements déterminés par l'argument RecLength Séquentiel ou la taille de la mémoire tampon pour les fichiers d'accès séquentiel???? Direct Lock Utile pour les situations multi-utilisateurs. Les options sont : Shared, Lock Read, Lock Write et Lock Read Write FileNumber Numéro de fichier entre 1 et 511 RecLength La longueur de l'enregistrement pour les fichiers d'accès direct Cours VB – ISG 2007/2008
I.2 Syntaxe de L'instruction Close Lorsqu’on finit de travailler avec un fichier il faut le fermer avec l’instruction Close. Syntaxe: Close [#] FileNumber Exemple: Close #1 Close FileNumber Cours VB – ISG 2007/2008
I.3 Fonctions sur les fichiers La fonction FreeFile retourne un numéro disponible pour l’ouverture d’un fichier. Syntaxe: num = FreeFile La fonction LOF (Length Of File) renvoie la taille en octets d'un fichier ouvert. C'est une instruction très pratique pour lire un fichier sans connaître sa taille au départ. Syntaxe: LOF([#] NumFich) La fonction EOF (End Of File) renvoie true si c'est la fin du fichier et false sinon Syntaxe: EOF(NumFich) Cours VB – ISG 2007/2008
II. Accès séquentiels Ce type d’accès est approprié pour les fichiers textes (blocs continus) qui contiennent des caractères alphanumériques. Les fichiers séquentiels sont ouverts: soit en Input : en lecture seule ; soit en Output : en écriture à partir du début, le fichier est alors réinitialisé, il perd son contenu s’il en avait ; soit encore en Append : on rajoute des informations à partir de la fin sans perdre ce qu’il contient déjà. Dans les fichiers textes chaque ligne est limitée par les symboles CR-LF (Retour Chariot et Fin de Ligne). A chaque accès (lecture ou écriture), on traite le fichier: caractère par caractère ou ligne par ligne. Remarque si le fichier est inexistant vous aurez une erreur indiquant que le fichier est inexistant. Cours VB – ISG 2007/2008
II.1 Lecture d'un fichier séquentiel Le processus de base pour lire un fichier texte est le suivant: 1- Ouvrir le fichier en utilisant l'instruction Open nom_fichier For Input As #NumFich 2- Lire les données provenant du fichier en utilisant les instructions: 3- Fermer le fichier en utilisant l'instruction Close L=Input(n, #NumFich) Affect n caractère(s) dans L Input #num, A, B, C A, B, C (car on suppose qu’on a trois colonnes par ligne) Lit une ligne complète de données dans une série de variables, chaque variable étant séparée par une virgule Line Input #num, L Lit une ligne complète de données délimitée par un retour chariot et un retour à la ligne (CR-LF) et affecte le résultat à L Cours VB – ISG 2007/2008
Exemple 1: Lecture d'un fichier séquentiel Exercice: Ecrire un programme qui permet de lire soit ligne par ligne ou tout le fichier nommé "Fich_1.txt" stocké dans le lecteur E puis placez son contenu dans une zone texte d'une feuille. Solution: Propriétés du TextBox Name = TXTfile MultiLigne = True 'affichage sur plusieurs lignes ScrollBar = Both 'affichage des ascenseurs vertical et horizontal Propriétés du CommandButton 1 Name = cmdLireTout Caption = Lire tout le fichier Propriétés du CommandButton 2 Name = cmdLireLigne Caption = Lire ligne par ligne le fichier Cours VB – ISG 2007/2008
Exemple 1: Lecture d'un fichier séquentiel L'événement Click sur le bouton de commande nommé CMDLireTout de la feuille exécutera le code suivant: Private Sub CMDLireTout_Click() ' Détermine un numéro de fichier valide NumFich = FreeFile ' Ouverture du fichier "Fich_1.txt" sous E: en lecture Open "E:\Fich_1.txt" For Input As #NumFich ' Affectation dans la propriété Text du contrôle TXTfile de tout le contenu du fichier TXTfile.Text = Input( LOF(NumFich), #1) Close #NumFich ‘Fermeture du fichier End Sub Cours VB – ISG 2007/2008
Exemple 1: Lecture d'un fichier séquentiel L'événement Click sur le bouton de commande nommé CMDLireLigne de la feuille exécutera le code suivant: Private Sub CMDLireLigne_Click() Dim L As String txtFile.Text = "" ' Détermine un numéro de fichier valide num = FreeFile ' Ouverture du fichier "Fich_1.txt" sous e: en lecture Open "e:\Fich_1.txt" For Input As #num ' Affectation de tout le contenu du fichier dans la propriété Text du contrôle Txtfile Do While Not EOF(num) Line Input #num, L Txtfile.Text = Txtfile.Text &chr(13)&chr(10)& L Loop Close #1 ' Fermeture du fichier End Sub Cours VB – ISG 2007/2008
II.2 Écriture dans un fichier séquentiel Le processus de base pour écrire dans un fichier texte est le suivant: 1- Ouvrir le fichier avec l'instruction Open en utilisant le paramètre Output ou Append 2- Ecrire les données dans le fichier en utilisant les instructions: Print #num, L Ecrit une série de valeurs existant dans la chaîne de caractère L. Si on appelle print plusieurs fois alors: si l'instruction se termine par une virgule les données sont séparées par un caractère de tabulation; si l'instruction se termine par un point-virgule les données ne sont pas séparées; sinon (aucune ponctuation) les données sont séparées par un CR-LF. Cours VB – ISG 2007/2008
II.2 Écriture dans un fichier séquentiel Write #num, L Ecrit une série de valeurs existant dans la chaîne de caractère L et les entoure par des guillemets. Si on appelle write plusieurs fois alors: Si l'instruction se termine par un point-virgule ou virgule les données sont séparées par des virgules; Sinon (aucune ponctuation) les données sont séparées par un CR-LF. 3- Fermer le fichier Cours VB – ISG 2007/2008
Exemple 2 : Copie d’un fichier Exercice : Ecrire le code qui permet de lire un fichier nommé Fich_1.txt, ligne par ligne, et d’ajouter son contenu dans un second fichier déjà existant nommé Fich_2.txt et d’afficher le fichier résultat. Cours VB – ISG 2007/2008
Travail à faire Écrire un programme qui donne le même résultat que la commande Input [#]NumFich, A, B, C, … mais en utilisant la commande Line input et les opérations nécessaires sur les chaînes de caractères Cours VB – ISG 2007/2008
III. Accès direct For Random For Binary Cours VB – ISG 2007/2008
III.1 For Random Un fichier à accès direct est un fichier comprenant un enregistrement défini par un type personnalisé. Ce type particulier est utilisé pour lire et écrire des enregistrements. C'est le type de fichiers le plus utilisé pour gérer de grandes quantités de données. On peut les ouvrir en lecture écriture à l’aide de l’instruction Open. Ils sont par conséquent en mode Random. Il faut aussi préciser la taille de l'enregistrement. On ouvre un fichier à accès direct de la manière suivante: Open nom_fichier For Random As [#]NumFich Len=Len(VarEnreg) Où VarEnreg est la variable d'enregistrement Cours VB – ISG 2007/2008
Lecture et écriture des fichiers d’accès direct Les instruction Get et Put permettent respectivement la lecture et l’écriture dans ce type de fichiers. Get [#] NumFich, [num_enreg], var_enreg ' Lit l’enregistrement à la position num_enreg (ou à la position courante si ce paramètre n’apparaît pas) du fichier numéro numfich et le place dans la variable var_enreg Put [#] NumFich, [num_enreg], var_enreg ' Ecrit le contenu de la variable var_enreg à la position num_enreg (ou à la position courante si ce paramètre n’apparaît pas) dans le fichier numéro numfich. On peut accéder directement à un enregistrement en lecture écriture en utilisant l’instruction Seek. Syntaxe: Seek [#] NumFich, num_enreg ' positionne le pointeur dans le fichier numéro numfich à l’enregistrement num_enreg Cours VB – ISG 2007/2008
Exemple 3: fichiers directs en mode Random Private Type ADR 'Définition d'un type personnalisé Nom As String * 30 Ville As String * 20 End Type Sub MAIN() Dim Enr As ADR 'Ouverture du fichier en accès direct Open "C:\Gestion.TXT" For Random As 1 Len = Len(Enr) 'Ecriture dans le fichier de 2 enregistrements Enr.Nom = "Mohamed" Enr.Ville = "Tunis" Put 1, 1, Enr 'Ecriture du 1ier enregistrement Enr.Nom = "Sarra" Enr.Ville = "Bizerte" Put 1, 2, Enr 'Ecriture du 2ème enregistrement Get 1, 1, Enr 'lecture du 1ier enregistrement MsgBox Enr.Nom & " " & Enr.Ville 'Visualisation des champs Get 1, 2, Enr 'lecture du 2ième enregistrement Close 1 End Sub Cours VB – ISG 2007/2008
Open nom_fichier For Binary As #NumFich III.2 For binary L’ouverture par for binary est appropriée si le fichier n’a pas de structure propre. Ce mode est utile lorsque les autres types (séquentiel, random) ne conviennent pas au problème traité. Si le fichier est ouvert en binary on a alors un accès direct se basant sur le nombre d’octets précisé Ouverture en lecture écriture : Open nom_fichier For Binary As #NumFich Lecture : Get [#]NumFich, [posdebut] , BinVar Remarques Posdebut: La position par où commence la lecture les commandes de lecture séquentielles (line input, Input) sont aussi possibles L'écriture dans un fichier binaire Put [#]NumFich, [posdebut] , BinVar Cours VB – ISG 2007/2008
III.2 For binary Positionnement Seek [#]NumFich, Pos Si le fichier contient des enregistrement et qu’on a utilisé la commande open for binary pour l’ouvrir, cette commande permet le positionnement comme suit: Seek #NumFich, 1 : le premier Seek #NumFich, Len(Enr) : le second Seek #NumFich, Len(Enr)*2 : le troisieme … Si le fichier est un fichier texte le seek précise le nombre d’octets qu’il doit ignorer avant de commencer la lecture Binaire permet d’ouvrir texte ou enregistrement Si fichier texte: Get NF, posdebut, binvar Posdebut: précise le numero du caractere à partir duquel se fera la lecture Binvar: contient |Binvar| caracteres à partir de Posdebut Le seek est possible mais il précise le nombre d’octets qu’il doit ignorer avant de commencer la lecture ================================ Pour les fichiers d’enregistrements Seek NF, 1 : le premier Seek NF, Len(Enr) : le second Seek NF, Len(Enr)*2 : le troisieme … si on utilise le seek puis un get NF, , enr il lira directement l’enregistrement pointé par seek Cours VB – ISG 2007/2008
III.2 For binary Le nombre d'octets lus et écrits dépend du type de données de la variable de lecture nommée (dans cet exemple) BinVar. En général, on utilise des variables de type chaînes de caractères comme l'indique l'exemple suivant: Private Sub CMDBinaire_Click() 'On définit une variable qui sert à récupérer les données du fichier Dim BinVar As String 'On ouvre le fichier en mode binaire, Open "e:\Fich_1.txt" For Binary As #1 'On récupère les 100 premiers caractères BinVar = Space$(100) Get 1, , BinVar 'On affiche le résultat dans la zone text1 Text1.Text = BinVar 'On ferme le fichier Close 1 End Sub Private Sub CMDBinaire_Click() 'On définit une variable qui sert à récupérer les données du fichier Dim BinVar As String * 10 'On ouvre le fichier en mode binaire, Open "e:\Fich_1.txt" For Binary As #1 Get 1, , BinVar 'On affiche le résultat dans la zone text1 Text1.Text = BinVar 'On ferme le fichier Close 1 End Sub Cours VB – ISG 2007/2008
Remarques Générales Dans les modes Binary, Input et Random, on n’est pas obligé de fermer un fichier avant de l'ouvrir sous un autre numéro de fichier. Dans les modes Append et Output, on doit fermer un fichier avant de l'ouvrir avec un autre numéro de fichier. Si on ouvre un fichier texte en direct par for random alors les commandes de lecture séquentielles (input, line input, …) ne sont plus possibles Cours VB – ISG 2007/2008
Les commandes manipulant les fichiers Action ChDir Change le répertoire courant CurDrive Change le lecteur courant Dir Renvoie le nom de fichier ou un répertoire correspondant à un modèle ou à un attribut de fichier FileCopy Copie un fichier FileDateTime Renvoie la date et l'heure (temps) de la dernière modification du fichier FileLen Renvoie la taille d'un fichier en octets GetAttr Renvoie une valeur qui représente un attribut d'un fichier Kill Efface un fichier MkDir Crée un nouveau répertoire Name Renomme un fichier ou répertoire RmDir Efface un répertoire vide SetAttr Change l'attribut d'un fichier Cours VB – ISG 2007/2008
Exercice Écrire le code des deux boutons de commande. Cours VB – ISG 2007/2008