Cours VB.NETDate de mise à jour : 05/12/2010
V-AB. Travailler sur les dates, les heures, sur le temps
V-AB-1. Définir une date, une heure
V-AB-2. Afficher une date, une heure
V-AB-3. Variable "temps"
V-AB-4. Add, Substrat
V-AB-5. AddDay, AddMouths, AddHours, AddSeconds, AddMiliseconds
V-AB-6. Year, Mouth, Day, Hour, Minute, Seconde, Millisecond
V-AB-7. DayOfWeek, DayOfYear, DayInMonth
V-AB-8. Now, ToDay, TimeOfDay
V-AB-9. Ticks
V-AB-10. Année bissextile, jours fériers
V-AB-11. Comparaison de DateTime
V-AB-12. Calcul de la différence entre deux dates
V-AB-13. Comment saisir rapidement une date dans un programme ?
V-AB-14. Fuseau horaire
V-AB-15. Les Timers
V-AB-16. Perdre du temps
V-AB-17. Chronométrer
V-AB-18. Exemple: Horloge numérique
V-AC. Lire et écrire dans les fichiers (séquentiels ou aléatoires)
V-AC-1. Généralités et rappels
V-AC-2. Classe FileInfo et File, Stream du Framework
V-AC-3. Classe My.Computer.FileSystem
V-AC-4. Utiliser les "Stream" du Framework
V-AC-5. Utiliser "FileOpen" du VisualBasic
V-AC-5-a. Fichier séquentiel en VB
V-AC-5-b. Fichier à accès aléatoire en VB
V-AC-5-c. Fichier binaire en VB
V-AC-6. Utilisation du Contrôle RichTextBox
V-AC-7. Lire ou écrire des octets ou du XML
V-AC-8. Boîte de dialogue pour choix de fichier
V-AC-9. Stream et fichier aléatoire avec structure
V-AD. Travailler sur les répertoires et fichiers
V-AD-1. Classe DirectoryInfo et la Classe Directory du Framework
V-AD-2. Classe Path
V-AD-3. Classe DriveInfo
V-AD-4. Classe Environment
V-AD-5. Classe My.Computer.FileSystem en VS 2005
V-AD-6. Les méthodes de l'espace Visual Basic
V-AD-7. Boîte de dialogue 'Choix de répertoire' en VB2005
V-AD-8. Parcours de répertoires et de sous répertoires
V-AD-9. Fichiers et répertoires avec Linq
V-AE. Afficher correctement du texte
V-AE-1. Remarque sur la mise à jour de l'affichage
V-AE-2. Afficher du texte
V-AE-2-a. ToString
V-AE-2-b. Str() de Microsoft.VisualBasic est toujours accepté
V-AE-2-c. String.Format du Framework
V-AE-3. CultureInfo
V-AF. Méthode d'extension, Lambda expression
V-AG. L'espace de nom 'My'.
V-AG-1. My.Application
V-AG-2. My.Computer
V-AG-3. My.User
V-AG-4. My.Ressources
V-AG-5. My.Setting
V-AG-6. My.Forms
V-AB. Travailler sur les dates, les heures, sur le temps
Il est probablement nécessaire de lire le chapitre VI sur les Classes avant de lire celui-ci.
Il existe un type de variable 'DateTime' pour gérer les dates et heures, comment l'utiliser ?
Nous verrons aussi comment utiliser les Timers pour déclencher des évènements à intervalle régulier. Enfin comment perdre du temps?
Une variable DateTime contient une date plus l'heure.
Elle occupe 8 octets.(64 bits)
Elle peut contenir une date comprise entre le 1er janvier de l'année 01 et le 31 décembre 9999 et une heure comprise entre 0:00:00 (minuit) et 23:59:59.
En fait ce qui est codé dans la variable DateTime est le nombre de graduations ( Une graduation= 100 nanosecondes.) écoulées à compter de minuit, le 1er janvier de l'année 1 jusqu'a la date codée.
Nb: DateTime fait partie d'une Classe .Net, il existe aussi un type nommé Date qui fait partie de Visual Basic, qui est équivalent à DateTime.
Préférez DateTime qui est une Classe Net.
V-AB-1. Définir une date, une heure
A - Pour définir une valeur DateTime en utilisant un littéral: elle doit être placée entre des signes (#) et son format doit être de type m/d/yyyy, par exemple #5/31/1998#.(contrairement à ce que je pensais, même si le format date dans la configuration de la langue de l'ordinateur est de type français).
Dim dateNaissance As DateTime
dateNaissance= #12/ 02/ 1951#
|
B - Autre manière de saisir une date, une heure:
Dim dateNaissance As New System. DateTime (1996, 6, 3, 22, 15, 0)
|
Ici on a utilisé le constructeur.
C -Troisième méthode:
On peut saisir une date dans une string puis convertir:
DateNaissance = CDate (" 02/12/1951 " )
|
CDate converti donc une chaîne en dateTime. On peut aussi utiliser CType:
Dim dateNaissance As Date = CType (" 01/12/2005 " , Date )
|
IsDate (objet) permet de vérifier si objet est convertible en date.
IsDate retourne True si l'expression est de type Date ou est une chaîne convertible en type Date ; sinon, elle retourne False.
Cela permet de vérifier, après une saisie d'une string par exemple, si l'utilisateur a bien tapé des chiffres valides et même si la date est valide ("31/02/1945" n'est pas valide).
Bizarrerie= "12/2005" est considéré comme une date valide et équivalente à "01/12/2005"!! Pas de vérification des 2 '/'.
If IsDate ( MyString) Then . .
|
Exemple de Microsoft:
Dim MyDate, YourDate As DateTime
Dim NoDate As String
Dim D As Boolean
MyDate = CDate (" 12 Février, 1969 " )
YourDate = #2/ 12/ 1969#
NoDate = " Hello "
D = IsDate (MyDate)
D = IsDate (YourDate)
D = IsDate (NoDate)
|
V-AB-2. Afficher une date, une heure
Pour afficher les dates et heures simplement, il suffit d'utiliser .ToString
MsgBox (DateNaissance. ToString )
|
Le format utilisé est le format d'affichage des dates de l'ordinateur (en fonction du pays; en france c'est le format fr).
ToString peut comporter des arguments qui formatent l'affichage:
Voici quelques codes de formatage:
d affiche le jour 2
dd affiche le jour sur 2 chiffres 02
ddd affiche le jour abrégé Dim.
dddd affiche le jour complet Dimanche
M affiche le mois 12
MM affiche le mois sur 2 chiffres 12
MMM affiche le mois abrégé déc
MMMM affiche le mois complet décembre
y, yy, yyyy affiche 1 à 2 chiffres, deux chiffres ou quatre chiffre 51, 51, 1951
H affiche l'heure sur un ou deux chiffres (format 24h)
HH affiche l'heure sur 2 chiffres
h et hh font de même mais avec un format 12 h.
t, tt affiche l'heure en format 12h plus A ou P (pour matin, après midi)
m, mm, s, ss, f, ff font de même pour les minutes, secondes et millisecondes.
: et / sont les séparateurs heure et date.
|
Exemple:
MsgBox (DateNaissance. ToString (" dddd d MMMM yyyy " ))
MsgBox (DateNaissance. ToString (" hh:mm " )
MsgBox (DateNaissance. ToString (" dd/MM/yy " )
MsgBox (DateNaissance. ToString (" %h)
|
On peut enfin utiliser les méthodes de la classe DateTime!!
DateNaissance. ToLongDateString
DateNaissance. ToShortDateString
DateNaissance. ToLongTimeString
DateNaissance. ToShortTimeString
|
V-AB-3. Variable "temps"
Un TimeSpan est une unité de temps (un intervalle de temps) exprimée en jours, heures, minutes, secondes;
Un TimeSpan initialisé avec 1.0e+13 graduations représente "11.13:46:40", ce qui correspond à 11 jours, 13 heures, 46 minutes et 40 secondes.
On peut initialiser un TimeSpan avec des graduations:
Dim instance As New TimeSpan (ticks)
|
ou avec des heures, minutes, secondes, millisecondes.
Dim instance As New TimeSpan (h, m ,s ,ms)
|
On peut aussi l'initialiser avec un certain nombre de jours, d'heures, de secondes. Exemple avec 4 jours.
Dim value As Double= 4
Dim returnValue As TimeSpan
returnValue = TimeSpan. FromDays (value)
|
L'espace de nom System.DateTime. contient une multitude de membre:
V-AB-4. Add, Substrat
On peut ajouter ou soustraire un TimeSpan à un DateTime, on obtient un DateTime.
En clair on peut ajouter à une date une durée, on obtient une date.
Dim today As System. DateTime
Dim duration As System. TimeSpan
Dim answer As System. DateTime
today = System. DateTime . Now
duration = New System. TimeSpan (36, 0, 0, 0)
answer = today. Add (duration)
|
On peut ajouter ou soustraire 2 dates, on obtient une TimeSpan
Dim diff1 As System. TimeSpan
diff1 = date2. Subtract (date1)
|
V-AB-5. AddDay, AddMouths, AddHours, AddSeconds, AddMiliseconds
Permet d'ajouter des jours, des mois, des heures, des secondes, ou des millisecondes à une date, on obtient une date.
V-AB-6. Year, Mouth, Day, Hour, Minute, Seconde, Millisecond
Permettent d'extraire l'année, le mois, le jour, l'heure, les minutes, les secondes, les millisecondes d'une date:
I= DateNaissance. Year
I= System. DateTime . Now . Day
|
(DatePart permet aussi d'extraire plein d'informations d'une date: jour , mois, année, jour de la semaine..)
V-AB-7. DayOfWeek, DayOfYear, DayInMonth
Retourne le jour de la semaine (0 pour dimanche à 6 pour samedi)
I= DateNaissance. DayOfWeek
|
DayOfYear existe aussi.
dateNaissance.IsDaylightSavingTim indique si on est dans l'heure d'été pour le fuseau
Date.DayInMonth donne le nombre de jour dans le mois spécifié:
Date . DaysInMonth (1951, 12)
|
V-AB-8. Now, ToDay, TimeOfDay
Now est la date et l'heure du système.(Là, maintenant)
ToDay est la date du système avec l'heure à 0.
TimeOfDay est l'heure actuelle.
My.Computer.Clock permet de récupérer l'heure courante ainsi que le nombre de millisecondes écoulées depuis le démarrage.
MsgBox (My. Computer . Clock . LocalTime . ToString )
|
V-AB-9. Ticks
Donne le nombre de graduations d'un DateTime.
AddTicks peut être utilisé.
V-AB-10. Année bissextile, jours fériers
Pour cela utiliser IsLeapYear:
MsgBox (DateTime. IsLeapYear (2005))
|
V-AB-11. Comparaison de DateTime
On utilise Compare: DateTime.Compare(t1, t2) retourne 0 si t1=t2, une valeur positive si t1>t2 négative si t1<t2.
Dim t1 As New DateTime (100)
Dim t2 As New DateTime (20)
If DateTime. Compare (t1, t2) > 0 Then
Console. WriteLine (" t1 > t2 " )
End If
If DateTime. Compare (t1, t2) = 0 Then
Console. WriteLine (" t1 = t2 " )
End If
If DateTime. Compare (t1, t2) < 0 Then
Console. WriteLine (" t1 < t2 " )
End If
|
On peut aussi utiliser la méthode op_Equality de l'espace de nom pour voir si 2 dates sont égales:
areEqual = System. DateTime . op_Equality (april19, otherDate)
|
Il existe aussi op_GreaterThan et beaucoup d'autres.
V-AB-12. Calcul de la différence entre deux dates
On utilise DateDiff, il faut fournir en paramètre:
Exemple:
Afficher le nombre de jours entre une date donnée et la date du jour.
Dim DateS, Msg As String
Dim DateD As DateTime
DateS = InputBox (" Entrer une date " )
DateD = CDate (DateS)
Msg = " Nombre de jour: " & DateDiff (DateInterval. Day , Now , DateD)
MsgBox (Msg)
|
V-AB-13. Comment saisir rapidement une date dans un programme ?
En ajoutant à une fenêtre un contrôle DateTimePicker.
En mode Run , il apparaît une zone rectangulaire avec la date système dedans:
Si l'utilisateur clique sur la flèche déroulante, il apparaît une fenêtre calendrier.
Il suffit pour l'utilisateur de cliquer sur la bonne date.
Le programmeur récupère la date dans DateTimePicker1.value
Il existe, bien sur, de multiples propriétés et plusieurs évènements, le plus remarquable étant: ValueChanged.
MonthCalendar est un contrôle similaire mais qui reste toujours ouvert.
De plus grâce à CalendarDimension on peut afficher plusieurs mois.
V-AB-14. Fuseau horaire
TimeZone représente le fuseau horaire actuel, celui défini dans le panneau de configuration.
Vous pouvez utiliser la classe TimeZone pour récupérer des informations à propos du fuseau horaire actuel et convertir l'heure locale en temps universel (UTC, Universal Time Coordinated) ou vice versa.
Le fuseau actuel est dans TimeZone.CurrentTimeZone, son nom est dans la propriété .StandartName; pour convertir en temps universel: .ToUniversalTime(currentDate).
Imports System. Globalization
Public Class Form1
Private Sub Button1_Click (ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles Button1. Click
Const dataFmt As String = " {0,-30}{1} "
Const timeFmt As String = " {0,-30}{1:dd-MM-yyyy HH:mm} "
Console. WriteLine (" Exemple TimeZone " & vbCrLf )
Dim localZone As TimeZone = TimeZone. CurrentTimeZone
Dim currentDate As DateTime = DateTime. Now
Dim currentYear As Integer = currentDate. Year
Console. WriteLine (dataFmt, " Nom du fuseau local: " , _
localZone. StandardName )
Console. WriteLine (dataFmt, " Nom du fuseau de l'heure d'été: " , _
localZone. DaylightName )
Console. WriteLine (vbCrLf & timeFmt, _
" Date et heure courante: " , currentDate)
Console. WriteLine (dataFmt, " Heure d'été? " , _
localZone. IsDaylightSavingTime (currentDate))
Dim currentUTC As DateTime = _
localZone. ToUniversalTime (currentDate)
Dim currentOffset As TimeSpan = _
localZone. GetUtcOffset (currentDate)
Console. WriteLine (timeFmt, " Date et heure universelle: " , _
currentUTC)
Console. WriteLine (dataFmt, " Différence local-UTC: " , currentOffset)
Dim daylight As DaylightTime = _
localZone. GetDaylightChanges (currentYear)
Console. WriteLine (vbCrLf & _
" Année de l'heure d'été {0}: " , currentYear)
Console. WriteLine (" {0:dd-MM-yyyy HH:mm} Ã " & _
" {1:dd-MM-yyyy HH:mm}, delta: {2} " , _
daylight. Start , daylight. End , daylight. Delta )
End Sub
End Class
|
Affiche:
Exemple TimeZone
Nom du fuseau local: Paris, Madrid
Nom du fuseau de l'heure d'été:Paris, Madrid
Date et heure courante: 23-05-2009 14:51
Heure d'été? True
Date et heure universelle: 23-05-2009 12:51
Différence local-UTC: 02:00:00
Année de l'heure d'été 2009:
29-03-2009 02:00 à 25-10-2009 03:00, delta: 01:00:00
|
Vous ne pouvez pas utiliser la classe TimeZone pour représenter des fuseaux horaires autres que ceux de la zone locale ou pour gérer des conversions de date et heure d'un fuseau horaire en un autre. Pour cela, utilisez la classe TimeZoneInfo (permet de travailler sur n'importe quel fuseau horaire).
Exemple: dans un TimeZoneInfo, on va mettre le TimeZoneInfo local:
Dim localZone As TimeZoneInfo = TimeZoneInfo. Local
Console. WriteLine (" Local Time Zone ID: {0} " , localZone. Id )
Console. WriteLine (" Display Name is: {0}. " , localZone. DisplayName )
Console. WriteLine (" Standard name is: {0}. " , localZone. StandardName )
Console. WriteLine (" Daylight saving name is: {0}. " , localZone. DaylightName )
|
TimeZoneInfo.Utc Obtient un objet TimeZoneInfo qui représente la zone de temps universel (UTC, Universal Time Coordinated).
On peut convertir un DateTime d'un fuseau à un autre:
Dim dateTime As DateTime
Dim destinationTimeZone As TimeZoneInfo
Dim returnValue As DateTime
returnValue = TimeZoneInfo. ConvertTime (dateTime, _
destinationTimeZone)
|
V-AB-15. Les Timers
Pour déclencher un évènement à intervalle régulier, il faut utiliser les minuteries ou 'Timer'.
Prendre le contrôle Timer dans la Boite à outils, l'ajouter à la fenêtre. Il apparaît en bas sous la fenêtre dans la barre d'état des composants.
Il n'apparaît pas à l'utilisateur dans la fenêtre en mode Run.
Il est très simple à utiliser.
La propriété Interval contient la périodicité de l'événement Ticks , évènement qui se déclenche régulièrement.
Interval est en millisecondes. Pour Interval=500 l'évènement Ticks se déclenche toutes les 1/2 secondes.
Start et Stop déclenche et arrête la minuterie (De même Enabled active ou non ).
Exemple:
Faire clignoter un label toutes les 1/2 secondes.
Créer le label1
Ajouter un Timer1 (qui se place en bas sous la fenêtre).
Private Sub Form3_Load (. . . )
Timer1. Interval = 500
Timer1. Start ()
End Sub
Private Sub Timer1_Tick (. . )
Label1. Visible = Not (Label1. Visible )
End Sub
|
Un évènement Timer_Tick se produit toutes les 1/2 secondes et inverse la valeur de la propriété visible du label. (Si elle était égale à True, elle devient égale à False et vice versa.)
Mais attention: Timer à des restrictions de taille:
- Si votre application ou une autre demande beaucoup au système (boucles longues, calculs complexes, accès intensifs à un périphérique, un réseau ou un port, par exemple), les événements de minuterie peuvent être moins fréquent que spécifié dans la propriété Interval. Il n'est pas garanti que l'intervalle s'écoule dans le temps exact!!
- L'intervalle peut être compris entre 1 et 64 767 millisecondes: l'intervalle le plus long ne dépasse pas de beaucoup la minute (64,8 secondes).
- Le système génère 18 graduations à la seconde (même si la valeur de la propriété Interval est mesurée en millisecondes, la véritable précision d'un intervalle ne dépassera pas un dix-huitième de seconde).
Donc pour faire clignoter un label :OUI
Pour compter précisément un intervalle de temps:NON
Mais il y a d'autres méthodes.
V-AB-16. Perdre du temps
Parfois on a besoin de perdre du temps:
Exemple ne rien faire pendant 3 secondes puis poursuivre..
V-AB-17. Chronométrer
Parfois on a besoin de chronométrer un évènement:
Voir la rubrique Chronométrer.
L'exemple sur l'horloge est aussi didactique.
V-AB-18. Exemple: Horloge numérique
Très Simple: Comment créer une horloge numérique?
Dans la fenêtre Form1.
Mettre un Timer (Timer1)
Mettre un label (Label1)
Ajouter le code
Private Sub Form1_Load (ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles MyBase. Load
Timer1. Interval = 1000
Timer1. Start ()
End Sub
Private Sub Timer1_Tick (ByVal sender As Object, ByVal e As System. EventArgs ) Handles Timer1. Tick
Label1. Text = Now . ToLongTimeString
End Sub
|
Simple!! non!!
V-AC. Lire et écrire dans les fichiers (séquentiels ou aléatoires)
Il est probablement nécessaire de lire le chapitre VI sur les Classes avant de lire celui-ci.
Comment lire et écrire dans des fichiers du texte, des octets, du XML du Rtf ?
V-AC-1. Généralités et rappels
Le mot 'fichier' est a prendre au sens informatique: ce n'est pas un ensemble de fiches mais plutôt un ensemble d'octets. Un fichier peut être un programme (Extension .EXE), du texte (Extension .TXT ou .DOC....), une image (Extension .BMP .GIF .JPG...), une base de données (.MDB..) du son, de la vidéo....
Pour travailler avec du texte, des octets, des données très simple (sans nécessité d'index, de classement..), on utilise les méthodes décrites dans ce chapitre: travail direct dans les fichiers séquentiels, aléatoires, binaires. Mais dès que les informations sont plus structurées, il faut utiliser les bases de données (Il y a plusieurs chapitres plus loin traitant des bases de données).
Un fichier a un nom: 'Image.GIF', une extension: '.GIF' qui en indique généralement le type de contenu , des attributs (Longueur, Date de création, de modification, Fichier en lecture seule ou non..).
On voit cela dans l'explorer Windows:
Un fichier est composé d'enregistrements qui sont des 'paquets' de données; suivant le type de fichier un enregistrement peut correspondre à une ligne, un octet, un groupe d'octets..
Un fichier peut être vu comme contenant du texte, de l'XML, des octets.
Comment utiliser les fichiers? Voici le plan de cet article:
A- Il est conseillé de travailler avec les Classes du Framework.
Avec la Classe FileInfo, on obtient des renseignements sur le fichier.
Pour lire écrire dans un fichier (en dehors des bases de données), il y a plusieurs méthodes:
Avec la Classe System.Io on a a notre disposition StreamReader StreamWriter BinaryReader BinaryWriter FileStream:
Pour lire ou écrire dans un fichier, il faut l'ouvrir (Open), lire ou écrire en utilisant un flux de données (Stream) puis le refermer (Close).
Le Stream (flux, torrent, courant) est une notion générale, c'est donc un flux de données provenant ou allant vers un fichier, un port, une connexion TCP/IP...
L'accès est séquentiel: les données sont traitées du début à la fin du fichier.
B- Il existe toujours la méthode classique du FileOpen:
On ouvre le fichier en mode séquentiel, aléatoire, binaire, on lit X enregistrements, on referme le fichier.
C- Avec certains objets, on gère automatiquement les lectures écritures sur disque.
Comme avec le RichTextBox par exemple.
En résumé, pour travailler sur les fichiers, on dispose:
- de l'espace de nom System.IO avec les Classes et objets .NET
- des instructions VisualBasic traditionnelles: FileOpen WriteLine..
- des instructions du FSO (FileObjetSystem) pour la compatibilité avec les langages de script.
Les 2 derniers font appel au premier; donc pourquoi ne pas utiliser directement les Classe .NET?
V-AC-2. Classe FileInfo et File, Stream du Framework
Pour travailler sur les fichiers, il faut au préalable taper:
Imports System.IO
La classe File est utilisée pour travailler sur un ensemble de fichier ou un fichier (sans instanciation préalable: ce sont des méthodes statiques), la Classe FileInfo donne des renseignements sur un fichier particulier (Il faut instancier au préalable un objet FileInfo).
La Classe File possède les méthodes suivantes.
Exists Teste si le fichier existe.
Create Crée le fichier
Copy Copie le fichier
Delete Efface le fichier
GetAttributes , SetAttributes Lire ou écrire les attributs.
GetCreationTime , GetLastAccessTime , GetLastWriteTime et les Set.. correspondant.
Move Déplacement de fichier
Replace Framework 2
ReadAllText, WriteAllText Framework 2 lire ou écrire un texte dans un fichier
ReadAllLines, WriteAllLines Framework 2 lire ou écrire des lignes dans un fichier
ReadAllBytes, WriteAllBytes Framework 2 lire ou écrire des octets dans un fichier
|
Toutes les méthodes Open (pour un FileStream) OpenRead, OpenWrite, OpenText.
Exemple:
Un fichier existe-t-il? Afficher True s'il existe:
Label1. Text = File. Exists (" vessaggi.gif " ). ToString
|
Exists est bien une 'méthode de Classe': pas besoin d'instancier quoi que ce soit.
Déplacer un fichier de c: vers d:?
File. Move (" c:\monText.txt " , " d:\monText.txt " )
|
Copier un fichier de c: vers d:?
File. Copy (" c:\monText.txt " , " d:\monText.txt " , True )
|
Le dernier argument facultatif (framework 2) permet de remplacer le fichier cible s'il existe.
Sauvegarde un fichier et le remplace? (Framework 2)
File. Copy (" c:\monText.txt " , " c:\newText.txt " ,, " c:\newText.bak " True )
|
Sauvegarde monText.txt dans un .bak , puis copie NewText.txt dans monText.txt; True permet de remplacer la cible si elle existe.
Efface un fichier:
File. Delete (" d:\monText.txt " )
|
Lire la totalité d'un fichier texte? (Framework 2)
Dim myText As String = File. ReadAllText (" c:\monText.txt " )
|
File.WriteAllText("c:\monText.txt", myText) 'pour réecrire le texte dans un autre fichier.
La méthode AppendAllText existe aussi.
Lire un fichier texte et mettre dans un tableau les lignes d'un fichier texte? (Framework 2)
Dim myLines () As String = File. ReadAllLines (" c:\monText.txt " )
|
Lire et mettre dans un tableau les octets d'un fichier? (Framework 2)
Dim myBytes () As Byte = File. ReadAllBytes (" c:\monText.txt " )
|
Un fichier est-il en lecture seule?
If File. GetAttributes (" c:\monText.txt " ) And FileAttributes. ReadOnly Then . .
|
La Classe FileInfo possède les propriétés suivantes:
Name Nom du fichier (sans chemin)
FullName Nom complet avec chemin
Extension Extension (. txt par exemple)
Length Longueur du fichier.
Directory Répertoire parent
DirectoryName Répertoire ou se trouve le fichier
Exists Existe?
LastAccessTime Date du dernier accès, LastWriteTime existe aussi.
Attributes Attributs
|
Pour voir les attributs d'un fichier, il faut faire un AND entre Attributes et une valeur de l'énumération FileAttributes ( Archive, Compressed, Directory, Encrypted, Hidden, Normal, ReadOnly, System, Temporaly).
Pour tester ReadOnly par exemple:
Dim sNom As String = " c:\monfichier.txt "
Dim Fi As FileInfo
Fi= New FileInfo ( sNom)
|
Ensuite:
Fi. Attributes And FileAttributes. ReadOnly
|
Et aussi:
Fi.Name retourne "monfichier.txt"
Fi.FullName retourne "c:\monfichier.txt"
Fi.Name.Substring(0, Fi.Name.LastIndexOf(".")) retourne "monfichier" : pas de chemin ni d'extension.
Et les méthodes suivantes:
Create, Delete, MoveTo
AppendTex, CopyTo Open, OpenRead, OpenWrite, OpenText..
On voit que toutes les informations sont accessibles.
Exemple:
Pour un fichier, afficher successivement le nom, le nom avec répertoire, le répertoire, la longueur, la date de dernière écriture et si le fichier est en ReadOnly.
Dim sNom As String = " c:\monfichier.txt "
Dim Fi As FileInfo
Fi= New FileInfo ( sNom)
MsgBox (" Nom= " & Fi. Name )
MsgBox (" Nom complet = " & Fi. FullName )
MsgBox (" Répertoire= " & Fi. DirectoryName )
MsgBox (" Longueur= " & Fi. Length . ToString )
MsgBox (" Date dernière modification= " & Fi. LastWriteTime . ToShortDateString )
MsgBox (" ReadOnly= " & (Fi. Attributes And FileAttributes. ReadOnly ). ToString )
|
V-AC-3. Classe My.Computer.FileSystem
A partir de VS 2005 il y a en plus la classe My.Computer.FileSystem qui simplifie énormément les choses:
les méthodes CopyFile, DeleteFile, FileExits permettent de copier, effacer un fichier ou de voir s'il existe. Il existe aussi RenameFile et MoveFile.
Exemple :
Afficher dans une MsgBox True si 'c:\config.sys' existe.
MsgBox (My. Computer . FileSystem . FileExists (" c:\config.sys " ). ToString )
|
Exemple :
Afficher la liste des fichiers qui sont sous c:\; ici on utilise GetFiles qui retourne une collection des fichiers.Count contient le nombre de fichiers, item () les noms.
Dim i As Integer
For i = 0 To My. Computer . FileSystem . Getfiles (" c:\ " ). Count - 1
ListBox1. Items . Add (My. Computer . FileSystem . GetFiles (" c:\ " ). Item (i))
Next i
|
Un fichier existe t-il et est-il ouvert et utilisé par une autre application?
If My. Computer . FileSystem . FileExists (" c:\monText.txt " ) Then
Try
Dim fs As IO. FileStream = My. Computer . FileSystem . GetFileInfo (" c:\monText.txt " ). Open (IO. FileMode . Open , _
IO. FileAccess . Read )
fs. Close ()
Catch ex As Exception
MsgBox (" Le fichier est déjà ouvert " )
End Try
End If
|
V-AC-4. Utiliser les "Stream" du Framework
Le Stream (flux, torrent, courant) est une notion générale, c'est donc un flux de données provenant ou allant vers un fichier, un port, une connexion TCP/IP...
Ici on utilise un Stream pour lire ou écrire dans un fichier.
L'accès est séquentiel: les données sont traitées du début à la fin du fichier.
Pour écrire dans un fichier texte:
Il faut instancer un objet de la classe StreamWriter. Puis on écrit avec Write ou WriteLine (ajoute un saut de ligne). Enfin on ferme avec Close.
On peut instancier avec le constructeur de la classe StreamWriter et avec New, ou par la Classe File.
Dim SW As New StreamWriter (" MonFichier.txt " )
|
Il existe une surcharge permettant de ne pas écraser mais d'ajouter à la fin du fichier:
Dim SW As New StreamWriter (" MonFichier.txt " , True )
|
Avec la classe File:
Dim SW As StreamWriter= File. CreateText (" MonFichier.txt " )
Dim SW As StreamWriter = File. AppendText (" MonFichier.txt " )
|
Ensuite pour écrire 2 lignes:
SW. WriteLine (" Bonjour " )
SW. WriteLine (" Monsieur " )
|
Enfin on ferme:
Pour lire dans un fichier Texte:
Il faut instancier un objet de la classe StreamReader. Puis on lit avec Read (un nombre d'octet) ReadLine (une ligne) ReadToEnd (de la position courante jusqu'à la fin). Enfin on ferme avec Close.
Avec le constructeur de la Classe Stream Reader:
Dim SR As New StreamReader (" MonFichier.txt " )
|
Avec la Classe File:
Dim SR As StreamReader= File. OpenText (" MonFichier.txt " )
|
Comment lire chaque ligne du fichier et s'arrêter à la fin?
En effet on ne sait pas habituellement combien le fichier contient de ligne, si le fichier contient 2 lignes il faut en lire 2 et s'arrêter sinon on tente de lire après la fin du fichier et cela déclenche une erreur.
3 solutions:
- Utiliser ReadToEnd qui lit en bloc jusqu'à la fin.
- Avant ReadLine mettre un Try: quand l'erreur 'fin de fichier' survient elle est interceptée par Catch qui sort du cycle de lecture et ferme le fichier.
- Utiliser Peek qui lit dans le fichier un caractère mais sans modifier la position courante de lecture.
La particularité de Peek est de retourner -1 s'il n'y a plus de caractère à lire sans déclencher d'erreur, d'exception.
La troisième solution est la plus générale et la plus élégante:
Do Until SR. Peek = - 1
Ligne= SR. ReadLine ()
Loop
Enfin on ferme:
SR. Close ()
|
Notion de 'Buffer', utilisation de Flush.
En fait quand on écrit des informations sur le disque, le logiciel travaille sur un buffer ou mémoire tampon qui est en mémoire vive. Si on écrit des lignes dans le fichier, elles sont 'écrites' dans le buffer en mémoire vive. Quand le buffer est plein,(ou que l'on ferme le fichier) l'enregistrement du contenu du buffer est effectué effectivement sur le disque.
Ce procédé est général à l'écriture et à la lecture de fichier mais totalement transparent car le programmeur ne se préoccupe pas des buffers.
Parfois, par contre, même si on a enregistré peu d'informations, on veut être sûr qu'elle est sur le disque, il faut donc forcer l'enregistrement sur disque même si le buffer n'est pas plein, on utilise alors la méthode Flush.
Le fait de fermer un fichier par Close, appelle automatiquement Flush() ce qui enregistre des données du buffer.
V-AC-5. Utiliser "FileOpen" du VisualBasic
Bonjour les anciens.
Visual Basic fournit trois types d'accès au fichier :
- L'accès séquentiel, pour lire et écrire des fichiers 'texte' de manière continue, chaque donnée est enregistrée successivement du début à la fin; les enregistrements n'ont pas la même longueur, ils sont séparés par un séparateur (des virgules ou des retours à la ligne).
On ne peut qu'écrire le premier enregistrement puis le second, le troisième, le quatrième...
Pour lire c'est pareil: on ouvre, on lit le premier, le second, le troisième, le quatrième....
Pour lire le troisième enregistrement il faut lire avant les 2 premiers.
- L'accès aléatoire (Random), (on le nomme parfois accès direct) pour lire et écrire des fichiers texte ou binaire constitués d'enregistrements de longueur fixe; on peut avoir directement accès à un enregistrement à partir de son numéro.
Les enregistrements ont une longueur fixe: il faut prévoir!! si on décide de 20 caractères pour le prénom, on ne pourra pas en mettre 21, le 21ème sera tronqué, à l'inverse l'enregistrement de 15 caractères sera complété par des blancs.
Il n'y a pas de séparateur entre les enregistrements.
Les enregistrements peuvent être constitués d'un ensemble de variables: une structure, ici prénom et adresse.
Ensuite on peut lire directement n'importe quel enregistrement, le second enregistrement par exemple, ou écrire sur le 3éme.(on comprend que, connaissant la longueur d'un enregistrement qui est fixe, l'ordinateur peut calculer la position d'un enregistrement quelconque.)
- L'accès binaire, pour lire et écrire dans tous les fichiers, on lit ou écrit un nombre d'octet désiré à une position désirée..C'est comme l'accès direct, on peut lire le 36ème octet..
En pratique:
Les fichiers séquentiels sont bien pratique pour charger une série de ligne, (toujours la même) dans une ListBox par exemple.
Faut-il utiliser les fichiers séquentiels ou random (à accès aléatoire, à accès direct) pour créer par exemple un petit carnet d'adresse?
Il y a 2 manières de faire:
- Créer un fichier random et lire ou écrire dans un enregistrement pour lire ou modifier une adresse.
- Créer un fichier séquentiel. A l'ouverture du logiciel lire séquentiellement toutes les adresses et les mettre dans un tableau (de structure). Pour lire ou modifier une adresse: lire ou modifier un élément du tableau. En sortant du programme enregistrer tous les éléments du tableau séquentiellement.(Enregistrer dans un nouveau fichier, effacer l'ancien, renommer le nouveau avec le nom de l'ancien).
Bien sur s'il y a de nombreux éléments dans une adresse, un grand nombre d'adresse, il faut utiliser une base de données.
 |
Attention: Si on ouvre un fichier en écriture et qu'il n'existe pas sur le disque, il est crée.
Si on ouvre un fichier en lecture et qu'il n'existe pas, une exception est déclenchée (une erreur). On utilisait cela pour voir si un fichier existait: on l'ouvrait, s'il n'y avait pas d'erreur c'est qu'il existait. Mais maintenant il y a plus simple pour voir si un fichier existe (File.Exists).
Si on ouvre un fichier et que celui-ci est déjà ouvert par un autre programme, il se déclenche généralement une erreur (sauf si on l'ouvre en Binaire, c'était le cas en VB6, c'est à vérifier en VB.NET).
|
Pour ouvrir un fichier on utilise FileOpen.
FileOpen (FileNumber, FileName, Mode, Access, Share, RecordLength)
Paramètres de FileOpen
FileNumber
A tout fichier est affecté un numéro unique, c'est ce numéro que l'on utilisera pour indiquer sur quel fichier pratiquer une opération.. Utilisez la fonction FreeFile pour obtenir le prochain numéro de fichier disponible.
FileName
Obligatoire. Expression de type String spécifiant un nom de fichier. Peut comprendre un nom de répertoire ou de dossier, et un nom de lecteur.
Mode
Obligatoire. Énumération OpenMode spécifiant le mode d'accès au fichier : Append, Binary, Input (séquentiel en lecture), Output (séquentiel en écriture) ou Random (accès aléatoire).
Access
Facultatif. Mot clé spécifiant les opérations autorisées sur le fichier ouvert : Read, Write ou ReadWrite. Par défaut, la valeur est OpenAccess.ReadWrite.
Share
Facultatif. Spécifiant si un autre programme peut avoir en même temps accès au même fichier : Shared (permet l'accès aux autres programmes), Lock Read (interdit l'accès en lecture), Lock Write (interdit l'accès en écriture) et Lock Read Write (interdit totalement l'accès). Le processus OpenShare.Lock Read Write est paramétré par défaut.
RecordLength
Facultatif. Nombre inférieur ou égal à 32 767 (octets). Pour les fichiers ouverts en mode Random, cette valeur représente la longueur de l'enregistrement. Pour les fichiers séquentiels, elle représente le nombre de caractères contenus dans la mémoire tampon.
Pour écrire dans un fichier on utilise:
Print , Write, WriteLine dans les fichiers séquentiels.
FilePut dans les fichiers aléatoires.
Pour lire dans un fichier on utilise:
Input, LineInput dans les fichiers séquentiels.
FileGet dans les fichiers aléatoires.
Pour fermer le fichier on utilise FileClose().
Numéro de fichier:
Pour repérer chaque fichier, on lui donne un numéro unique (de type Integer).
La fonction FreeFile retourne le premier numéro libre.
Dim No as Integer
No= Freefile ()
|
Ensuite on peut utiliser No pour repérer le fichier sur lequel on travaille.
FileOpen ( No, " MonFichier " , OpenMode. Output )
Print (No," toto " )
FileClose (No)
|
V-AC-5-a. Fichier séquentiel en VB
Vous devez spécifier si vous voulez lire (entrer) des caractères issus du fichier (mode Input), écrire (sortir) des caractères vers le fichier (mode Output) ou ajouter des caractères au fichier (mode Append).
Ouvrir le fichier 'MonFichier' en mode séquentiel pour y écrire:
Dim No as integer
No= Freefile
FileOpen ( No, " MonFichier " , OpenMode. Output )
|
Pour écrire dans le fichier séquentiel: on utilise Write ou WriteLine Print ou PrintLine:
- La fonction Print écrit dans le fichier sans aucun caractère de séparation.
Print (1," toto " )
Print (1," tata " )
Print (1, 1. 2 )
|
Donne le fichier 'tototata1.2'
- La fonction Write insère des points-virgules entre les éléments et des guillemets de part et d'autre des chaînes au moment de leur écriture dans le fichier, les valeurs booléennes et les variables DateTime sont écrites sans problèmes.
Write (1," toto " )
Write (1," tata " )
Write (1, 1. 2 )
|
Donne le fichier '"toto";"tata";1.2"
 |
Attention s'il y a des points-virgules dans les chaînes, elles seront considérées comme séparateurs!! ce qui entraîne des erreurs à la lecture; il faut mettre la chaîne entre "" ou bien remplacer le point-virgule par un caractère non utilisé (# par exemple) avant de l'enregistrer puis après la lecture remplacer '#' par ';'
|
Il faut utiliser Input pour relire ces données (Input utilise aussi le point-virgule comme séparateur.
- La fonction WriteLine insère un caractère de passage à la ligne, c'est-à-dire un retour chariot+ saut de ligne (Chr(13) + Chr(10)),On lira les données par LineInput.
WriteLine (1," toto " )
WriteLine (1," tata " )
WriteLine (1, 1. 2 )
|
Donne le fichier:
"toto"
"tata"
1.2
Il faut utiliser LineInput pour relire ces données car il lit jusqu'au retour Chariot, saut de ligne.
Toutes les données écrites dans le fichier à l'aide de la fonction Print respectent les conventions internationales ; autrement dit, les données sont mises en forme à l'aide du séparateur décimal approprié. Si l'utilisateur souhaite produire des données en vue d'une utilisation par plusieurs paramètres régionaux, il convient d'utiliser la fonction Write
EOF (NuméroFichier) veut dire 'End Of File', (Fin de Fichier) il prend la valeur True si on est à la fin du fichier et qu'il n'y a plus rien à lire.
LOF (NuméroFichier) veut dire 'Length Of File', il retourne la longueur du fichier.
Exemple: Lire chaque ligne d'un fichier texte.
Dim Line As String
FileOpen (1, " MonFichier.txt " , OpenMode. Input )
While Not EOF (1)
Line = LineInput (1)
Debug. WriteLine (Line)
End While
FileClose (1)
|
Ici on a utilisé une boucle While.. End While qui tourne tant que EOF est Faux. Quand on est à la fin du fichier EOF (End of File)devient égal à True et on sort de la boucle.
V-AC-5-b. Fichier à accès aléatoire en VB
On ouvre le fichier avec FileOpen et le mode OpenMode.Random, ensuite on peut écrire un enregistrement grâce à FilePut() ou en lire un grâce à FileGet(). On peut se positionner sur un enregistrement précis (le 2eme, le 15ème) avec Seek.
Le premier enregistrement est l'enregistrement numéro 1.
Exemple:Fichier des adresses.
Créer une structure Adresse, on utilise <VBFixedString( )> pour fixer la longueur.
Public Structure Adresse
< VBFixedString (20)> Dim Nom As String
< VBFixedString (20)> Dim Rue As String
< VBFixedString (20)> Dim Ville As String
End Structure
Dim FileNum As Integer, RecLength As Long, UneAdresse As Adresse
RecLength = Len (UneAdresse)
FileNum = FreeFile
FileOpen (FileNum, " MONFICHIER.DAT " , OpenMode. Random , , , RecLength)
|
Pour écrire des données sur le second enregistrement par exemple:
UneAdresse. Nom = " Philippe "
UneAdresse. Rue = " Grande rue "
UneAdresse. Ville = " Lyon "
FilePut (FileNum, UneAdresse,2 )
|
Dans cette ligne de code, 'FileNum' contient le numéro utilisé par la fonction FileOpen pour ouvrir le fichier, 2 (un Long) est le numéro de l'enregistrement ou est copié la variable 'UneAdresse' et 'UneAdresse' est une variable déclarée en tant que type Adresse défini par l'utilisateur. Cela écrase l'enregistrement 2 s'il contenait quelque chose.
Pour écrire à la fin du fichier, ajouter un enregistrement il faut connaître le nombre d'enregistrement et écrire l'enregistrement suivant.
Pour connaître le nombre d'enregistrement, il faut diviser la longueur du fichier par la longueur d'un enregistrement.
last = FileLen (" MONFICHIER.DAT " ) / RecLength
|
On ajoute 1 pour créer un nouvel enregistrement.
FilePut (FileNum, UneAdresse,last+ 1 )
|
Pour lire un enregistrement (le premier par exemple):
FileGet (FileNum, UneAdresse, 1)
|
Attention Option Strict doit être à false .
Si option Strict est à True, la ligne qui précède génère une erreur car le second argument attendu ne peut pas être une variable 'structure'. Pour que le second argument de FileGet (Une adresse) soit converti dans une variable Structure automatiquement Option Strict doit donc être à false. (Il doit bien y avoir un moyen de travailler avec Option Strict On et de convertir explicitement mais je ne l'ai pas trouvé)
Remarque: si le fichier contient 4 enregistrements, on peut écrire le 10ème enregistrement, VB ajoute entre le 4ème et le 10ème, 5 enregistrements vides. On peut lire un enregistrement qui n'existe pas, cela ne déclenche pas d'erreur.
Le numéro d'enregistrement peut être omis dans ce cas c'est l'enregistrement courant qui est utilisé.
On positionne l'enregistrement courant avec Seek:
Exemple: Lire le 8ème enregistrement:
Seek (FileNum,8)
FileGet (FileNum,Une Adresse)
|
Suppression d'enregistrements.
Vous pouvez supprimer le contenu d'un enregistrement en effaçant ses champs (enregistrer à la même position des variables vides), mais l'enregistrement existe toujours dans le fichier.
Pour supprimer totalement un enregistrement.
- Créez un nouveau fichier.
- Copiez tous les enregistrements valides du fichier d'origine dans le nouveau fichier (pas ceux qui sont vides).
- Fermez le fichier d'origine et utilisez la fonction Kill pour le supprimer.
- Utilisez la fonction Rename pour renommer le nouveau fichier en lui attribuant le nom du fichier d'origine.
V-AC-5-c. Fichier binaire en VB
Dans les fichiers binaires on travaille sur les octets.
La syntaxe est la même que pour les fichiers Random, sauf qu'on travaille sur la position d'un octet et non sur un numéro d'enregistrement.
Pour ouvrir un fichier binaire:
FileOpen(FileNumber, FileName, OpenMode.Binary)
FileGet et FilePut permettent de lire ou d'écrire des octets .
FileOpen (iFr, ReadString, OpenMode. Binary )
MyString = New String (" " c, 15)
FileGet (iFr, MyString)
FileClose (iFr)
MsgBox (MyString)
|
Le fait de créer une variable de 15 caractères et de l'utiliser dans FileGet permet de lire 15 caractères.
V-AC-6. Utilisation du Contrôle RichTextBox
Un contrôle RichTextBox est un contrôle qui contient du texte enrichi qui peut être modifié. On rappelle que du texte présent dans un contrôle RichTextBox peut être enregistré ou lu très simplement avec les méthodes .SaveFile et .LoadFile.
Le texte peut être du texte brut ou du RTF.
Comment enregistrer cetexte dans un fichier sur disque?
richTextBox1. SaveFile (FileName, RichTextBoxStreamType. PlainText )
|
Si on remplace .PlainText par .RichText c'est le texte enrichi et non le texte brut qui est enregistré
Pour lire un fichier il faut employer .LoadFile avec la même syntaxe.
Simple, non!!!
V-AC-7. Lire ou écrire des octets ou du XML
BinaryWriter et BinaryReader permettent d'écrire ou de lire des données binaires.
XMLTextWriter et XMLTextReader écrit et lit du Xml.
Pour enregistrer un tableau, un objet, Vb.Net propose aussi la Sérialization (voir ce chapitre).
V-AC-8. Boîte de dialogue pour choix de fichier
Taper:
Dim dialogOpen As New OpenFileDialog
With DialogOpen
. InitialDirectory = " C: "
. Title = " Choisir un fichier "
. Filter = " Fichiers LDF(*.ldf)|*.ldf "
. ShowDialog ()
If Err . Number = 32755 Then Exit Sub
If Len (. FileName ) = 0 Then Exit Sub
Dim sFile As String = . FileName
End With
|
Vous avez le nom du fichier à ouvrir, vous devez écrire le code pour l'ouvrir avec un Open...
SaveFileDialog existe aussi.
V-AC-9. Stream et fichier aléatoire avec structure
Comment enregistrer, lire, effacer des données (qui sont dans une variable structurée) dans un fichier binaire:
Sans utiliser de FileOpen FilePut, FileGet mais en utilisant plutôt des FileStream (un BinaryReader et un BinaryWriter). On reste dans le Framework .Net.
Par Bruno Chappe.
Débutant s'abstenir.
Cette syntaxe est entièrement écrite en VB .NET 2005, et n'utilise que des objets avec méthodes et propriétés issue de VB .NET 2005.
On crée une Structure 'personne', une Class 'myBinaryReader', une Class 'myBinaryWriter' permettant de lire et d'enregistrer des 'personne'.
'System.IO doit être importé dans l'entête de votre module.
ETAPE N°1 : Créer la structure et les classes binaryReader et binaryWriter personnalisées.
Structure personne
Public pNom As String
Public pPrenom As String
Public pAge As Integer
Public pMarie As Boolean
Sub New (ByVal myNom As String , ByVal myPrenom As String , ByVal myAge As Integer, ByVal myMarie As Boolean)
Me. pNom = myNom
Me. pPrenom = myPrenom
Me. pAge = myAge
Me. pMarie = myMarie
End Sub
End Structure
Class myBinarywriter
Inherits System. IO . BinaryWriter
Sub New ( ByVal st1 As System. IO . Stream )
MyBase. New (st1)
End Sub
Overloads Sub write ( ByVal e As personne )
MyBase. Write (e. pNom . PadRight (15))
MyBase. Write (e. pPrenom . PadRight (15))
MyBase. Write (e. pAge )
MyBase. Write (e. pMarie )
End Sub
End Class
Class myBinaryreader
Inherits System. IO . BinaryReader
Sub New ( ByVal st2 As System. IO . Stream )
MyBase. New (st2)
End Sub
Function readpersonne () As personne
Dim pNom As String = MyBase. ReadString
Dim pPrenom As String = MyBase. ReadString
Dim pAge As Integer = MyBase. ReadInt32
Dim pMarie As Boolean = MyBase. ReadBoolean
readpersonne = New personne (pNom, pPrenom, pAge, pMarie)
End Function
End Class
|
ETAPE N° 2 : Utilisation des classes personnalisées.
***Ecrire un enregistrement
DEBUT
Dim myFile as String
Dim position As Integer
Dim maPersonne As personne
With maPersonne
. pNom =
. pPrenom =
. pAge =
. pMarie =
End With
Dim fs As FileStream = File. Open (myFile, FileMode. Append , FileAccess. Write , FileShare. None )
Dim fs As FileStream = File. Open (myFile, FileMode. Open , FileAccess. Write , FileShare. None )
Dim bw As New myBinarywriter (fs)
fs. Seek (position, SeekOrigin. Begin )
bw. write (maPersonne)
bw (). Close
fs (). Close
|
FIN
***Lire un enregistrement
DEBUT
Dim myFile as String
Dim maPersonne As personne
Dim fs As FileStream = File. Open (myFile, FileMode. Open , FileAccess. Read , FileShare. None )
Dim br As New myBinaryreader (fs)
fs. Seek (position, SeekOrigin. Begin )
Do Until fs. Position = fs. Length
myPersonne = br. readpersonne
Loop
br (). Close
fs (). Close
|
FIN
***Supprimer un enregistrement
Au préalable il faut marquer l'enregistrement à effacer en utilisant la procédure décrite plus haut pour modifier un enregistrement. Pour cela on peut faire soit comme dans le TP en utilisant un champ « supprimé »de notre structure que l'on marque à True soit on écrit un enregistrement vide par-dessus l'enregistrement que l'on veut effacer (en affectant « Nothing » au premier champ de l'enregistrement par exemple). En résumé, n'importe quoi qui nous permet de repérer au moment de la réécriture du fichier, que cet enregistrement ne doit pas être recopié.
Commencer par créer une copie du fichier original (Ne pas oublier de faire des tests sur l'existence du fichier).
Dim fi As New FileInfo (myFile)
Dim newFile As String = myFile & “. bck ”
fi. CopyTo (newFile)
Dim fsR As FileStream = File. Open (newFile, FileMode. Open , FileAccess. Read , FileShare. None )
Dim fsW As FileStream = File. Open (myFile, FileMode. Create , FileAccess. Write , FileShare. None )
Dim br As New myBinaryreader (fsR)
Dim bw As New myBinarywriter (fsW)
Dim maPersonne As personne
Do Until fsR. Position = fsR. Length
maPersonne = br. readpersonne
bw. write (maPersonne)
End If
Loop
br. Close ()
bw. Close ()
fsR. Close ()
fsW. Close ()
File. Delete (newFile)
|
ANNEXE : Comment calculer la valeur de la variable « position » utilisée dans la méthode seek de notre FileStream.
Nous avons besoin de 3 éléments : la longueur totale du fichier en octets, la taille d'un enregistrement en octets, le numéro de l'enregistrement que l'on souhaite modifier/remplacer/effacer.
Longueur totale du fichier en octets:
Dim fi as New FileInfo (myFile)
Dim longueurFichier As Long
longueurFichier = fi. length
|
Taille d'un enregistrement en octets
Dim nbEnreg As Integer
Dim tailleEnreg as Integer
tailleEnreg = longueurFichier / nbEnreg
|
Pointer directement dans le fichier à l'octet voulu pour l'écriture.
Autrement dit, calculer la variable "position" pour pouvoir l'utiliser dans la méthode seek.
Il suffit de multiplier le numéro de l'enregistrement à écrire (le premier enregistrement doit avoir l'indice 0) par la taille d'un enregistrement.
Ainsi par exemple, si j'ai un fichier de 120 octets avec 12 enregistrements (de 0 à 11), cela me fait des enregistrements de 10 octets de long. Si je veux aller modifier le 4ème enregistrement, ma variable position sera égale à 40 (4*10).
Il ne me reste plus qu'à déplacer le pointeur dans mon flux avant d'écrire ma variable, en utilisant :
fs. Seek (position, SeekOrigin. Begin )
|
Remarque: Le code proposé dans l'exemple permet de créer un enregistrement de 37 octets par « ligne » pour autant que l'on n'utilise pas de caractères accentués. Il faut ajouter 1 octet pour chaque caractère accentué utilisé dans les zones de texte et ce malgré l'usage de la fonction PadRight(15).
L'usage de Seek tel que décrit dans le même chapitre en devient impossible.
Comment corriger cela ?
V-AD. Travailler sur les répertoires et fichiers
Il est probablement nécessaire de lire le chapitre VI sur les Classes avant de lire celui-ci.
Comment créer, copier effacer des répertoires (ou dossiers)?
Avec les classes DirectoryInfo et Directory.
Avec la classe Path.
Avec la classe Environment.
Avec My.Computer.FileSystem en VS 2005.
Avec les Classes de VisualBasic.
Comment créer une boite de dialogue 'choix de répertoire' en VB2005?
V-AD-1. Classe DirectoryInfo et la Classe Directory du Framework
Pour travailler sur les dossiers (ou répertoires), il faut au préalable taper:
Imports System.IO
La classe Directory est utilisée pour travailler sur un ensemble de dossier, la Classe DirectoryInfo donne des renseignements sur un dossier particulier (Après instanciation ).
La Classe Directory possède les méthodes suivantes.
Exists |
Teste si le dossier existe.
|
CreateDirectory |
Crée le dossier |
Delete |
Efface le dossier |
Move |
Déplacement de dossier |
GetCurrentDirectory |
Retourne le dossier de travail de l'application en cours
|
SetCurrentDirectory |
Définit le dossier de travail de l'application. |
GetDirectoryRoot |
Retourne le dossier racine du chemin spécifié. |
GetDirectories |
Retourne le tableau des sous dossiers du dossier spécifié. |
GetFiles |
Retourne les fichiers du dossier spécifié. |
GetFilesSystemEntries |
Retourne fichier et sous dossier avec possibilité d'un filtre. |
GetLogicalDrives |
Retourne les disques |
GetParent |
Retourne le dossier parent du dossier spécifié. |
La Classe Directory est statique: on l'utilise directement.
Exemple:
Afficher dans une ListBox les sous-dossiers (répertoires) du répertoire de l'application:
Dim SousDos () As String = Directory. GetDirectories (Directory. GetCurrentDirectory )
Dim Dossier As String
For Each Dossier In SousDos
List1. Items . Add (Dossier)
Next
|
Afficher dans une ListBox les sous-dossiers et fichiers.
On utilise ici la récursivité. Pour chaque sous-répertoire, on appelle la routine elle même.
Imports System. IO
Sub AfficheTree ( ByVal myDir As String , ByVal Optional Niveau As Integer = 0)
List1. Items . Add (New String (" " , niveau * 2) & myDir)
For Each fichier As String In Directory. GetFiles ( myDir)
List1. Items . Add (New String (" " , niveau * 2+ 2) & fichier)
Next
For each sousRepertoire As String In Directory. GetDirectories ( myDir)
AfficheTree (sousRepertoire, niveau+ 1)
Next
End Sub
|
La variable niveau permet de pratiquer une indentation :New String (" ", niveau*2) produit une chaîne d'espace de longueur niveau *2.
On appelle cette routine avec AfficheTree (c:\myprogramme", 0) 'Pour tester éviter "c:\" car c'est très très long!!! on le fait tous pour tester!!
Directory.GetFiles et Directory.GetDirectories acceptent un argument supplémentaire qui fait office de filtre.
Directory.GetFiles( myDir, "*.txt") 'pour ne voir que les fichiers .txt.
Afficher dans une ListBox les exécutables d'un répertoire et de ses sous-répertoires.
Ici on utilise un argument supplémentaire qui permet de rechercher dans les sous répertoires.
For Each file As String In Directory. GetFiles (" c:\windows " , " *.exe " , System. IO . SearchOption . AllDirectries ))
List1. Items . Add (file)
Next
|
Génial , non? quelle économie de code!!
En plus il y a des méthodes permettant de retourner dans une collection IEnumerable la liste des fichiers (Directory.EnumerateFiles) ou la liste des répertoires (Directory.EnumerateDirectories) d'un chemin.
Exemple pour récupérer la liste des fichiers et l'afficher dans un ListBox:
Dim files1 As IEnumerable = _
Directory. EnumerateFiles (" c:\Article_dvp\global " , " * " , SearchOption. AllDirectories )
For Each f As String In files1
ListBox1. Items . Add (f)
Next
|
Afficher les disques présents dans une ListBox .
Imports System. IO
For Each disque As String In Directory. GetLogicalDrives ()
List1. Items . Add (Disque)
Next
|
Afficher dans une ListBox les fichiers .jpg d'un répertoire.
Dim dirInfo As New System. IO . DirectoryInfo (" C:\Nos Images\sicile " )
Dim file As System. IO . FileInfo
Dim files () As System. IO . FileInfo = dirInfo. GetFiles (" *.jpg " )
If (files IsNot Nothing ) Then
For Each file In files
ListBox1. Items . Add (file. FullName )
Next
End If
|
Changer le répertoire courant, effacer un sous-répertoire.
Directory. SetCurrentDirectory (" c:\mydirectory " )
Directory. Delete (c:\ otherdirectory" ) 'efface ce répertoire s'il est vide
Directory. Delete (c:\ otherdirectory" , True) 'efface ce répertoire ses fichiers et sous-répertoires.
|
Ah!! nostalgique du DEL *.*
Il y a d'autres méthodes pour obtenir des infos des répertoires ou des fichiers et les modifier: GetCreationTime, GetLastAccesTime, GetLastWtriteTime et les Set.. correspondants.
Exemple permettant de voir la date de création d'un fichier:
Dim d As String = Directory. GetCreationTime (" c:\Article_dvp\global\Thumbs.db " )
|
La Classe DirectoryInfo possède les propriétés suivantes.
Name Nom du dossier (sans extension)
Full Name Chemin et nom du dossier
Exists
Parent Dossier parent
Root Racine du dossier
|
La Classe DirectoryInfo n'est pas statique: il faut instancier un dossier avant de l'utiliser.
Il y a aussi les méthodes suivantes:
Create, Delete, MoveTo
CreateSubdirectory
GetDirectories Retourne les sous-dossiers
GetFiles Retourne des fichiers
GetFileSystemInfos
|
Exemple:
Afficher le répertoire parent d'un dossier:
Dim D As DirectoryInfo
D= New DirectoryInfo ( MonDossier)
MsgBox (D. Parent . ToString )
|
Créer un répertoire:
Dim D As DirectoryInfo
D= New DirectoryInfo ( MonDossier)
D. CreateSubdirectory (" monsousdossier " )
|
Effacer un répertoire et ses sous-répertoires:
Dim D As DirectoryInfo
D= New DirectoryInfo ( MonDossier)
D. Delete (True )
|
V-AD-2. Classe Path
La Classe statique Path a des méthodes simplifiant la manipulation des répertoires:
Exemple:
Si C= " C:\Windows\MonFichier.txt "
Path. GetDirectoryName (C)
Path. GetFileName (C) retourne " Monfichier.txt "
Path. GetExtension (C) retourne " .txt "
Path. GetFileNameWithoutExtension (C) retourne " MonFichier "
Path. PathRoot (C) retourne " c:\ "
|
Il y a aussi les méthodes GetFullPath ChangeExtension, Combine, HasExtension...
GetFullPath: Transforme un chemin relatif en chemin absolu à l'aide du répertoire courant.
Path.GetFullPath("monAppli.exe")) retourne "C:\MonRep\monAppli.exe" si le répertoire courant est "C:\MonRep"
Combine: combine bout à bout un chemin et un nom de fichier
Path.Combine("C:\MonRep", "monAppli.exe")) retourne "C:\MonRep\monAppli.exe"
V-AD-3. Classe DriveInfo
Nouveauté en VB 2005, la Classe DriveInfo :
Pour un disque particulier, il faut instancier un DriveInfo avec la lettre du drive, ensuite, on a accès à toutes les propriétés du lecteur.
Dim di As New DriveInfo (" c: " )
di. Name retourne le nom du lecteur ( " c: " ici)
VolumeLabel Nom (label) du lecteur (en lecture écriture)
DriveType ( Fixed, Removal, CDRom, Ram, Networl, Unknown)
DriveFormat (NTFS, Fat32)
TotalSize, TotalFreeSpace, AvailableFreeSpace
|
DriveInfo.GetDrives retourne tous les disques installées
For Each di As DriveInfo in DriveInfo. GetDrives ()
If di. IsReady Then
MsgBox (di. VolumeLabel )
End if
Next
|
V-AD-4. Classe Environment
Donne des informations concernant l'environnement et la plate-forme en cours ainsi que des moyens pour les manipuler. Par exemple: les arguments de la ligne de commande, le code de sortie, les paramètres des variables d'environnement, le contenu de la pile des appels, le temps écoulé depuis le dernier démarrage du système ou le numéro de version du Common Language Runtime mais aussi certains répertoires .
Environment. CurrentDirectory
Environment. MachineName
Environment. OsVersion
Environment. SystemDirectory
Environment. UserName
|
La fonction GetFolderPath avec un argument faisant partie de l'énumération SpecialFolder retourne le répertoire d'un tas de choses:
Exemple: Quel est le répertoire Système?
Environment. GetFolderPath (Environment. SpecialFolder . System )
|
En vb 2010 on trouve les répertoires:
Cookies
CDBurning
Desktop
Favories
History
Programs
MyMusic
MyPicture
Recent
SendTo
System
Templates
Personal (Mydocuments)
ProgramFiles
UserProfile
CommonDocuments, CommonMusic, CommonPictures, CommonVideos
MyVideos
Ressources
Windows.
Comment récupérer le nom des disques?
Dim drives As String () = Environment. GetLogicalDrives ()
|
Comment récupérer la ligne de commande?
Dim arguments As String () = Environment. GetCommandLineArgs ()
|
ou avec My:
ListBox1. DataSource = My. Application . CommandLineArgs . ToArray
|
V-AD-5. Classe My.Computer.FileSystem en VS 2005
En VS 2005 la classe My.Computer.FileSystem simplifie énormément les choses:
les méthodes CopyDirectory, CreateDirectory, DeleteDirectory, DirectoryExits permettent de copier, créer, effacer un répertoire ou de voir s'il existe. Il existe aussi RenameDirectory et MoveDirectory.
Exemple :
Afficher dans une MsgBox True si le répertoire 'c:\MyApplication\' existe.
MsgBox (My. Computer . FileSystem . DirectoryExists (" c:\MyApllication\ " ). ToString )
|
Copier un répertoire dans un autre:
My. Computer . FileSystem . CopyDirectory (" c:\a\ " , " c:\b\ " )
|
Afficher la liste des répertoires qui sont sous c:\; ici on utilise GetDirectories qui retourne une collection des répertoires.(count contient le nombre des répertoires, item () les noms.
Dim i As Integer
For i = 0 To My. Computer . FileSystem . GetDirectories (" c:\ " ). Count - 1
ListBox1. Items . Add (My. Computer . FileSystem . GetDirectories (" c:\ " ). Item (i))
Next i
|
SpecialDirectories permet de connaître certains répertoires spéciaux comme Programs, My Documents, My Music..
Exemple:
MsgBox (My. Computer . FileSystem . SpecialDirectories . CurrentUserApplicationData )
|
My.Computer.FileSystem.Drives est une collection contenant les disques présents.
On peut rechercher les fichiers qui contiennent un certain texte et afficher leurs noms dans une listBox.
Grâce à My.Computer.FileSystem.FindInFiles (Répertoire, texteàchercher, respectdelacasse, tyderecherche)
Dim value As System. Collections . ObjectModel . ReadOnlyCollection (Of String ) = My. Computer . FileSystem . FindInFiles
_ (" c:\ " , " Open " , False , FileIO. SearchOption . SearchTopLevelOnly )
For Each name As String In value
ListBox1. Items . Add (name)
Next
|
V-AD-6. Les méthodes de l'espace Visual Basic
CurDir() retourne le chemin d'accès en cours.
MyPath = CurDir ()
MyPath = CurDir (" C " c)
|
Dir()
Retourne une chaîne représentant le nom d'un fichier, d'un répertoire ou d'un dossier qui correspond à un modèle ou un attribut de fichier spécifié ou à l'étiquette de volume d'un lecteur.
MyFile = Dir (" C:\WINDOWS\WIN.INI " )
MyFile = Dir (" C:\WINDOWS\*.INI " )
MyFile = Dir ()
MyFile = Dir (" *.TXT " , vbHidden)
MyPath = " c:\ "
MyName = Dir (MyPath, vbDirectory)
|
ChDrive change le lecteur actif. La fonction lève une exception si le lecteur n'existe pas.
MkDir crée un répertoire ou un dossier. Si aucun lecteur n'est spécifié, le nouveau répertoire ou dossier est créé sur le lecteur actif.
RmDir efface un répertoire ou un dossier existant.
ChDir change le répertoire par défaut mais pas le lecteur par défaut.
L'exécution de changements relatifs de répertoire s'effectue à l'aide de "..", comme suit :
ChDir("..") ' Remonte au répertoire parent.
FileCopy
Copier un fichier.
FileCopy (SourceFile, DestinationFile)
|
Rename
Renommer un fichier, un répertoire ou un dossier.
Rename (OldName, NewName)
|
FileLen donne la longueur du fichier, SetAttr et GetAttr pour modifier ou lire les attributs du fichier.
Result est une combinaison des attributs. Pour déterminer les attributs, utilisez l'opérateur And pour effectuer une comparaison d'opérations de bits entre la valeur retournée par la fonction GetAttr et la valeur de l'attribut. Si le résultat est différent de zéro, cet attribut est défini pour le fichier désigné. Par exemple, la valeur de retour de l'expression And suivante est zéro si l'attribut Archive n'est pas défini :
Result = GetAttr (FName) And vbArchive
|
V-AD-7. Boîte de dialogue 'Choix de répertoire' en VB2005
Il faut instancier un FolderBrowserDialog, indiquer le répertoire de départ (RootFolder), le texte de la barre (Description) et l'ouvrir avec ShowDialog.
Le répertoire sélectionné par l'utilisateur se trouve dans SelectedPath .
Dim fB As New FolderBrowserDialog
fB. RootFolder = Environment. SpecialFolder . Desktop
fB. Description = " Sélectionnez un répertoire "
fB. ShowDialog ()
If fB. SelectedPath = String . Empty Then
MsgBox (" Pas de sélection " )
Else
MsgBox (fB. SelectedPath )
End If
fB. Dispose ()
|
V-AD-8. Parcours de répertoires et de sous répertoires
Parcours de répertoires et sous répertoires:
On veut afficher dans une ListBox les noms des répertoires, sous-répertoires et fichiers en utilisant la récursivité:
On crée une routine AfficheTree qui affiche:
-Le nom du répertoire courant.
-Le nom des fichiers du répertoire courant.
-Qui parcourt les sous-répertoires et pour chacun d'eux appelle AfficheTree.
Imports System. IO
Sub AfficheTree ( ByVal myDir As String , ByVal Optional Niveau As Integer = 0)
List1. Items . Add (New String (" " , niveau * 2) & myDir)
For Each fichier As String In Directory. GetFiles ( myDir)
List1. Items . Add (New String (" " , niveau * 2+ 2) & fichier)
Next
For each sousRepertoire As String In Directory. GetDirectories ( myDir)
AfficheTree (sousRepertoire, niveau+ 1)
Next
End Sub
|
V-AD-9. Fichiers et répertoires avec Linq
Lire le nom des fichiers du répertoire courant avec Linq.(VB 2008)
Dim myFiles= From Files in My. Computer . fyleSystem . GetFile (CurDir)
Select Files
|
V-AE. Afficher correctement du texte
- Remarque sur le rafraîchissement de l'affichage.
- Comment afficher du texte, du numérique suivant le format désiré ?
- Comment utiliser les 'CultureInfo'?
V-AE-1. Remarque sur la mise à jour de l'affichage
La mise à jour de l'affichage d'un Label (comme les autres contrôles d'ailleurs) est effectuée en fin de Sub:
Si on écrit:
Dim i As Integer
For i = 0 To 100
Label1. Text = i. ToString
Next i
|
La variable i prend les valeurs 1 à 100, mais à l'affichage rien ne se passe pendant la boucle, VB affiche uniquement 100 à la fin.
Cela provient du fait qu'il y a une hiérarchie dans l'exécution des taches; on a l'impression que l'affichage à une priorité faible et qu'il est effectué en fin de Sub quand la totalité du code a été exécuté.
Si on désire voir les chiffres défiler avec affichage de 0 puis 1 puis 2... il faut rafraîchir l'affichage à chaque boucle avec la méthode Refresh():
Dim i As Integer
For i = 0 To 100
Label1. Text = i. ToString : Label1. Refresh ()
Next i
|
Une alternative est de mettre un Application.DoEvents() qui donne à Windows le temps de traiter les messages et de rafraîchir l'affichage.
V-AE-2. Afficher du texte
On a vu que pour afficher du texte il fallait l'affecter à la propriété 'Text' d'un label ou d'un textBox (ou pour des tests l'afficher sur la fenêtre 'console').
Pas de problème pour afficher des chaînes de caractères, par contre, pour les valeurs numériques, il faut d'abord les transformer en 'String' et les formater (définir les séparateurs, le nombre de décimales...) .
Ce n'est pas à proprement parler une conversion mais plutôt une mise en forme.
V-AE-2-a. ToString
On a déjà vu que pour afficher une variable numérique, il fallait la transformer en 'String' de la manière suivant:
MyDouble.ToString
Exemple: pour afficher dans un TextBox la valeur contenue dans la variable MyDouble:
MyTextBox.Text=MyDouble.ToString
ToString utilise le séparateur de la culture en cours (',' si vous être en culture française, '.' si vous ètes en culture anglaise.)
Mais ToString peut être surchargé par un paramètre appelé chaîne de format. Cette chaîne de format peut être standard ou personnalisée.
Chaîne de format standard:
Cette chaîne est de la forme 'Axx' ou A donne le type de format et xx le nombre de chiffre après la virgule. Le format est défini par la 'culture' en cours ( française, anglaise..)sur le thread courant.
Imports System
Imports System. Globalization
Imports System. Threading
Module Module1
Sub Main ()
Thread. CurrentThread . CurrentCulture = New CultureInfo (" en-us " )
Dim UnDouble As Double = 123456789
Console. WriteLine (" Cet exemple est en-US culture: " )
Console. WriteLine (UnDouble. ToString (" C " ))
Console. WriteLine (UnDouble. ToString (" E " ))
Console. WriteLine (UnDouble. ToString (" P " ))
Console. WriteLine (UnDouble. ToString (" N " ))
Console. WriteLine (UnDouble. ToString (" N4 " ))
Console. WriteLine (UnDouble. ToString (" F " ))
End Sub
End Module
|
La 'culture' en cours est utilisée; ainsi en français le format 'N' utilise le séparateur décimal ','.
Autre exemple:
S=(1.2).ToString("C") retourne en CurrentCulture Français (par défaut sur mon ordinateur):1,2€
Il existe aussi D pour décimal, G pour général X pour hexadécimal.
- Chaîne de format personnalisé:
On peut créer de toute pièce un format, on utilise pour cela les caractères suivants:
0 indique une espace réservé de 0
Chaque '0' est réservé à un chiffre. Affiche un chiffre ou un zéro. Si le nombre contient moins de chiffres que de zéros, affiche des zéros non significatifs. Si le nombre contient davantage de chiffres à droite du séparateur décimal qu'il n'y a de zéros à droite du séparateur décimal dans l'expression de format, arrondit le nombre à autant de positions décimales qu'il y a de zéros. Si le nombre contient davantage de chiffres à gauche du séparateur décimal qu'il n'y a de zéros à gauche du séparateur décimal dans l'expression de format, affiche les chiffres supplémentaires sans modification.
# indique un espace réservé de chiffre.
Chaque '#' est réservé à un chiffre. Affiche un chiffre ou rien. Affiche un chiffre si l'expression a un chiffre dans la position où le caractère # apparaît dans la chaîne de format ; sinon, n'affiche rien dans cette position.
Ce symbole fonctionne comme l'espace réservé au 0, sauf que les zéros non significatifs et à droite ne s'affichent pas si le nombre contient moins de chiffres qu'il n'y a de caractères # de part et d'autre du séparateur décimal dans l'expression de format.
. (point) indique l'emplacement du séparateur décimal (celui affiché sera celui du pays )
Vous devriez donc utiliser le point comme espace réservé à la décimale, même si vos paramètres régionaux utilisent la virgule à cette fin. La chaîne mise en forme apparaîtra dans le format correct pour les paramètres régionaux.
, (virgule) indique l'emplacement du séparateur de millier.
Séparateur de milliers. Il sépare les milliers des centaines dans un nombre de quatre chiffres ou plus à gauche du séparateur décimal.
"Littéral" la chaîne sera affichée telle quelle.
% affichera en pour cent.
Multiplie l'expression par 100. Le caractère du pourcentage (%) est inséré
E0 affiche en notation scientifique.
: et / sont séparateur d'heure et de date.
; est le séparateur de section : on peut donner 3 formats (un pour les positifs, un pour les négatifs, un pour zéro) séparés par ;
Exemple:
Chaîne de format '0000', avec le nombre 145 cela affiche '0145'
Chaîne de format '####', avec le nombre 145 cela affiche '145'
Chaîne de format '000.00', avec le nombre 45.2 cela affiche '045.20'
Chaîne de format '#,#', avec le nombre 12345678 cela affiche '12,345,678'
Chaîne de format '#,,' avec le nombre 12345678 cela affiche '12'
La chaîne de formatage' #,##0.00 ' veut dire obligatoirement 2 chiffres après le séparateur décimal et un avant:
Si on affiche avec ce format:
1.1 cela donne 1,10
.5 cela donne 0,50
4563 cela donne 4 563,00
Exemple:
Dim N As Double = 19. 95
Dim MyString As String = N. ToString (" $#,##0.00;($#,##0.00);Zero " )
|
Exemple 2:
Dim UnEntier As Integer = 42
MyString = UnEntier. ToString ( " Mon nombre " + ControlChars. Lf + " = # " )
|
Affiche:
Mon nombre
= 42
Pour mémoire on a aussi d'autres manières de transformer un numérique en String:
Dim num As Integer = CType ( chaine, String )
|
V-AE-2-b. Str() de Microsoft.VisualBasic est toujours accepté
Il permet de transformer une variable numérique et String, qui peut ensuite être affichée.
MyString= Str ( LeNombre)
Label1. Text = MyString
|
Pas de formatage et le séparateur décimal est le point..
V-AE-2-c. String.Format du Framework
Permet de combiner des informations littérales à afficher sans modification et des zones formatées.
Les arguments de String.Format se décomposent en 2 parties séparées d'une virgule.
- Chaîne de formatage entre guillemets: Exemple "{0} + {1} = {2}": les numéros indiquent l'ordre des valeurs.
- Valeurs à afficher dans l'ordre, la première étant d'indice zéro. Exemple= A, B, A+B
Exemple:
Si A= 3 et B= 5
MsgBox (String . Format (" {0} + {1} = {2} " ,A, B, A+ B)) affiche 3+ 5= 8
|
Autre exemple:
Dim MonNom As String = " Phil "
String . Format (" Nom = {0}, heure = {hh} " , MonNom, DateTime. Now )
|
Le texte fixe est "Nom =" et ", heure = ", les éléments de format sont « {0} » et « {hh} » et la liste de valeurs est MonNom et DateTime.Now.
Cela affiche: Nom = Phil Heure= 10
Là aussi on peut utiliser les formats:
- Prédéfinis: Ils utilisent là aussi les paramètres régionaux, . Ils utilisent C, D, E, F,G,N,P,R,X comme ToString.
MsgBox (String . Format (" {0:C} " ,- 456. 45 )) Affiche - 456,45€
MsgBox (String . Format (" {0:D8} " , 456)) Affiche 00000456 Décimal 8 chiffres
MsgBox (String . Format (" {0:P} " , 0. 14 )) Affiche 14% Pourcent
MsgBox (String . Format (" {0:X} " , 65535)) Affiche FFFF Hexadécimal
|
- Personnalisés: avec des # et des 0
MsgBox (String . Format (" {0:##,##0.00} " , 6553. 23 ))
|
La fonction Format de Microsoft.VisualBasic (pas la classe String.Format) fournit des fonctions similaires mais les arguments sont dans l'ordre inverse (valeur, chaîne de formatage) et il n'y a pas de numéro d'ordre et de{}!! C'est pratique pour afficher une seule valeur mais c'est quand même à eviter.
MyStr = Format (5459. 4 , " ##,##0.00 " )
MyStr = Format (334. 9 , " ###0.00 " )
MyStr = Format (5, " 0.00% " )
|
V-AE-3. CultureInfo
On se rend compte que l'affichage est dépendant de la CurrentCulture du Thread en cours.
Exemple:
Si la CurrentCulture est la 'CultureInfo Us' et que j'affiche avec le format 'C' (monétaire) cela affiche un $ avant, si je suis en 'CurrentCulture Français' cela affiche un € après.
Par défaut la CultureInfo est celle définie dans Windows, probablement 'fr-FR' sur votre ordinateur.
fr signifie français et FR signifie 'région France'; il existe fr-CH (Suisse), fr-BE (Belgique).
Dans en-US, en signifie anglais et US signifie USA.
On peut modifier la CurrentCulture par code (voir exemple plus haut).
Imports System. Threading
Thread. CurrentThread . CurrentCulture = New Globalization. CultureInfo (" en-us " )
|
On peut utiliser l'objet My.
MsgBox (My. Application . Culture . ToString )
(My. Application . ChangeCulture
|
On peut aussi modifier le cultureInfo uniquement sur une instruction ToString ou Format:
Dim d As Double= 12. 35
Dim s As String = d. ToString ( New CultureInfo (" en-US " )
|
En français par défaut:
Le séparateur de décimal numérique est le '.'
Exemple : 1.20
Le séparateur décimal monétaire est la ','
Exemple : 1,20€
V-AF. Méthode d'extension, Lambda expression
Ce sont des nouveautés de VB 2008, débutant passe ton chemin.
Méthodes d'extension.
Permet d'ajouter des fonctionnalités à un Type (sans devoir faire une Classe dérivée).
Exemple:
Soit le Type 'String', je veux y ajouter une méthode Print qui affichera la String sur la console:
Imports System. Runtime . CompilerServices
Module StringExtensions
< Extension ()> _
Public Sub Print (ByVal aString As String )
Console. WriteLine (aString)
End Sub
End Module
|
C'est le "ByVal aString As String" qui indique que c'est une extension sur les 'String'.
Comment utiliser la méthode Print?
Imports ConsoleApplication2. StringExtensions
Module Module1
Sub Main ()
Dim exemple As String = " Bonjour "
exemple. Print ()
exemple. ToUpper ()
exemple. ToUpper . Print ()
End Sub
End Module
|
Si on veut ajouter un paramètre à la méthode Print, il faut l'ajouter au premier paramètre qui lui indique le DataType.
< Extension ()> _
Public Sub PrintPonctuation (ByVal aString As String , ByVal punc As String )
Console. WriteLine (aString & punc)
End Sub
|
Ensuite pour l'utiliser:
Dim exemple As String = " Exemple "
exemple. PrintPonctuation (" . " )
|
Lambda Expression
Une expression lambda est une fonction permettant de calculer et retourner une valeur unique.
Exemple: Créons une expression lambda qui incrémente un Integer.
Création de la fonction:
Dim ajoute1 = Function (num As Integer) num + 1
|
Utilisation de la fonction dans la même sub:
Console. WriteLine (ajoute1 (5)) Affiche 6.
|
On dit que la fonction lambda 'ajoute1( num As Integer)' conduit à num+1.
On peut déclarer et utiliser la fonction en même temps:
Console. WriteLine ((Function (num As Integer) num + 1)(5))
|
Dans ce cas il n'y a pas de nom de fonction.
Attention:
On n'a pas de 'End Function'(dans les expressions lambda à une ligne) ni de 'Return' ni de 'As', on ne peut pas utiliser les génériques.
Si on veut déclarer l'expression lambda dans la tête du module afin d'avoir un accès public,
c'est plus complexe:
Class Window1
Delegate Function ajoute (ByVal num As Integer) As Integer
Public ajoute1 As ajoute = Function (num) num + 1
Private Sub Button_Click (ByVal sender As System. Object , ByVal e As System. Windows . RoutedEventArgs ) _
Handles Button. Click
MsgBox (ajoute1 (3). ToString )
End Sub
End Class
|
Voyons comment on peut passer à une Sub une fonction lambda en argument.
On crée une fonction 'testResult' qui a pour argument une valeur et une fonction lambda.
Cette fonction affiche "Success" ou "Failure" en fonction de la valeur True ou False
retournée par la fonction lambda qui a reçu la valeur.
Pour utiliser cette sub on l'appelle avec comme argument la valeur à tester et la fonction Lambda.
Module Module1
Sub Main ()
testResult (4, Function (num) num Mod 2 = 0)
testResult (5, Function (num) num > 10)
End Sub
Sub testResult (ByVal value As Integer, ByVal fun As Func (Of Integer, Boolean))
If fun (value) Then
Console. WriteLine (" Success " )
Else
Console. WriteLine (" Failure " )
End If
End Sub
End Module
|
En vb 2010 on peut créer une expression lambda sur plusieurs lignes, on ajoute dans ce cas un 'End Function'.
Dim paireoupas = Function (x)
If (x Mod 2= 0) Then
Return " paire "
Else
Return " Impair "
End If
End Function
Console. WriteLine (paireoupas (1))
|
En plus, on peut créer une Sub lambda.
V-AG. L'espace de nom 'My'.
Ce chapitre est placé ici car il ne concerne pas l'interface, mais il sera plutôt lu dans un second temps.
Cet espace de nom comporte des objets qui sont des chemins d'accès simplifiés à de nombreux domaines touchant l'application, l'ordinateur, les ressources, les imprimantes...
My qui est extrêmement pratique, est présent à partir de VB 2005 et uniquement dans VB (pas dans C#).
My: le SUPER RACCOURCI.
V-AG-1. My.Application
My.Application permet d'accéder rapidement aux propriétés de l'application en cours.
Vous pouvez ainsi récupérer des informations sur l'assembly, la culture (langue), de l'application.
Vous pouvez aussi avec My.Apllication.Info récupérer des informations sur le répertoire de travail le titre le copyrhigt de l'application.
MsgBox (My. Application . Culture . ToString )
My. Application . ChangeCulture (it- IT)
For Each F As System. Windows . Forms . Form In My. Application . OpenForms
F. Text + = " [ouvert] "
Next
My. Application . MinimumSplashScreenDisplayTime = 2000
ListBox1. DataSource = My. Application . CommandLineArgs . ToArray
MsgBox (My. Application . Info . DirectoryPath )
MsgBox (My. Application . Info . Title )
MsgBox (My. Application . Info . Version . ToString )
MsgBox (My. Application . Info . ProductName )
|
V-AG-2. My.Computer
My.Computer permet d'accéder aux propriétés de l'ordinateur, du hardware.
Aux ressources logicielles et/ou matérielles de l'ordinateur.
My.Computer.Audio : permet de jouer des fichiers wav, ainsi que les sons systèmes de windows.
My. Computer . Audio . Play (" c:\mysound.wav " )
My. Computer . Audio . Play (" c:\mysound.wav " , AudioPlayMode. BackgroundLoop )
My. Computer . Audio . Stop
|
My.Computer.Clipboard : permet de récupérer des informations sur le contenu du presse-papier, de récupérer et de définir son contenu.
If My. Computer . Clipboard . ContainsImage Then
PictureBox1. Image = My. Computer . Clipboard . GetImage
ElseIf My. Computer . Clipboard . ContainsText Then
TextBox1. Text = My. Computer . Clipboard . GetText
End If
|
My.Computer.Clock : permet de récupérer l'heure courante ainsi que le nombre de millisecondes écoulées depuis le démarrage.
MsgBox (My. Computer . Clock . LocalTime . ToString )
|
My.Computer.FileSystem: permet de trouver des répertoires et d'effectuer les opérations d'entrées/sorties standards.
On peut ainsi lire le chemin des répertoires habituels:
MsgBox (My. Computer . FileSystem . CurrentDirectory )
MsgBox (My. Computer . FileSystem . SpecialDirectories . MyDocuments )
MsgBox (My. Computer . FileSystem . SpecialDirectories . CurrentUserApplicationData )
MsgBox (My. Computer . FileSystem . SpecialDirectories . AllUsersApplicationData )
MsgBox (My. Computer . FileSystem . SpecialDirectories . Programs )
|
Il y a aussi Destock, MyMusic, MyPictures, ProgramsFiles.
Récupérer le nom du premier disque:
MsgBox (My. Computer . FileSystem . Drives . Item (0). ToString )
|
La collection Drives contient des items indiquant les disques.
GetDrives et GetDriveInfo permettent de récupérer une collection de disque présent, et des informations sur les disques.
Un répertoire existe t-il?
MsgBox (My. Computer . FileSystem . DirectoryExists (" c:\ " ). ToString )
|
De même pour un fichier:
MsgBox (My. Computer . FileSystem . FileExists (" c:\myfiel.txt " ). ToString )
|
Possibilité de copier, créer, effacer, déplacer répertoires ou fichiers:
Il y a:
CopyDirectory
DeleteDirectory
RenameDirectory
MoveDirectory
CreateDirectory
et
CopyFile
DeleteFile
RenameFile
MoveFile
Exemple: copie d'un répertoire:
My. Computer . FileSystem . CopyDirectory (sourcedirectory, destinationdirectory)
|
On peut ajouter 2 paramètres, pour afficher une boite de dialogue qui indique la progression de la copie et pour générer une interruption si l'utilisateur annule le processus (il faut dans ce cas que le code soit dans un Try Catch).
Voir les sous répertoires:
My. Computeur . FileSystem . GetDirectories (" c:\ " ). item (0)
|
Afficher dans ListBox1 tous les répertoires qui sont dans C:
ListBox1. DataSource = My. Computer . FileSystem . GetDirectories (" c:\ " )
|
GetFiles fait de même avec les fichiers et GetDrives pour les disques.
Mettre le contenu d'un fichier texte dans une variable:
Dim LeTexte As String = My. Computer . FileSystem . ReadAllText (" c:\devicetable.log " )
|
(Il existe aussi WriteAllText, ReadAllBytes et WriteAllBytes)
FindInFiles permet de retrouver les fichiers contenant un texte.
Dim list As System. Collections . ObjectModel . ReadOnlyCollection (Of String )
list = My. Computer . FileSystem . FindInFiles (" C/ " , " Chaîne à chercher " , True , FileIO. SearchOption . SearchAllSubDirectories )
|
My.Computer.Info : Obtient des informations concernant l'ordinateur et le système d'exploitation (mémoire vive libre, nom de l'os, version de l'os, etc).
MsgBox (My. Computer . Info . TotalPhysicalMemory . ToString )
|
Il y a aussi AvailablePhysicalMemory, TotalPhysicalMemory, TotalVirtualMemory OSVersion, OSFullName..
My.Computer.Keyboard : permet de tester l'état des touches CTRL, ALT, etc… et de simuler l'appuie de touche grâce à la méthode Sendkeys.
MsgBox (My. Computer . Keyboard . AltKeyDown . ToString )
My. Computer . Keyboard . SendKeys (" a " )
|
My.Computer.Mouse : permet de récupérer des informations sur la souris (présence de la souris, présence de molette, boutons inversés, etc.)
MsgBox (My. Computer . Mouse . WheelExists . ToString )
|
My.Computer.Name : récupère le nom de l'ordinateur.
MsgBox (My. Computer . Name . ToString )
|
My.Computer.Network : permet de télécharger et d'uploader des fichiers, de vérifier si l'ordinateur est connecté à Internet, d'effectuer des pings, et de récupérer les évènements lors des connexions et déconnexions.
Charger un fichier à partir du réseau:
My.Computer.Network.DownloadFile(AdresseCompleteFichierACharger, DestinationFileNane)
With My. Computer . Network
If . IsAvailable And . Ping (txtIpAdress. text ) Then
. UploadFile (" c:\filetupload.ext " , txtIpAdress. Text )
End If
End With
|
My.Computer.Ports : permet de récupérer la liste des ports séries, et de les ouvrir.
My.Computer.Printers : permet de récupérer la liste des imprimantes installées et de définir l'imprimante par défaut. (absent dans la version bêta)
My.Computer.Registry : permet de manipuler la base de registre facilement.
My.Computer.Screen : permet de récupérer les informations concernant les écrans installés.
MsgBox (My. Computer . Screen . Bounds . Height . ToString )
|
V-AG-3. My.User
My.User permet de récupérer les informations sur l'utilisateur courant.
My.User.Identity.Name
My.User.IsInRole("Administrators") 'contient l'administrateur
V-AG-4. My.Ressources
My.Ressources permet de manipuler et récupérer très facilement les ressources incorporées à l'assembly.
Mettre une ressource image dans le plan BackGround d'un formulaire:
Me. BackgroundImage = My. Resources . Form1Background
|
Mettre une ressource image dans le plan BackGround d'un bouton:
MyButton. BackGroundImage = MonProgramme. My . Ressources . Ressources . button_Blue
|
Mettre une ressource icône comme icône d'un formulaire:
Me. Icon = My. Resources . MyIcon
|
Jouer un son qui est dans les ressources.
My. Computer . Audio . Play (My. Resources . Form1Greeting , AudioPlayMode. Background )
|
V-AG-5. My.Setting
My.Setting :fichiers de configuration.
En VB2005 vous pouvez créer des paramètres de type Color, Font, Point, Size:
My. Settings . MyFont = New Font (Me. Font , FontStyle. Italics )
|
Ce paramètre sera enregistré automatiquement lors de la fermeture de l'application (voir chapitre sur la configuration).
Quand vous exécuterez ensuite le programme, vous pourrez récupérer le paramètre:
TextBox1. Font = My. Settings . MyFont
|
V-AG-6. My.Forms
My.Forms: Donne accès à tous les formulaires. Si un formulaire se nomme HelpForm, pour l'afficher:
On peut étendre et personnaliser l'espace de nom My, mais c'est un peu complexe.
Les sources présentés sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © .
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la SACD.
|