Microsoft – Technopoche : Utilisation du File System Object
Paru le 10 juillet 2006
Ce document a été écrit par Martine THIPHAINE, ingénieur Support Développement à Microsoft France. Il est destiné aux développeurs désirant aborder le modèle objet File System Object ou FSO.
Introduction
Mise en oeuvre
Présentation du modèle objet
Gestion des unités logiques
Gestion de dossiers
Gestion de fichiers
Informations complémentaires
Ce document présente comment utiliser le modèle objet FileSystemObject (ou fso) depuis Visual Basic ou Visual Basic Script. Ce modèle objet a pour but de permettre de manipuler simplement des fichiers, des dossiers et des unités logiques. Il permet notamment de créer, de modifier, de supprimer ou de déplacer des dossiers ou bien des fichiers.
Depuis Visual Basic, il est bien sûr toujours possible d'utiliser les méthodes classiques de gestion de fichier, à savoir par exemple Open pour ouvrir un fichier, Dir pour lister le contenu d'un répertoire, ou certaines APIs comme GetdiskFreeSpace. Bien que le modèle objet consomme un peu plus de ressources que l'appel direct à ces fonctions, il est nettement plus simple à mettre en œuvre. Il a aussi l'avantage de regrouper en un seul modèle objet tout ce qui a trait à la gestion de fichiers. Enfin, depuis un langage de script comme VBScript ou JScript, ce modèle est fréquemment utilisé, étant donné qu'il n'est pas possible d'appeler direct ement des APIs.
Ce document se propose tout d'abord de décrire le modèle objet fso, puis de fournir une série d'exemples classés par thème (unités logiques, dossiers, fichiers), afin de répondre le mieux possible aux besoins quotidiens de tout développeur. Ces exemples sont écrits en VBScript ou bien en Visual Basic.
Haut de page
Ce modèle est implémenté dans la Dll "Windows Script Runtime" nommé Scrrun.dll. Cett Dll est fournie par différents produits tels que Internet Explorer, Microsoft Office, ou bien Visual Basic. La dernière version de Windows Script Runtime disponible à ce jour est la version 5.5, et est téléchargeable depuis le lien suivant: https://msdn2.microsoft.com/en-us/library/ms950396.aspx
Pour pouvoir utiliser fso depuis Visual Basic en early binding, il suffit donc d'ajouter une référence à "Microsoft Scripting Runtime" depuis le menu Projet Références de l'IDE Visual Basic.
Haut de page
Le modèle objet FSO expose les objets suivants
- Drive
- Folder
- File
- FileSystemObject
- TextStream
Certaines actions peuvent se coder de deux manières différentes: soit en utilisant une propriété ou une méthode de l'objet lui-même, soit en utilisant une méthode de l'objet FileSystemObject.
Par exemple, pour copier un fichier, on peut utiliser ma méthode Copy d'un objet File, soit utiliser la méthode CopyFile de l'objet FileSystemObject.
Pour obtenir des précisions sur chacune des propriétés et méthodes de ces objets, on consultera le lien suivant: https://msdn.microsoft.com/fr-fr/library/tyd4tfw8.aspx
Objet FileSystemObject
Cet objet représente un système de fichiers. C'est au travers de cet objet que la création, la suppression, le déplacement de fichiers ou de dossiers peuvent être réalisés. Cet objet permet de pointer vers des dossiers ou des fichiers particuliers.
L'objet FileSystemObject expose la propriété suivante:
Drives
Et les méthodes suivantes:
BuildPath, CopyFile, CopyFolder, CreateFolder, CreateTextFile, DeleteFile, DeleteFolder, DriveExists, FileExists, FolderExists, GetAbsolutePathName, GetBaseName, GetDrive, GetDriveName, GetExtensionName, GetFile, GetFileName, GetFileVersion, GetFolder, GetParentFolderName, GetSpecialFolder, GetTempName, MoveFile, MoveFolder, OpenTextFile.
Objet Drive
Cet objet représente une unité logique (disque dur, CD-ROM, unité montée en mémoire...)
Fso expose aussi une collection Drives, accessible en lecture seule, qui contient l'ensemble des unités logiques disponibles. Cette collection est accessible au travers de l'objet FileSystemObject.
La programmation des objets Drive permet d'obtenir des informations sur le système de fichier d'une unité logique, la place utilisée ou disponible sur cette unité, son type...etc...
Cet objet expose les propriétés suivantes:
AvailableSpace, DriveLetter, DriveType, FileSystem, FreeSpace, IsReady, Path, RootFolder, SerialNumber, ShareName, TotalSize, VolumeName.
Objet Folder
Cet objet représente un dossier du système de fichiers. C'est au travers de cet objet que la création, la suppression, le déplacement de dossiers peuvent être réalisés. Un objet Folder possède une série de propriétés telles que sa date de création, son chemin long, son chemin court, ses attributs...etc...
L'objet Folder expose les propriétés suivantes:
Attributes, DateCreated, DateLastAccessed, DateLastModified, Drive, Files, IsRootFolder, Name, ParentFolder, Path, ShortName, ShortPath, Size, SubFolders, Type.
Et les méthodes suivantes:
Copy, CreateTextFile, Delete, Move
Objet File
Cet objet représente un fichier du système de fichiers. C'est au travers de cet objet que la création, la suppression, le déplacement de fichiers peuvent être réalisés. Un objet File possède une série de propriétés telles que sa date de création, son chemin long, son chemin court, sa taille, le nom de son dossier parent, ses attributs...etc...
L'objet File expose les propriétés suivantes:
Attributes, DateCreated, DateLastAccessed, DateLastModified, Drive, Name, Name, ParentFolder, Path, ShortName, ShortPath, Size, Type.
Et les méthodes suivantes:
Copy, Delete, CreateTextFile, Delete, Move
ObjetTextStream
Cet objet représente le contenu d'un fichier texte. Cet objet est retourné lors de l'utilisation de la méthode CreateTextFile ou OpenTextFile de l'objet FilesSystemObject, ou bien de la méthode OpenAsTextStream de l'objet File.
L'objet TextStream expose les propriétés suivantes:
AtEndOfLine, AtEndOfStream, Column, Line
Et les méthodes suivantes:
Close, Read, ReadAll, ReadLine, Skip, SkipLine, Write, WriteLine Method, WriteBlankLines
Les paragraphes suivants fournissent des exemples de code pour réaliser différentes actions sur les unités logiques, les dossiers, et les fichiers.
Haut de page
La gestion des unités logiques se fait en utilisant les objets FileSystemObject et Drive.Sub ListeUnites()
Code VB : Afficher la liste des unités logiques disponibles
Sub ListeUnites()
Dim fs As Scripting.FileSystemObject
Dim d As Drive
Dim sResult As String, s As String
On Error GoTo errorHandler
Set fs = CreateObject("Scripting.FileSystemObject")
For Each d In fs.Drives
sResult = sResult & d.DriveLetter & " - "
Debug.Print sResult
If d.DriveType = Remote Then
s = d.ShareName
Else
s = d.VolumeName
End If
sResult = sResult & s & vbCrLf
Next
MsgBox sResult
Exit Sub
errorHandler:
If Err.Number = 71 Then Resume Next
End Sub
Code VBScript : Afficher la liste des unités logiques disponibles
Sub ListeUnites()
Const Remote = 3
Dim fs ' As Scripting.FileSystemObject
Dim d ' As Drive
Dim sResult ' As String
Dim s ' As String
On Error resume next
Set fs = CreateObject("Scripting.FileSystemObject")
For Each d In fs.Drives
sResult = sResult & d.DriveLetter & " - "
If d.DriveType = Remote Then
s = d.ShareName
Else
s = d.VolumeName
End If
sResult = sResult & s & vbCrLf
Next
MsgBox sResult
End Sub
Afficher le type de système de fichiers d'une unité logique (FAT, NTFS...)
Sub GetFileSystemType()
Dim fs ' As Scripting.FileSystemObject
Dim d ' As Drive
Dim s ' As String
Dim sUnit ' As String
sUnit = "e:"
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.GetDrive(sUnit)
s = d.FileSystem
MsgBox sUnit & " " & s
End Sub
Afficher l'espace disponible d'une unité logique
Sub GetFreeSpace()
Dim fs ' As Scripting.FileSystemObject
Dim d ' As Drive
Dim s ' As String
Dim sUnit ' As String
sUnit = "e:"
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.GetDrive(sUnit)
s = "Unité " & UCase(sUnit) & " - "
s = s & d.VolumeName & vbCrLf
s = s & "Espace libre: " & FormatNumber(d.FreeSpace/1024/1024, 0)
s = s & " Méga-octets"
MsgBox s
End Sub
Haut de page
Renommer un dossier
Sub RenameFolder()
Dim fso ' As Scripting.FileSystemObject
Dim fd ' As Scripting.Folder
Dim s ' As String
Dim sFolderName ' As String
Dim sNewName ' As String
Dim sTemp ' As String
' Initialisation des noms de dossiers
sFolderName = "d:\MonDossier"
sNewName = "toto"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier source existe bien.
If fso.FolderExists(sFolderName) Then
' Récupérer l'instance du dossier.
Set fd = fso.GetFolder(sFolderName)
sTemp = fd.Drive & "\" & sNewName
' Vérifier que le dossier cible n'existe pas déjà.
If fso.FolderExists(sTemp) Then
MsgBox "Ce nom de dossier existe déjà!"
Else
fd.Name = sNewName
End If
Else
MsgBox "Dossier non trouvé!"
End If
End Sub
Afficher les propriétés d'un dossier
Const ReadOnly = 1
Const Hidden = 2
Const System = 4
Const Directory=16
Const Archive = 32
Const Alias = 64
Const Compressed = 128
Sub ShowFolderInfos()
Dim fso ' As Scripting.FileSystemObject
Dim fd ' As Scripting.Folder
Dim sFolderName ' As String
Dim s ' As String
Dim lAtt ' As Long
' Initialisation du nom du dossier
sFolderName = "d:\temp"
' Récupérer l'instance du dossier.
Set fso = CreateObject("Scripting.FileSystemObject")
Set fd = fso.GetFolder(sFolderName)
' dossier racine ou non.
If fd.IsRootFolder = True Then
s = s & "Dossier Racine." & vbCrLf
Else
s = s & "Dossier non racine." & vbCrLf
' Dossier Parent.
s = "Dossier Parent: " & fd & vbCrLf
s = s & "Nom de l'unité: " & fd.Drive & vbCrLf
s = s & "Date de création: " & fd.DateCreated & vbCrLf
s = s & "Date de dernier accès: " & fd.DateLastAccessed & vbCrLf
s = s & "Date de dernière modification: " & fd.DateLastModified & _
vbCrLf
End If
s = s & "Taille: " & fd.Size & vbCrLf
s = s & "Type: " & fd.Type & vbCrLf
' Attributs du dossier
lAtt = fd.Attributes
s = s & "Valeur du champ Attributes :" & lAtt & vbCrLf
If lAtt And ReadOnly Then
s = s & vbTab & "Lecture Seule" & vbCrLf
Else
s = s & vbTab & "Normal" & vbCrLf
End If
If lAtt And Hidden Then
s = s & vbTab & "Caché" & vbCrLf
Else
s = s & vbTab & "Non Caché" & vbCrLf
End If
If lAtt And System Then
s = s & vbTab & "Système" & vbCrLf
Else
s = s & vbTab & "Non Système" & vbCrLf
End If
If lAtt And Directory Then
s = s & vbTab & "Répertoire" & vbCrLf
Else
s = s & vbTab & "Non Répertoire" & vbCrLf
End If
If lAtt And Archive Then
s = s & vbTab & "Archive positionné" & vbCrLf
Else
s = s & vbTab & "Archive non positionné" & vbCrLf
End If
If lAtt And Alias Then
s = s & vbTab & "Raccourci" & vbCrLf
Else
s = s & vbTab & "Non Raccourci" & vbCrLf
End If
If lAtt And Compressed Then
s = s & vbTab & "Compressé" & vbCrLf
Else
s = s & vbTab & "Non Compressé" & vbCrLf
End If
MsgBox s
End Sub
Code VB : Fournir la liste des sous-dossiers et des fichiers d'un dossier
L'exemple suivant affiche l'ensemble des sous-dossiers du dossier sFolderName dans une liste déroulante List1 et l'ensemble des fichiers de ce même dossier dans une liste déroulante nommée List2.
Sub ListSubFoldersAndFiles()
Dim fso As Scripting.FileSystemObject
Dim fd As Scripting.Folder
Dim fl As Scripting.File
Dim fdCur As Scripting.Folder
Dim sFolderName As String
' Initialisation du nom du dossier
sFolderName = "d:\"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier source existe bien.
If fso.FolderExists(sFolderName) Then
' Récupérer l'instance du dossier.
Set fd = fso.GetFolder(sFolderName)
'Lister les sous-dossiers
For Each fdCur In fd.SubFolders
List1.AddItem fdCur.Name
Next fdCur
'Lister les fichiers
For Each fl In fd.Files
List2.AddItem fl.Name
Next fl
Else
MsgBox "Dossier non trouvé!"
End If
End Sub
Création d'un dossier
Sub CreateFolder()
Dim fso ' As Scripting.FileSystemObject
Dim fd ' As Scripting.Folder
Dim sFolderName ' As String
' Initialisation du nom du dossier
sFolderName = "d:\MonDossier"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier à créer n'existe pas
If Not fso.FolderExists(sFolderName) Then
' Créer le dossier.
Set fd = fso.CreateFolder(sFolderName)
MsgBox "Le dossier " & sFolderName & " a été créé"
Else
MsgBox "Le dossier " & sFolderName & " existe déjà!"
End If
End Sub
Suppression d'un dossier
Comme nous l'avons vu au début de ce document, deux méthodes sont possibles pour réaliser certaines actions, telles que la copie, le déplacement ou la suppression d'un dossier: soit en utilisant l'objet Folder directement, soit en utilisant l'objet FileSystemObject.
Exemple utilisant l'objet Folder
Sub DeleteFolder1()
Dim fso ' As Scripting.FileSystemObject
Dim fd ' As Scripting.Folder
Dim sFolderName ' As String
' Initialisation du nom du dossier
sFolderName = "d:\MonDossier"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier à supprimer existe bien
If fso.FolderExists(sFolderName) Then
Set fd = fso.GetFolder(sFolderName)
fd.Delete
MsgBox "Le dossier " & sFolderName & " a été supprimé"
Else
MsgBox "Le dossier " & sFolderName & " n'existe pas"
End If
End Sub
Exemple utilisant l'objet FileSystemObject
Sub DeleteFolder2()
Dim fso ' As Scripting.FileSystemObject
Dim sFolderName ' As String
' Initialisation du nom du dossier
sFolderName = "d:\MonDossier"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier à supprimer existe bien
If fso.FolderExists(sFolderName) Then
fso.DeleteFolder sFolderName, False
MsgBox "Le dossier " & sFolderName & " a été supprimé"
Else
MsgBox "Le dossier " & sFolderName & " n'existe pas"
End If
End Sub
Haut de page
La gestion des fichiers est très similaire à la gestion des dossiers. Les exemples de code qui gérent les fichiers sont donc très analogues à ceux gérant les dossiers.
C'est pourquoi nous ne fournirons ici qu'un seul exemple de code qui permet la création d'un fichier texte.
Création d'un fichier texte
Sub CreateTextFile()
Dim fso ' As Scripting.FileSystemObject
Dim fl ' As Scripting.File
Dim sFileName ' As String
' Initialisation du nom du dossier
sFileName = "d:\MonTest.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le fichier à créer n'existe pas
If Not fso.FileExists(sFileName) Then
' Créer le fichier.
Set fd = fso.CreateTextFile(sFileName, False)
MsgBox "Le fichier " & sFileName & " a été créé"
Else
MsgBox "Le fichier " & sFileName & " existe déjà!"
End If
End Sub
Lecture / Ecriture de fichiers
La lecture/écriture de fichier est réalisée en s'appuyant sur l'objet TextStream. Il est à noter que l'objet TextStream gère aussi bien des fichiers ASCII qu'Unicode.
Lecture d'un fichier complet
Private Sub ReadAllFile()
Dim fso ' As Scripting.FileSystemObject
Dim ts ' As Scripting.TextStream
Dim s ' As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("d:\MonTest.txt", ForReading)
s = ts.ReadAll
MsgBox s
ts.Close
Set fso = Nothing
End Sub
Code VB: Lecture d'un fichier ligne à ligne
Ceci peut par exemple être utile si on désire réaliser des opérations particulières sur chacune des lignes. L'exemple suivant montre comment afficher dans une boite de dialogue Windows chacune des lignes provenant d'un fichier créé par le programme Edit dans une invite de commande Dos. On utilisera par exemple pour le test un fichier qui contient la chaîne de caractère suivante : "Chaîne de caractères créée avec Edit"
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA"
(ByVal _ lpszSrc As String, ByVal lpszDst As String) As Long
Sub ReadFile()
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Dim strLine As String
Dim strDest As String
Dim bRet As Boolean
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("d:\MonTestDos.txt", ForReading)
strDest = String(255, 0)
Do While Not ts.AtEndOfStream
strLine = ts.ReadLine
bRet = OemToChar(strLine, strDest)
MsgBox strDest
Loop
ts.Close
Set fso = Nothing
End Sub
Ecriture dans un fichier
Const ForWriting = 2
Sub WriteFile()
Dim fso ' As Scripting.FileSystemObject
Dim ts ' As Scripting.TextStream
Dim str ' As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("d:\MonFichier.txt", ForWriting, True)
ts.WriteLine "Hello"
ts.WriteBlankLines (2)
ts.WriteLine ("World!")
ts.Close
Set fso = Nothing
End Sub
Remarque:
Dans sa version actuelle, ce modèle permet de lire/écrire des fichiers au format texte. Si l'on désire lire/écrire des fichiers au format binaire, on utilisera soit les méthodes classiques de lecture/écriture de Visual Basic (Open, Get, Put, Close), soit l'objet Stream fourni avec ADO (à partir de la version 2.5).
L'exemple suivant montre comment lire un fichier binaire en VB avec les méthodes classiques.
Function readBinFile(ByVal strFilename As String) As Variant
Dim lLength As Long
Dim FileNum As Long
Dim binByte() As Byte
Dim binFileStr As String
On Error GoTo errHandler
FileNum = FreeFile
Open strFilename For Binary Access Read As #FileNum
lLength = FileLen(strFilename)
ReDim binByte(lLength)
Get #FileNum, , binByte
Close #FileNum
readBinFile = binByte
Exit Function
errHandler:
Exit Function
End Function
L'exemple suivant montre comment lire un fichier binaire en VB avec l'objet ADODB.Stream
L'exemple suivant montre comment lire un fichier binaire en VB avec l'objet ADODB.Stream
Private Sub readBinFile2()
Dim objStream As ADODB.Stream
Dim strFilePath As String
strFilePath = "d:\temp\test1.xls" 'Nom du fichier à lire.
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strFilePath
Debug.Print objStream.Read
objStream.Close
Set objStream = Nothing
End Sub
Haut de page
Pour naviguer dans le modèle objet
On consultera le document suivant:
https://msdn.microsoft.com/fr-fr/library/tyd4tfw8.aspx
Quelques articles ou fiches techniques
- Q186118 : HOWTO: Use FileSystemObject with Visual Basic
https://support.microsoft.com/support/kb/articles/q186/1/18.asp - Q185476 : HOWTO: Search Directories to Find or List Files
https://support.microsoft.com/support/kb/articles/q185/4/76.asp - Q189751 : Limitations of the FileSystemObject
https://support.microsoft.com/support/kb/articles/q189/7/51.asp - Q185601 : HOWTO: Recursively Search Directories Using FileSystemObject
https://support.microsoft.com/support/kb/articles/q185/6/01.asp - Q190882 : SAMPLE: FSOSAMP.EXE Application Uses the FileSystem Object
https://support.microsoft.com/support/kb/articles/q190/8/82.asp
Ou trouver des informations complémentaires?
MSDN propose un ensemble d'articles sur cette technologie.
https://msdn.microsoft.com/fr-fr/vbasic/default.aspx
Haut de page