FAQ ASP.NET/VB.NET

FAQ ASP.NET/VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 38, nombre de questions : 369, dernière mise à jour : 16 juin 2021
Sommaire→Coté serveur et C#→Manipulations des fichiers- J'ai besoin de connaître le répertoire physique de mon application asp.NET. Comment faire?
- Comment afficher tous les fichier d'un répertoire du serveur ?
- Comment créer, copier, déplacer, supprimer un fichier ?
- Comment lire et écrire dans un fichier texte ?
- Comment obtenir la liste des fichiers et des sous-répertoires d'un répertoire ?
- Comment lister les répertoires d'une application?
- Comment lister les fichiers d'un répertoire?
- Comment connaître la taille totale du contenu d'un répertoire?
- Comment lire un fichier ligne par ligne?
- Comment récupérer le content-type d'un fichier?
- Comment connaître la taille d'un fichier?
- Comment permettre d'utiliser des fichiers de manière relative ?
Pour lister les fichiers d'un répertoire ou pour accéder à une base de données
Access, il nous est parfois nécessaire de savoir l'adresse exacte du répertoire
physique dans lequel se trouve l'application.
Cela est possible à l'aide de:
Dim PhysicalPath As String = Server.MapPath("nomfichier.mdb")Cet exemple initialisera PhysicalPath avec l'adresse physique du fichier nomfichier.mdb.
Nous allons afficher tous les fichiers d'un répertoire dans une ListBox :
Dim dir As New DirectoryInfo("C:\MonChemin")
MalLsttBox.DataSource = dir.GetFiles("*.*")
MalLsttBox.DataBind()Note : attention à bien paramètrer vos droits de manière à ce que le user ASPNET puisse parcourir le répertoire ;)
Pour créer, copier, déplacer ou supprimer un fichier, on utilise la classe System.IO.File
Imports System
Imports System.IO
Public Shared Sub FileTests()
Try
'Création d un fichier vide
Dim fs As FileStream = 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 de fichier
File.Delete("c:\copyofmyfile.txt")
Console.WriteLine("Fichier c:\copyofmyfile.txt supprimé")
Catch e As Exception
Debug.WriteLine(ex.ToString)
Console.WriteLine(ex.Message)
End Try
End SubLien : System.IO.File
Nous allons ouvrir un fichier texte et le remplir s'il n'existe pas encore. Nous afficherons ensuite son contenu à l'écran. On utilisera pour cela les classes System.IO.StreamReader pour la lecture et System.IO.StreamWriter pour l'écriture
Imports System
Imports System.IO
Sub FichierTexte(ByVal nomFichier As String)
Dim sr As StreamReader = Nothing
Dim sw As StreamWriter = Nothing
Dim line 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. 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("Début du fichier")
line = sr.ReadLine
While Not (line Is Nothing)
Console.WriteLine(line)
line = sr.ReadLine
End While
Console.WriteLine("Fin du fichier")
Finally
' Fermeture streamreader
If Not (sr Is Nothing) Then
sr.Close
End If
' Fermeture streamwriter
If Not (sw Is Nothing) Then
sw.Close
End If
End Try
End SubLien : System.IO.StreamWriter
Lien : System.IO.StreamReader
On utilise la fonction GetFileSystemEntries de la classe System.IO.Directory
Imports System.IO
Imports System
Shared Sub Dir(ByVal directory As String)
Dim files As String()
files = Directory.GetFileSystemEntries(directory)
Dim filecount As Integer = files.GetUpperBound(0) + 1
Dim i As Integer = 0
While i < filecount
Response.Write(files[i])
System.Math.Min(System.Threading.Interlocked.Increment(i),i-1)
End While
End SubPour avoir juste les noms des fichiers et pas les sous-répertoires d'un répertoire, on utilise
System.IO.Directory.GetFiles()Lien : System.IO.Directory
Il nous est souvent nécessaire de lister les répertoires présents dans le répertoire d'une application
asp.NET. Pour cela, il suffit de boucler sur la liste des DirectoryInfo renvoyés par
l'intermédiaire de la méthode GetDirectories de cette même classe DirectoryInfo.
Attention que la base de l'application doit être récupérée par l'intermédiaire de
Server.MapPath(".")ce qui donne ...
Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(Server.MapPath("."))
For Each di2 As System.IO.DirectoryInfo In di.GetDirectories
Response.Write(di2.FullName)
' Traitement quelconque
NextBien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit".
Comme pour le listage des répertoires, une simple boucle suffit. DirectoryInfo fournit une méthode GetFiles qui se chargent de renvoyer la liste des fichiers du répertoires.
Il ne reste plus dès lors qu'à effectuer un traitement sur chacun des fichiers de cette liste.
Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(Server.MapPath("."))
For Each fi As System.IO.FileInfo In di.GetFiles
Response.Write(fi.FullName)
NextBien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit".
Pour connaître la taille du contenu, il suffit d'additionner la taille de chacun des
fichiers de ce répertoire.
Voici une petite fonction permet d'effectuer cette opération.
Public Function DirectoryLength(ByVal relativePath As String) As Integer
Dim bytes As Integer = 0
Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(Server.MapPath(relativePath))
For Each fi As System.IO.FileInfo In di.GetFiles
bytes += fi.Length
Next
Return bytes
End FunctionBien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit".
Certes XML et les bases de données prennent de plus en plus de place dans le monde de l'informatique mais les fichiers dits "classiques" sont toujours bel et bien présents.
Voici comme lire un fichier et, ce, ligne par ligne.
Tout d'abord il faut utiliser le namespace System.IO.
Imports System.IOPour lire tout le fichier, il suffit de boucler sur toutes les lignes du fichier.
Public Sub ReadByLine(ByVal path As String)
Dim sr As StreamReader
Try
sr = New StreamReader(path)
Dim contenu As String
While Not ((contenu = sr.ReadLine) Is Nothing)
' Utiliser ce contenu
' Par exemple ajout d'une ListBox, ...
End While
Catch generatedExceptionVariable0 As Exception
' Gestion de l'exception (FileNotFound, ...
' (redirection, ...)
Finally
sr.Close
End Try
End SubLes content-types se trouvent dans la base de registres. Il "suffit" de parcourir les associations extension / content-type pour retrouver celle qui correspond à l'extension de notre fichier.
Voici une fonction permettant d'effectuer cette recherche.
Public Shared Function GetMIMEType(ByVal filepath As String) As String
Dim regPerm As RegistryPermission = New RegistryPermission(RegistryPermissionAccess.Read, "\HKEY_CLASSES_ROOT")
Dim classesRoot As RegistryKey = Registry.ClassesRoot
Dim fi As FileInfo = New FileInfo(filepath)
Dim dotExt As String = fi.Extension.ToLower
Dim typeKey As RegistryKey = classesRoot.OpenSubKey("MIME\Database\Content Type")
Dim Keyname As String = ""
For Each keyname As String In typeKey.GetSubKeyNames
Dim curKey As RegistryKey = classesRoot.OpenSubKey("MIME\Database\Content Type\" + keyname)
If CType(curKey.GetValue("Extension"), String) = dotExt Then
Keyname = keyname
End If
Next
Return Keyname
End FunctionSans oublier d'importer les namespaces suivants:
Imports System.IO
Imports System.Security.Permissions
Imports Microsoft.Win32Il suffit d'utiliser
Dim BytesSize As Integer = FileInfo("nomfichier.ext").LengthLorsque vous ouvrez un fichier texte, par exemple, il vous faut savoir l'adresse physique de ce fichier. Malheureusement, nous ne connaissons que le chemin relatif bien souvent.
Server.MapPath est là pour nous aider. En lui passant le chemin relatif, Server.MapPath renverra le chemin physique complet.
Cela donne, dans l'exemple de l'ouverture d'un flux sur le fichier texte :
Fs.Open(Server.MapPath("./adresserelative/fichier.txt"))


