FAQ VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 240, dernière mise à jour : 12 mai 2018 Ajouter une question
Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées sur le forum Développement DotNET
Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle contient sont correctes. Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture.
- Comment créer, copier, déplacer, supprimer un fichier ?
- Comment obtenir les attributs d'un fichier ou d'un répertoire ?
- Comment obtenir la liste des fichiers et des sous-répertoires d'un répertoire ?
- Comment lire et écrire dans un fichier texte ?
- Comment lire et écrire dans un fichier binaire ?
- Comment surveiller les modifications d'un fichier grâce aux notifications système ?
- Comment récupérer le nom d'un fichier, lorsque j'ai le chemin complet ?
- Comment afficher ou écrire correctement les caractères accentués dans mes fichiers ?
- Comment tester l'existence d'un fichier ?
- Comment récupérer l'extension d'un fichier ?
- Comment lire un fichier ligne par ligne ?
- Comment compresser un fichier avec GZip ?
- Comment décompresser un fichier GZip ?
- Comment lire un fichier Xml avec les classes de l'espace de nom System.Xml.Xpath ?
- Comment savoir si un fichier est en lecture seule ?
- Comment renommer un fichier ?
- Comment modifier l'extension d'un fichier ?
Pour créer, copier, déplacer ou supprimer un fichier, on utilise la classe System.IO.File
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Imports System.IO Module FileMan Sub Main() Try ' Création d'un fichier vide. FileStream fs = File.Create("myfile.txt") fs.Close() Console.WriteLine("fichier myfile.txt créé") ' Copie de fichier File.Copy("myfile.txt", "copyofmyfile.txt") Console.WriteLine("fichier myfile.txt copié vers copyofmyfile.txt") ' Déplacement de fichier File.Move("copyofmyfile.txt", "c:\copyofmyfile.txt") Console.WriteLine("fichier copyofmyfile.txt déplacé vers c:\copyofmyfile.txt") ' Suppression fichier File.Delete("c:\copyofmyfile.txt") Console.WriteLine("Fichier c:\copyofmyfile.txt supprimé") Catch ex As Exception Debug.WriteLine(ex.ToString) Console.WriteLine(ex.Message) Finally ' Fin du programme Console.WriteLine("Tapez sur entrée pour sortir ...") Console.ReadLine() End Try End Sub End Module |
On utilise la méthode GetAttributes de la classe System.IO.File
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | Imports System.IO Sub GetFileAttributes(ByVal sFilename As String) Dim flagAttr As FileAttributes = File.GetAttributes(sFilename) Console.WriteLine("Créé le {0} à {1}", _ File.GetCreationTime(sFilename).ToShortDateString, _ File.GetCreationTime(sFilename).ToShortTimeString) Console.WriteLine("Modifié le {0} à {1}", _ File.GetLastWriteTime(sFilename).ToShortDateString, _ File.GetLastWriteTime(sFilename).ToShortTimeString) Console.WriteLine("Dernier accès le {0} à {1}", _ File.GetLastAccessTime(sFilename).ToShortDateString, _ File.GetLastAccessTime(sFilename).ToShortTimeString) Console.WriteLine("Attributs du fichier, lecteur ou repertoire {0}", sFilename) If (flagAttr And FileAttributes.Archive) = FileAttributes.Archive Then Console.WriteLine(FileAttributes.Archive.ToString) End If If (flagAttr And FileAttributes.Compressed) = FileAttributes.Compressed Then Console.WriteLine(FileAttributes.Compressed.ToString) End If If (flagAttr And FileAttributes.Device) = FileAttributes.Device Then Console.WriteLine(FileAttributes.Device.ToString) End If If (flagAttr And FileAttributes.Directory) = FileAttributes.Directory Then Console.WriteLine(FileAttributes.Directory.ToString) End If If (flagAttr And FileAttributes.Encrypted) = FileAttributes.Encrypted Then Console.WriteLine(FileAttributes.Encrypted.ToString) End If If (flagAttr And FileAttributes.Hidden) = FileAttributes.Hidden Then Console.WriteLine(FileAttributes.Hidden.ToString) End If If (flagAttr And FileAttributes.Normal) = FileAttributes.Normal Then Console.WriteLine(FileAttributes.Normal.ToString) If (flagAttr And FileAttributes.NotContentIndexed) = FileAttributes.NotContentIndexed Then Console.WriteLine(FileAttributes.NotContentIndexed.ToString) End If If (flagAttr And FileAttributes.Offline) = FileAttributes.Offline Then Console.WriteLine(FileAttributes.Offline.ToString) End If 'Ne marche pas pour les répertoires apparemment If (flagAttr And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then Console.WriteLine(FileAttributes.ReadOnly.ToString) End If If (flagAttr And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint Then Console.WriteLine(FileAttributes.ReparsePoint.ToString) End If If (flagAttr And FileAttributes.SparseFile) = FileAttributes.SparseFile Then Console.WriteLine(FileAttributes.SparseFile.ToString) End If If (flagAttr And FileAttributes.System) = FileAttributes.System Then Console.WriteLine(FileAttributes.System.ToString) End If If (flagAttr And FileAttributes.Temporary) = FileAttributes.Temporary Then Console.WriteLine(FileAttributes.Temporary.ToString) End If End Sub |
On utilise la fonction GetFileSystemEntries de la classe System.IO.Directory
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | Imports System.IO Sub Dir(Optional ByVal sDirectory As String = ".") Dim sFiles() As String Dim i As Integer ' Pour avoir les noms des fichiers et des sous-répertoires sFiles = Directory.GetFileSystemEntries(sDirectory) For i = 0 To sFiles.GetUpperBound(0) Console.WriteLine(sFiles(i)) Next End Sub |
Nous allons ouvrir un fichier texte et le remplir s'il n'existe pas encore.
Nous afficherons ensuite son contenu à l'écran.
On utilise pour cela les classes System.IO.StreamReader pour la lecture et System.IO.StreamWriter pour l'écriture
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Imports System.IO Sub FichierTexte(ByVal NomFichier As String) Dim sr As StreamReader Dim sw As StreamWriter Dim sLine As String Try If Not File.Exists(NomFichier) Then ' Le fichier n'existe pas. On le crée sw = New StreamWriter(NomFichier) sw.WriteLine("Bonjour. Il nous sommes le {0} et il est {1} ", _ DateTime.Now.ToLongDateString, _ DateTime.Now.ToLongTimeString) sw.Close() sw = Nothing ' Remarque : On peut utiliser sw = File.AppendText(NomFichier) pour ajouter ' du texte à un fichier existant End If ' Ouverture du fichier et écriture du contenu du fichier sur la console sr = New StreamReader(NomFichier) Console.WriteLine("Debut du fichier") sLine = sr.ReadLine() While Not sLine Is Nothing Console.WriteLine(sLine) sLine = sr.ReadLine() End While Console.WriteLine("Fin du fichier") Finally ' Fermeture StreamReader If Not IsNothing(sr) Then sr.Close() ' Fermeture StreamWriter If Not IsNothing(sw) Then sw.Close() End Try End Sub |
Nous allons ouvrir un fichier binaire et le remplir (d'entiers) s'il n'existe pas encore.
Nous afficherons son contenu à l'écran.
On utilise pour cela les classes System.IO.BinaryReader pour la lecture et System.IO.BinaryWriter pour l'écriture.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Imports System.IO Sub FichierBinaire(ByVal NomFichier As String) Dim br As BinaryReader Dim bw As BinaryWriter Dim fs As FileStream Dim i As Integer Try If Not File.Exists(NomFichier) Then ' Le fichier n'existe pas. On le crée bw = New BinaryWriter(File.Create(NomFichier)) For i = 0 To 9 bw.Write(i) Next bw.Close() End If ' Ouverture du fichier et Écriture du contenu du fichier sur la console fs = File.Open(NomFichier, FileMode.Open) br = New BinaryReader(fs) Console.WriteLine("Debut du fichier") While fs.Position < fs.Length Console.Write(br.ReadInt32()) End While Console.WriteLine("{0}Fin du fichier", ControlChars.CrLf) Finally ' Fermeture BinaryReader If Not IsNothing(br) Then br.Close() ' Fermeture BinaryWriter If Not IsNothing(bw) Then bw.Close() End Try End Sub |
Windows envoie des notifications qui permettent de surveiller les modifications apportées au système de fichiers.
Cela se fait de la manière suivante en utilisant la classe System.IO.FileSystemWatcher.
Le code suivant est à placer dans une classe ou un module utilisé dans un projet Console.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | Imports System.IO Sub Watch(ByVal sPath As String, Optional ByVal sFilter As String = "*") ' On peut utiliser les '*' avec sFilter Dim fw As New FileSystemWatcher(sPath, sFilter) ' On ajoute les handler pour surveiller les évènements qu'on souhaite. AddHandler fw.Changed, AddressOf OnChanged AddHandler fw.Renamed, AddressOf OnRenamed AddHandler fw.Created, AddressOf OnChanged AddHandler fw.Deleted, AddressOf OnChanged AddHandler fw.Error, AddressOf OnError 'On surveillera aussi les sous répertoires fw.IncludeSubdirectories = True ' Mettre cette propriété à True démarre la surveillance des modifications. La mettre à false l'arrête. Dans notre exemple, elle sera à true durant tout le programme fw.EnableRaisingEvents = True End Sub Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs) Console.WriteLine("File {0} {1}", e.FullPath, e.ChangeType) End Sub Sub OnRenamed(ByVal source As Object, ByVal e As RenamedEventArgs) Console.WriteLine("File {0} renamed to {1}", e.OldFullPath, e.FullPath) End Sub Sub OnError(ByVal source As Object, ByVal e As ErrorEventArgs) Dim ex As Exception = e.GetException() Debug.WriteLine(ex.ToString()) Console.WriteLine(ex.Message) End Sub |
Code vb.net : | Sélectionner tout |
1 2 3 | Watch("c:\monfichier.txt") ' Ou Watch("c:\*.*") |
Vous devez utiliser la méthode GetFileName de la classe System.IO.Path qui vous permet de récupérer le nom du fichier.
Code vb.net : | Sélectionner tout |
1 2 3 | Dim fileName As String = "C:\toto.tx" Dim name As String = System.IO.Path.GetFileName(fileName) Console.WriteLine(name) |
Les fichiers sont ouverts avec l'encodage Unicode par défaut dans .NET.
Il en résulte que les caractères accentués par exemple ne s'affichent pas correctement.
Vous devez spécifier le type d'encodage à utiliser, pour la lecture/écriture de votre fichier. Exemple pour la lecture
Code vb.net : | Sélectionner tout |
1 2 3 4 | Imports System.IO Imports System.Text Dim strReader As StreamReader = new System.IO.StreamReader(filePath,Encoding.Default) |
On peut faire exactement la même chose avec les StreamWriter.
Tester si un fichier existe :
Code vb.net : | Sélectionner tout |
1 2 3 4 5 | If System.IO.File.Exists("c:\monFichier.txt") Then ' Le fichier existe Else ' Le fichier n'existe pas End If |
Pour récupérer l'extension d'un fichier, veuillez procéder de la sorte :
Code vb.net : | Sélectionner tout |
1 2 3 4 | ' Path est le chemin complet du fichier Private Function GetExtension(ByVal path As String) As String Return New System.IO.FileInfo(path).Extension End Function |
Pour lire un fichier, ligne par ligne, il faut utiliser un StreamReader ainsi qu'une ArrayList. Voici comment procéder :
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | Imports System.IO Public Shared Function ReadByLine(ByVal path As String) As ArrayList ' DECLARER un lecteur de fichier Dim monlecteur As StreamReader ' DECLARER une collection pour les lignes du fichier Dim meslignes As New ArrayList Try ' path est le chemin complet du fichier à lire monlecteur = New StreamReader(path) With monlecteur ' POSITIONNER le flux au début du fichier .BaseStream.Seek(0, SeekOrigin.Begin) ' TANT QUE le lecteur a quelque chose à lire While (.Peek > 0) ' LIRE une ligne du fichier et l'ajouter à meslignes meslignes.Add(.ReadLine) End While End With Catch ex As Exception Console.WriteLine(ex.Message) Finally ' FERMER le lecteur en tout état de cause monlecteur.Close() End Try Return meslignes End Function |
Tout d'abord pensez à ajouter ces deux Imports sans quoi il n'est pas possible d'utiliser le code donné en exemple.
Code vb.net : | Sélectionner tout |
1 2 | Imports System.IO Imports System.IO.Compression |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | Public Function compresserFichier(ByVal cheminSource As String, ByVal cheminDestination As String) As Boolean ' cheminSource : chemin complet du fichier à compresser ' cheminDestination : chemin complet du fichier compressé à créer Try ' Le fichier est placé dans le FileStream Dim monFileStream As New FileStream(cheminSource, FileMode.Open) Dim monBuffer(monFileStream.Length) As Byte ' Lecture de l'intégralité du FileStream monFileStream.Read(monBuffer, 0, CInt(monFileStream.Length)) ' Fermeture du FileStream monFileStream.Close() ' Création du fichier qui va contenir le fichier compressé monFileStream = New FileStream(cheminDestination, FileMode.Create) ' Compression des données Dim monGZipStream As New GZipStream(monFileStream, CompressionMode.Compress, False) ' Écriture des données compressées dans le fichier de destination monGZipStream.Write(monBuffer, 0, monBuffer.Length) ' Fermeture du GZipStream monGZipStream.Close() Return True Catch ex As Exception MessageBox.Show(ex.Message) Return False End Try End Function |
Tout d'abord pensez à ajouter ces deux Imports sans quoi il n'est pas possible d'utiliser le code donné en exemple.
Code vb.net : | Sélectionner tout |
1 2 | Imports System.IO Imports System.IO.Compression |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | Public Function decompression(ByVal cheminSource As String, ByVal cheminDestination As String) As Boolean ' cheminSource : chemin complet du fichier compressé ' cheminDestination : chemin complet du fichier où le fichier doit être décompressé Try ' Lecture du fichier compresse Dim monFileStream As New FileStream(cheminSource, FileMode.Open) ' Données du fichier placées dans un GZipStream Dim monGzipStream As New GZipStream(monFileStream, CompressionMode.Decompress) ' Tableau qui va contenir la taille du fichier Dim tailleOctets(3) As Byte ' Positionnement dans le Stream pour récupérer la taille Dim position As Integer = CInt(monFileStream.Length - 4) monFileStream.Position = position ' Récupération de la taille du fichier monFileStream.Read(tailleOctets, 0, 4) ' Repositionnement en début du Stream monFileStream.Position = 0 ' Conversion de la taille du fichier en entier Dim tailleFichier As Integer = BitConverter.ToInt32(tailleOctets, 0) ' Dimesionnement du buffer Dim buffer(tailleFichier + 100) As Byte ' Offset qui permettra de se repérer dans le Stream Dim monOffset As Integer = 0 While (True) ' Les données sont décompressées et placées dans le buffer Dim decompressionOctets As Integer = monGzipStream.Read(buffer, monOffset, 100) ' Tant qu'il reste des données on continue If (decompressionOctets = 0) Then Exit While End If ' On icrémente l'offset pour ne pas repartir de 0 à chaque fois... monOffset += decompressionOctets End While ' Création du fichier décompressé monFileStream = New FileStream(cheminDestination, FileMode.Create) ' Ecriture des données décomrpessées dans le fichier monFileStream.Write(buffer, 0, tailleFichier - 1) ' Efface les données en mémoire tampon monFileStream.Flush() ' Fermeture des Streams monFileStream.Close() monGzipStream.Close() Return True Catch ex As Exception MessageBox.Show(ex.Message) Return False End Try End Function |
On va s'intéresser ici à lecture d'un fichier Xml en se servant non pas de la classe XmlDocument mais des classes de l'espace de nom System.Xml.Xpath. Je distinguerais deux cas, les fichiers Xml basiques et ceux avec un espace de nom.
L'exemple est assez trivial, mais c'est suffisant pour beaucoup de choses.
Premier cas : fichier Xml basique
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | <Recordbook> <Records> <Record> <FirstValue>10</FirstValue> <SecondValue>51</SecondValue> </Record> <Record> <FirstValue>25</FirstValue> <SecondValue>38</SecondValue> </Record> </Records> </Recordbook> |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Imports System.Xml.XPath Private Sub TraiteXml() Dim doc As XPathDocument = New XPathDocument(fileName) Dim nav As XPathNavigator = doc.CreateNavigator ' On récupère un XPathNodeIterator sur les Record Dim iter As XPathNodeIterator = nav.Select("Recordbook/Records/Record") ' Pour chaque Record While iter.MoveNext ' On récupère l'info FirstValue Dim firstValue As String = iter.Current.SelectSingleNode("FirstValue").Value ' On récupère l'info SecondValue Dim secondValue As String = iter.Current.SelectSingleNode("SecondValue").Value End While End Sub |
Second cas : fichier Xml avec un espace de nom
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | <rd:Recordbook xmlns:rd="http://myexemple/myschema/record"> <rd:Records> <rd:Record> <rd:FirstValue>10</rd:FirstValue> <rd:SecondValue>51</rd:SecondValue> </rd:Record> <rd:Record> <rd:FirstValue>25</rd:FirstValue> <rd:SecondValue>38</rd:SecondValue> </rd:Record> </rd:Records> </rd:Recordbook> |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Imports System.Xml.XPath Private Sub TraiteXml2() Dim doc As XPathDocument = New XPathDocument(fileName) Dim nav As XPathNavigator = doc.CreateNavigator ' On ajoute la gestion des espaces de noms Dim mgr As XmlNamespaceManager = New XmlNamespaceManager(nav.NameTable) mgr.AddNamespace("rd", "http://myexemple/myschema/record") ' On récupère un XPathNodeIterator sur les Record Dim iter As XPathNodeIterator = nav.Select("rd:Recordbook/rd:Records/rd:Record", mgr) ' Pour chaque Record While iter.MoveNext ' On récupère l'info FirstValue Dim firstValue As String = iter.Current.SelectSingleNode("rd:FirstValue", mgr).Value ' On récupère l'info SecondValue Dim secondValue As String = iter.Current.SelectSingleNode("rd:SecondValue", mgr).Value End While End Sub |
Grâce à la classe File, il est possible de récupérer les attributs (Archive, Lecture seule.) d'un fichier :
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | ' Récupération des attributs d'un fichier Dim Fa As FileAttributes = File.GetAttributes("C:\text.txt") ' Vérification si le fichier est en lecture seule If (Fa And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then Console.WriteLine("Ce fichier est en lecture seule !") Else Console.WriteLine("Ce fichier n'est pas en lecture seule") End If |
Renommer un fichier est en fait une opération de déplacement.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 | Dim monAncienFichier As String, monNouveauFichier As String monAncienFichier = "toto.txt" monNouveauFichier = "tata.txt" File.Move(monAncienFichier, monNouveauFichier) |
La méthode statique ChangeExtension de la classe Path permet de changer l'extension du fichier qui est passé en paramètre. Cependant, le changement n'a d'effet que dans le string, le fichier physique a toujours son extension d'origine.
Code vb.net : | Sélectionner tout |
1 2 | Dim path As String = "C:\Test\test.xml" Console.WriteLine("Nouveau path : {0}", System.IO.Path.ChangeExtension(path, "doc")) |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes 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 © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.