Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence

Cours VB.NET

Date 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#
'attention  mois/jour/année
B - Autre manière de saisir une date, une heure:

Dim dateNaissance As New System.DateTime(1996, 6, 3, 22, 15, 0)    

'Année, mois, jour, heure, minute, seconde, et éventuellement millisecondes)
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) ' Retourne True.
D = IsDate(YourDate) ' Retourne True.
D = IsDate(NoDate) ' Retourne False.

V-AB-2. Afficher une date, une heure

Pour afficher les dates et heures simplement, il suffit d'utiliser .ToString

MsgBox(DateNaissance.ToString)    'Affichera  02/12/1951 11:00:00
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"))    'Affichera  Dimanche 2 décembre 1951

MsgBox(DateNaissance.ToString("hh:mm")    'Affichera  11:00

MsgBox(DateNaissance.ToString("dd/MM/yy")    'Affichera  02/12/51 

MsgBox(DateNaissance.ToString("%h)    
'Affichera  11   le caractère % est utilisé quand on affiche une seule donnée.
On peut enfin utiliser les méthodes de la classe DateTime!!

DateNaissance.ToLongDateString        'dimanche 02 décembre 1951

DateNaissance.ToShortDateString       '02/12/1951

DateNaissance.ToLongTimeString        '11:00:00

DateNaissance.ToShortTimeString       '11:00

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.

' Quel sera la date  dans 36 jours?.
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.

Answer=today.AddDay(36)

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=1951

I=System.DateTime.Now.Day    'donne le jour d'aujourd'hui (1 à 31)
(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    'I=0  car le 02/12/1951 est un dimanche.
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) 'Affiche date et heure

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)) 'Affiche False

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:

  • L'intervalle de temps à utiliser comme unité de la différence entre Date1 et Date2.
    DateInterval.Day pour obtenir le nombre de jours entre les 2 dates.

    DateInterval.Year pour obtenir le nombre d'années entre les 2 dates.

    ..

  • Date1
  • Date2
Exemple:

Afficher le nombre de jours entre une date donnée et la date du jour.

Dim DateS, Msg As String ' Declare les  variables.
Dim DateD As DateTime
DateS = InputBox("Entrer une date") 'Saisir une date : on récupère une string
DateD = CDate(DateS)                'Conversion de la string en DateTime
Msg = "Nombre de jour:"& DateDiff(DateInterval.Day, Now, DateD) 'différence en jours
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)

        ' Prendre le time zone local , la datetime de maintenant.
        'l'année actuelle
        Dim localZone As TimeZone = TimeZone.CurrentTimeZone
        Dim currentDate As DateTime = DateTime.Now
        Dim currentYear As Integer = currentDate.Year

        ' Affiche le fuseau local
        ' Affiche le fuseau de l'heure d'été.
        Console.WriteLine(dataFmt, "Nom du fuseau local:", _
            localZone.StandardName)
        Console.WriteLine(dataFmt, "Nom du fuseau de l'heure d'été:", _
            localZone.DaylightName)

        ' Affiche date et heure courantes
        'Affiche si l'heure d'été est en cours
        Console.WriteLine(vbCrLf & timeFmt, _
            "Date et heure courante:", currentDate)
        Console.WriteLine(dataFmt, "Heure d'été?", _
            localZone.IsDaylightSavingTime(currentDate))

        ' Prendre le temps universelle (UTC) et l'offset
        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)

        ' Prendre l'heure d'été.
        Dim daylight As DaylightTime = _
            localZone.GetDaylightChanges(currentYear)

        ' Affiche début et fin heure d'été puis le delta.
        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..

  • Il est exclu de faire des boucles vides:
    
    For i=0 to 100000    ' le temps écoulé est variable en fonction des machines..
    
    Next i
    

  • Autre méthode : on boucle tant que l'heure courante est inférieure à l'heure du départ+3s
    
    Dim t As DateTime=DateTime.Now
    
    Do While DateTime.Now <t.AddSeconds(3)
    
    Loop
    
    Mais cela accapare le processeur.



  • On peut utiliser un Timer et vérifier dans la procédure Tick si le temps est écoulé (avec les restrictions que l'on connait).
  • On peut utiliser Thread.Sleep (qui met le processus en cours en sommeil).
    
    System.Threading.Thread.Sleep(3000) 
    
    Le temps de sommeil du thread est en millisecondes: 3000 correspond à 3 secondes.



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?

15:21:45
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_Tick sera déclenché toutes les secondes.

    Timer1.Start()            'On démarre le Timer

End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Label1.Text = Now.ToLongTimeString    'Affiche l'heure format long.

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      'On déclare un FileInfo

Fi=New FileInfo( sNom)  'On instancie ce FileInfo avec comme paramètre le nom du fichier
Ensuite:

	Fi.Attributes And FileAttributes.ReadOnly    'Retourne True si le fichier est 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  'On déclare un FileInfo

Fi=New FileInfo( sNom)  'on instance ce FileInfo avec comme paramètre le nom du fichier

    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

   'on tente d'ouvrir un stream sur le fichier, s'il est déjà utilisé, cela déclenche une erreur.

   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") ' crée le fichier ou, si existe déja, écrase
Il existe une surcharge permettant de ne pas écraser mais d'ajouter à la fin du fichier:

Dim SW As New StreamWriter ("MonFichier.txt", True) ' crée ou si existe ajoute

Avec la classe File:

Dim SW As  StreamWriter=File.CreateText ("MonFichier.txt") ' crée ou si existe écrase

Dim SW As StreamWriter = File.AppendText("MonFichier.txt") ' crée ou si existe ajoute
Ensuite pour écrire 2 lignes:

SW.WriteLine ("Bonjour")

SW.WriteLine ("Monsieur")
Enfin on ferme:

SW.Close()

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:
  1. Utiliser ReadToEnd qui lit en bloc jusqu'à la fin.
  2. 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.
  3. 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.

  SW.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.

info 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"

    warning 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) ' Ouvre en lecture.
While Not EOF(1) ' Boucler jusqu'à la fin du fichier

Line = LineInput(1) ' Lire chaque ligne
Debug.WriteLine(Line) ' Afficher chaque ligne sur la console.
 

End While
FileClose(1) ' Fermer.
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


 

'Ouvrir le fichier, comme il n'existe pas, cela entraîne sa création
Dim FileNum As Integer, RecLength As Long,  UneAdresse As Adresse
' Calcul de la longueur de l'enregistrement 
RecLength = Len(UneAdresse)
' Récupérer le premier numéro de fichier libre.
FileNum = FreeFile
' Ouvrir le fichier.
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.

Dim last as long  'noter que le numéro d'enregistrement est un long

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)        'Créer une chaîne de 15 espaces
FileGet(iFr, MyString)                 ' Lire 15 caractères dans 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:"            'répertoire sur lequel s'ouvrira la boite

.Title = "Choisir un fichier"          'titre de la barre  

.Filter = "Fichiers LDF(*.ldf)|*.ldf"   'filtre, seules les fichiers LDF apparaîtront

.ShowDialog()                           ' on ouvre la boite de dialogue enfin

        'Retour après la fermeture de la boite de dialogue

If Err.Number = 32755 Then Exit Sub     'le bouton 'annuler' a t'il été cliqué?

If Len(.FileName) = 0 Then  Exit Sub     'aucun choix

Dim sFile As String = .FileName           'nom du fichier choisi ( avec extension) 

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.

'Créer la structure avec son constructeur spécifique 

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 

  

'Créer une classe de binarywriter personnalisée à partir de la classe binarywriter 
' native de vb 

Class myBinarywriter 

Inherits System.IO.BinaryWriter 

Sub New ( ByVal st1 As System.IO.Stream ) 

MyBase.New(st1) 

End Sub 

'PadRight est utilisé pour faire des chaînes de caractère de longueur  fixes 

'C'est indispensable pour pouvoir calculer la longueur des enregistrements 
' par la suite et avoir des enregistrements qui ont tous la même longueur 

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

  

'Créer une classe de binaryreader personnalisée à partir de la classe binaryreader 
' native de vb 

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

'Variable string stockant le chemin d'accès au fichier 

Dim myFile as String

'Si l'on veut écrire directement dans un enregistrement existant 
' (plutôt que d'écrire à la suite du fichier) 

'il faut au préalable récupérer le rang de l'enregistrement ou l'on veut commencer à écrire 

'et multiplier ce rang par la longueur d'un enregistrement (en octets). 
'Cette opération nous donne la position du premier octet à écrire dans le fichier. 

'Pour mémoire, la longueur d'un enregistrement en octet est égale à la taille du fichier en octet 

'divisé par le nombre d'enregistrements (Voir Annexe de ce document pour les explications) 

Dim position As Integer

'Déclarer une variable de type 'personne' et assigner les valeurs voulues à ses champs 

'Il est possible de travailler avec un tableau de structure, cela revient au même mais 

'est moins indispensable qu'avant vu que l'on peut aller écrire et lire directement dans le fichier 

Dim maPersonne As personne

With maPersonne

.pNom = 'valeur du champ

.pPrenom = 'valeur du champ

.pAge = 'valeur du champ

.pMarie = 'valeur du champ

End With

'Déclare le flux et le writer qui vont nous permettre d'écrire notre structure 

'Bien faire attention aux propriétés FileMode et FileAccess en fonction des opérations 

'que vous voulez effectuer 

'Si vous voulez écrire l'enregistrement à la suite des autres : 

Dim fs As FileStream = File.Open(myFile, FileMode.Append, FileAccess.Write, FileShare.None) 

'Si vous voulez re-ecrire/modifier un enregistrement : 

Dim fs As FileStream = File.Open(myFile, FileMode.Open, FileAccess.Write, FileShare.None) 

'Dans les 2 cas, remarquez ici que nous instancions un objet issue de la classe 
' que nous avons créé plus haut 
'et non pas un objet issue des classes natives de vb 

Dim bw As New myBinarywriter(fs)

'Nécessaire que si vous souhaitez écrire à un endroit précis dans le fichier 

' position indique la position de début d'écriture dans le flux (fs) et SeekOrigin.Begin 
' indiquant à partir de quel endroit du flux commencer la recherche de position 

fs.Seek(position, SeekOrigin.Begin) 

'Dans tous les cas, l'instruction ci-dessous écrit l'intégralité de notre structure 
' sous forme binaire dans le fichier 

bw.write(maPersonne)

'SURTOUT BIEN PENSER A FERMER LES FLUX ET WRITER 

bw().Close

fs().Close
FIN


***Lire un enregistrement

DEBUT

'Variable string stockant le chemin d'accès au fichier 

Dim myFile as String

'Déclarer la variable qui va recevoir les informations issues du fichier 

Dim maPersonne As personne

'Instancier un objet flux et un objet binaryReader 

'Remarquez le FileAcces.Read pour la lecture 

Dim fs As FileStream = File.Open(myFile, FileMode.Open, FileAccess.Read, FileShare.None)

'Objet instancié à partir de notre classe personnalisée myBinaryreader 

Dim br As New myBinaryreader(fs) 

'Si besoin d'aller lire un enregistrement précis 

fs.Seek(position, SeekOrigin.Begin) 'Mêmes paramètres que pour l'écriture

'Sinon, vous ferez probablement un traitement en boucle de tous les enregistrements du fichier 

Do Until fs.Position = fs.Length 'Faire jusqu'à ce que la position 
' dans le flux soit égale à la longueur total du flux

myPersonne = br.readpersonne

'Ici traitez les informations récupérées, par exemple pour afficher dans un listBox 

Loop

'SURTOUT BIEN PENSER A FERMER LES FLUX ET READER 

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) 'Créé newFile et copie myFile dedans 

'Ensuite on ouvre les 2 flux (1 en lecture et 1 en écriture) et les 2 binary (-reader & -writer)

Dim fsR As FileStream = File.Open(newFile, FileMode.Open, FileAccess.Read, FileShare.None) 

'Ici le paramètre FileMode.Create va faire que le fichier myFile va être recréé 
' par-dessus l'ancien fichier et l'écraser 

Dim fsW As FileStream = File.Open(myFile, FileMode.Create, FileAccess.Write, FileShare.None) 

'Après l'instruction ci-dessus on a donc un fichier myFile qui existe mais qui est vide 
' (sans avoir besoin de le supprimer d'abords et de le recréer ensuite), 
' prêt à recevoir les données du fichier newFile. 

Dim br As New myBinaryreader(fsR) 

Dim bw As New myBinarywriter(fsW) 

'On dimensionne une variable du type de notre structure 

Dim maPersonne As personne

'Faire une boucle sur le fichier en lecture 

Do Until fsR.Position = fsR.Length

maPersonne = br.readpersonne

'Si marquage de maPersonne n'indique pas qu'il faut effacer l'enregistrement alors :

bw.write(maPersonne)

End If

Loop

'Cette boucle va donc lire chaque enregistrement dans newFile, l'affecter dans 
' une variable structurée maPersonne et si cette variable ne contient pas 
' d'indicateur de suppression, l'écrire dans myFile. 
' A la fin de la boucle myFile contient donc tous les enregistrements de newFile sauf ceux marqués à supprimer. 

'On oubli pas de fermer les flux 

br.Close()

bw.Close()

fsR.Close()

fsW.Close()

'Et de supprimer le fichier newFile qui ne nous sert plus à rien 

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 'Renvoi un entier long représentant la taille totale en octet 
Taille d'un enregistrement en octets

Dim nbEnreg As Integer 'Au préalable il faut récupérer le nombre d'enregistrements, 
' par exemple lors d'une première lecture du fichier séquentielle, 
' en incrémentant un compteur par programmation.

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)

 

'Affiche le répertoire myDir

List1.Items.Add(New String (" ", niveau *2) & myDir)

 

'Affiche les fichiers

For Each fichier As String  In Directory.GetFiles( myDir)

    List1.Items.Add(New String (" ", niveau *2+2) & fichier)

Next

 

'Parcourt les sous-répertoires

For each sousRepertoire As String In Directory.GetDirectories( myDir)

    'Appel de manière récursive 'AfficheTree pour afficher le contenu des sous répertoires.

    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:


        ' récuperer la list des fichiers dans un répertoire
        Dim files1 As IEnumerable = _
            Directory.EnumerateFiles("c:\Article_dvp\global", "*", SearchOption.AllDirectories)
       'Mettre la liste dans une ListBox
        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") 'change le répertoire courant

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)  'retourne "C:\Windows"

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 'il parait qu'il faut bien tester s'il est ready!!

    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  'donne le répertoire courant : ou le processus en cours démarre.

Environment.MachineName       'Obtient le nom NetBIOS de l'ordinateur local.

Environment.OsVersion 'Obtient un Identificateur et le numéro de version de la plate-forme en cours.

Environment.SystemDirectory   'Obtient le chemin qualifié complet du répertoire du système

Environment.UserName          'Obtient le nom d'utilisateur de la personne qui a lancé le thread en cours.
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:

'Afficher dans une liste Box les arguments de la ligne de commande
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.

'vérifier si un fichier existe:

' Retourne "WIN.INI" si il existe.
MyFile = Dir("C:\WINDOWS\WIN.INI")

' Retourne le fichier spécifié par l'extension .
MyFile = Dir("C:\WINDOWS\*.INI")

'Un nouveau Dir retourne le fichier suivant
MyFile = Dir()

' On peut surcharger avec un attribut qui sert de filtre .
MyFile = Dir("*.TXT", vbHidden) ' affiche les fichiers cachés

' Recherche les sous répertoires.
MyPath = "c:\" ' Set the path.
MyName = Dir(MyPath, vbDirectory) 

ChDrive change le lecteur actif. La fonction lève une exception si le lecteur n'existe pas.

ChDrive("D")   

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.

MkDir("C:\MYDIR") 

RmDir efface un répertoire ou un dossier existant.

' Vérifier que le répertoire est vide sinon effacer les fichiers avec Kill.
RmDir ("MYDIR") 

ChDir change le répertoire par défaut mais pas le lecteur par défaut.

ChDir("D:\TMP")
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 = GetAttr(FName)

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)

 

'Affiche le répertoire myDir

List1.Items.Add(New String (" ", niveau *2) & myDir)

 

'Affiche les fichiers

For Each fichier As String  In Directory.GetFiles( myDir)

    List1.Items.Add(New String (" ", niveau *2+2) & fichier)

Next

 

'Parcourt les sous-répertoires

For each sousRepertoire As String In Directory.GetDirectories( myDir)

    'Appel de manière récursive 'AfficheTree pour afficher le contenu des sous répertoires.

    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

  1. Remarque sur le rafraîchissement de l'affichage.
  2. Comment afficher du texte, du numérique suivant le format désiré ?
  3. 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")'changement de culture
Dim UnDouble As Double = 123456789

Console.WriteLine("Cet exemple est  en-US culture:")
Console.WriteLine(UnDouble.ToString("C"))    'format monétaire (C) affiche $123,456,789.00
Console.WriteLine(UnDouble.ToString("E"))    'format scientifique (E) affiche     1.234568E+008
Console.WriteLine(UnDouble.ToString("P"))    'format %   (P)            affiche      12,345,678,900.00%
Console.WriteLine(UnDouble.ToString("N"))    'format nombre (N)    affiche      123,456,789.00
Console.WriteLine(UnDouble.ToString("N4"))   'format nombre (N) 4 chiffres après la virgule, affiche  123,456,789.0000
Console.WriteLine(UnDouble.ToString("F"))    'format virgule fixe (F) affiche       123456789.00

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")

' En page  U.S. English culture, MyString ="$19.95".
' En page  Française , MyString ="19,95€".

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") ' Returns "5,459.40".
MyStr = Format(334.9, "###0.00") ' Returns "334.90".
MyStr = Format(5, "0.00%") ' Returns "500.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")'passage en culture US culture

On peut utiliser l'objet My.

MsgBox(My.Application.Culture.ToString) 'affiche 'fr-FR'

(My.Application.ChangeCulture 'permettra de changer la culture )

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"
        ' Appel de  l'extension method Print.
        exemple.Print()

        ' Appel de la méthode d'instance  'ToUpper'.
        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() 
'On appelle une fonction en envoyant une valeur et une fonction lambda.
' La ligne affiche "Success" car 4 est pair. 
testResult(4, Function(num) num Mod 2 = 0) 
' La ligne affiche "Failure" car 5 n'est pas > 10.
testResult(5, Function(num) num > 10)
 End Sub 
 
' Sub testResult a 2 arguments, 'value' un Integer  et 'fun' la fonction lambda 
' On teste la fonction lambda 'fun(value)' 
' en fonction du resultat True ou False on affiche "Success" ou "Failure"
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

' Affiche 2.
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.

'Culture
MsgBox(My.Application.Culture.ToString) ' culture du thread en cours affiche 'fr-FR'
My.Application.ChangeCulture (it-IT) 'permettra de changer la culture 

'Formulaire
'My.Application.OpenForms qui retourne la collection des formulaires ouverts.
'Exemple: rajouter le texte 'ouvert' à la barre  des formulaires ouverts:
For Each F As System.Windows.Forms.Form In My.Application.OpenForms
F.Text += "[ouvert]"
Next

'modifier la durée de l'affichage de l'écran Splash
My.Application.MinimumSplashScreenDisplayTime = 2000 '<= A rajouter dans Application_New
'voir chapitre sur écran Splash

'Afficher dans une liste Box les arguments de la ligne de commande
ListBox1.DataSource = My.Application.CommandLineArgs.ToArray

'Afficher les infos de l'application
MsgBox(My.Application.Info.DirectoryPath) 'affiche le nom du répertoire ou est l'exécutable.
MsgBox(My.Application.Info.Title) 'affiche le titre de l'application, de l'exécutable.
MsgBox(My.Application.Info.Version.ToString) 'affiche le nom du répertoire ou est l'exécutable.
MsgBox(My.Application.Info.ProductName) 'affiche le nom de produit de l'application.

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) 'joue en boucle
My.Computer.Audio.Stop  'stop la boucle

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) 'Affiche date et heure

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)  'répertoire courant
MsgBox(My.Computer.FileSystem.SpecialDirectories.MyDocuments) 'répertoire documents
MsgBox(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData)'rep données utilisateur en cours
MsgBox(My.Computer.FileSystem.SpecialDirectories.AllUsersApplicationData)'rep données utilisateur en cours
MsgBox(My.Computer.FileSystem.SpecialDirectories.Programs) 'répertoire des programmes
Il y a aussi Destock, MyMusic, MyPictures, ProgramsFiles.


Récupérer le nom du premier disque:

MsgBox(My.Computer.FileSystem.Drives.Item(0).ToString)'affiche 'A:'
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) 'affiche True si c:\ existe.
De même pour un fichier:

MsgBox(My.Computer.FileSystem.FileExists("c:\myfiel.txt").ToString) 'affiche True si c:\myfile.txt existe.

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) 'permet de voir le premier sous répertoire.
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) 'affiche la mémoire physique
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)' teste si la touche Alt est enfoncée.

My.Computer.Keyboard.SendKeys("a")' simule l'appuie d'une touche.

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) 'affiche True s'il y a une molette.

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) 'voir la hauteur de l'écran


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:

My.Forms.HelpForm.Show()

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.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com