Cours VB.NET

Image non disponible


précédentsommairesuivant

V-AB. Travailler sur les dates, les heures, sur le temps

Image non disponible

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

 
Sélectionnez

Dim  dateNaissance As DateTime

dateNaissance= #12/02/1951#
'attention  mois/jour/année

B - Autre manière de saisir une date, une heure:

 
Sélectionnez

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:

 
Sélectionnez

DateNaissance = CDate("02/12/1951")

CDate converti donc une chaîne en dateTime. On peut aussi utiliser CType:

 
Sélectionnez

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 '/'.

 
Sélectionnez

If IsDate( MyString) Then..

Exemple de Microsoft:

 
Sélectionnez

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

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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!!

 
Sélectionnez

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:

 
Sélectionnez

Dim instance As New TimeSpan(ticks)

ou avec des heures, minutes, secondes, millisecondes.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

' 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

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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)

 
Sélectionnez

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é:

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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:

Image non disponible

Si l'utilisateur clique sur la flèche déroulante, il apparaît une fenêtre calendrier.

Image non disponible

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

 
Sélectionnez

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} Ã&#160; " & _
            "{1:dd-MM-yyyy HH:mm}, delta: {2}", _
            daylight.Start, daylight.End, daylight.Delta)
    End Sub


End Class

Affiche:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

Dim dateTime As DateTime
Dim destinationTimeZone As TimeZoneInfo
Dim returnValue As DateTime

returnValue = TimeZoneInfo.ConvertTime(dateTime, _
    destinationTimeZone)

La nouvelle classe DateTimeOffset permet de mieux gérer les applications qui utilisent les zones dates et heures.
Elle associe un DateTime à un Offset (différence entre heure locale et temps universel).

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

 
Sélectionnez

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:
     
    Sélectionnez
    
    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
     
    Sélectionnez
    
    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).
     
    Sélectionnez
    
    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

 
Sélectionnez

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)

Image non disponible

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:

Image non disponible

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.

 
Sélectionnez

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:

 
Sélectionnez

	
						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:?

 
Sélectionnez

	File.Move("c:\monText.txt", "d:\monText.txt")

Copier un fichier de c: vers d:?

 
Sélectionnez

	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)

 
Sélectionnez

	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:

 
Sélectionnez

File.Delete("d:\monText.txt")

Lire la totalité d'un fichier texte? (Framework 2)

 
Sélectionnez

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)

 
Sélectionnez

Dim myLines() As String =File.ReadAllLines("c:\monText.txt")

Lire et mettre dans un tableau les octets d'un fichier? (Framework 2)

 
Sélectionnez

	Dim myBytes() As Byte =File.ReadAllBytes("c:\monText.txt")

Un fichier est-il en lecture seule?

 
Sélectionnez

	If File.GetAttributes("c:\monText.txt") And FileAttributes.ReadOnly Then..

La Classe FileInfo possède les propriétés suivantes:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

	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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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?

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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

Avec la classe File:

 
Sélectionnez

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:

 
Sélectionnez

SW.WriteLine ("Bonjour")

SW.WriteLine ("Monsieur")

Enfin on ferme:

 
Sélectionnez

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:

 
Sélectionnez

Dim SR As New StreamReader ("MonFichier.txt")

Avec la Classe File:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

  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).
Image non disponible

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.
Image non disponible

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..
Image non disponible

En pratique:

Les fichiers séquentiels sont bien pratique pour charger une série de ligne, (toujours la même) dans une ListBox par exemple.

Faut-il utiliser les fichiers séquentiels ou random (à accès aléatoire, à accès direct) pour créer par exemple un petit carnet d'adresse?

Il y a 2 manières de faire:
  • Créer un fichier random et lire ou écrire dans un enregistrement pour lire ou modifier une adresse.
  • Créer un fichier séquentiel. A l'ouverture du logiciel lire séquentiellement toutes les adresses et les mettre dans un tableau (de structure). Pour lire ou modifier une adresse: lire ou modifier un élément du tableau. En sortant du programme enregistrer tous les éléments du tableau séquentiellement.(Enregistrer dans un nouveau fichier, effacer l'ancien, renommer le nouveau avec le nom de l'ancien).

Bien sur s'il y a de nombreux éléments dans une adresse, un grand nombre d'adresse, il faut utiliser une base de données.

Attention: Si on ouvre un fichier en écriture et qu'il n'existe pas sur le disque, il est crée.

Si on ouvre un fichier en lecture et qu'il n'existe pas, une exception est déclenchée (une erreur). On utilisait cela pour voir si un fichier existait: on l'ouvrait, s'il n'y avait pas d'erreur c'est qu'il existait. Mais maintenant il y a plus simple pour voir si un fichier existe (File.Exists).

Si on ouvre un fichier et que celui-ci est déjà ouvert par un autre programme, il se déclenche généralement une erreur (sauf si on l'ouvre en Binaire, c'était le cas en VB6, c'est à vérifier en VB.NET).

Pour ouvrir un fichier on utilise FileOpen.

FileOpen (FileNumber, FileName, Mode, Access, Share, RecordLength)

Paramètres de FileOpen

FileNumber

A tout fichier est affecté un numéro unique, c'est ce numéro que l'on utilisera pour indiquer sur quel fichier pratiquer une opération.. Utilisez la fonction FreeFile pour obtenir le prochain numéro de fichier disponible.

FileName

Obligatoire. Expression de type String spécifiant un nom de fichier. Peut comprendre un nom de répertoire ou de dossier, et un nom de lecteur.

Mode

Obligatoire. Énumération OpenMode spécifiant le mode d'accès au fichier : Append, Binary, Input (séquentiel en lecture), Output (séquentiel en écriture) ou Random (accès aléatoire).

Access

Facultatif. Mot clé spécifiant les opérations autorisées sur le fichier ouvert : Read, Write ou ReadWrite. Par défaut, la valeur est OpenAccess.ReadWrite.

Share

Facultatif. Spécifiant si un autre programme peut avoir en même temps accès au même fichier : Shared (permet l'accès aux autres programmes), Lock Read (interdit l'accès en lecture), Lock Write (interdit l'accès en écriture) et Lock Read Write (interdit totalement l'accès). Le processus OpenShare.Lock Read Write est paramétré par défaut.

RecordLength

Facultatif. Nombre inférieur ou égal à 32 767 (octets). Pour les fichiers ouverts en mode Random, cette valeur représente la longueur de l'enregistrement. Pour les fichiers séquentiels, elle représente le nombre de caractères contenus dans la mémoire tampon.

Pour écrire dans un fichier on utilise:

Print , Write, WriteLine dans les fichiers séquentiels.

FilePut dans les fichiers aléatoires.

Pour lire dans un fichier on utilise:

Input, LineInput dans les fichiers séquentiels.

FileGet dans les fichiers aléatoires.

Pour fermer le fichier on utilise FileClose().

Numéro de fichier:

Pour repérer chaque fichier, on lui donne un numéro unique (de type Integer).

La fonction FreeFile retourne le premier numéro libre.

 
Sélectionnez

Dim No as Integer

No= Freefile()

Ensuite on peut utiliser No pour repérer le fichier sur lequel on travaille.

 
Sélectionnez

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:

 
Sélectionnez

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.
     
    Sélectionnez
    
    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.
     
    Sélectionnez
    
    Write(1,"toto")
    
    Write(1,"tata")
    
    Write(1, 1.2)

    Donne le fichier '"toto";"tata";1.2"

    Attention s'il y a des points-virgules dans les chaînes, elles seront considérées comme séparateurs!! ce qui entraîne des erreurs à la lecture; il faut mettre la chaîne entre "" ou bien remplacer le point-virgule par un caractère non utilisé (# par exemple) avant de l'enregistrer puis après la lecture remplacer '#' par ';'

    Il faut utiliser Input pour relire ces données (Input utilise aussi le point-virgule comme séparateur.

  • La fonction WriteLine insère un caractère de passage à la ligne, c'est-à-dire un retour chariot+ saut de ligne (Chr(13) + Chr(10)),On lira les données par LineInput.
     
    Sélectionnez
    
    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.

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

last = FileLen("MONFICHIER.DAT") / RecLength

On ajoute 1 pour créer un nouvel enregistrement.

 
Sélectionnez

FilePut(FileNum, UneAdresse,last+1 )

Pour lire un enregistrement (le premier par exemple):

 
Sélectionnez

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:

 
Sélectionnez

	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 .

 
Sélectionnez

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?

 
Sélectionnez

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:

 
Sélectionnez

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
Image non disponible

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.

 
Sélectionnez

'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

 
Sélectionnez

'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

 
Sélectionnez

'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).

 
Sélectionnez

Dim fi As New FileInfo(myFile) 

Dim newFile As String = myFile & &#8220;.bck&#8221; 

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:

 
Sélectionnez

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

 
Sélectionnez

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 :

 
Sélectionnez

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

Image non disponible

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:

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez


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

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

					
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:

 
Sélectionnez

 Dim d As String = Directory.GetCreationTime("c:\Article_dvp\global\Thumbs.db")

La Classe DirectoryInfo possède les propriétés suivantes.

 
Sélectionnez

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:

 
Sélectionnez

Create, Delete, MoveTo

CreateSubdirectory

GetDirectories    Retourne les sous-dossiers

GetFiles          Retourne des fichiers

GetFileSystemInfos

Exemple:

Afficher le répertoire parent d'un dossier:

 
Sélectionnez

Dim D As DirectoryInfo

D= New DirectoryInfo( MonDossier)

MsgBox(D.Parent.ToString)

Créer un répertoire:

 
Sélectionnez

Dim D As DirectoryInfo

D= New DirectoryInfo( MonDossier)

D.CreateSubdirectory("monsousdossier")

Effacer un répertoire et ses sous-répertoires:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez

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 .

 
Sélectionnez

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?

 
Sélectionnez

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?

 
Sélectionnez

Dim drives As String() = Environment.GetLogicalDrives()
 

Comment récupérer la ligne de commande?

 
Sélectionnez

Dim arguments As String() = Environment.GetCommandLineArgs()

ou avec My:

 
Sélectionnez

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

 
Sélectionnez

MsgBox(My.Computer.FileSystem.DirectoryExists("c:\MyApllication\").ToString)

Copier un répertoire dans un autre:

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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)

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

MkDir("C:\MYDIR") 

RmDir efface un répertoire ou un dossier existant.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

FileCopy(SourceFile, DestinationFile)

Rename
Renommer un fichier, un répertoire ou un dossier.

 
Sélectionnez

Rename (OldName, NewName)

FileLen donne la longueur du fichier, SetAttr et GetAttr pour modifier ou lire les attributs du fichier.

 
Sélectionnez

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 :

 
Sélectionnez

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 .

 
Sélectionnez


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()
Image non disponible

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.

 
Sélectionnez

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)

 
Sélectionnez

Dim myFiles= From Files in My.Computer.fyleSystem.GetFile(CurDir)

Select Files

V-AE. Afficher correctement du texte

Image non disponible
  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:

 
Sélectionnez

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():

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

Si A=3 et B=5
MsgBox(String.Format("{0} + {1} = {2}",A, B, A+B)) affiche  3+5=8

Autre exemple:

 
Sélectionnez

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.
     
    Sélectionnez
    
       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
     
    Sélectionnez
    
    	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.

 
Sélectionnez

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

Image non disponible

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

 
Sélectionnez

Imports System.Threading

Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("en-us")'passage en culture US culture

On peut utiliser l'objet My.

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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?

 
Sélectionnez

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.

 
Sélectionnez

<Extension()> _
Public Sub PrintPonctuation(ByVal aString As String,  ByVal punc As String)
    Console.WriteLine(aString & punc)
End Sub

Ensuite pour l'utiliser:

 
Sélectionnez

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:

 
Sélectionnez

Dim ajoute1 = Function(num As Integer) num + 1

Utilisation de la fonction dans la même sub:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez


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.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

    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:

 
Sélectionnez

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?

 
Sélectionnez

MsgBox(My.Computer.FileSystem.DirectoryExists("c:\").ToString) 'affiche True si c:\ existe.

De même pour un fichier:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

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)

 
Sélectionnez

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.

 
Sélectionnez

	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:

 
Sélectionnez

Me.BackgroundImage = My.Resources.Form1Background

Mettre une ressource image dans le plan BackGround d'un bouton:

 
Sélectionnez

MyButton.BackGroundImage= MonProgramme.My.Ressources.Ressources.button_Blue

Mettre une ressource icône comme icône d'un formulaire:

 
Sélectionnez

Me.Icon = My.Resources.MyIcon

Jouer un son qui est dans les ressources.

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

My.Forms.HelpForm.Show()

On peut étendre et personnaliser l'espace de nom My, mais c'est un peu complexe.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.