Article publié en 2012 : certaines informations techniques peuvent avoir évolué depuis.
Chose incroyable dans le .Net Framework 4.0 (et inférieurs), il n’existe aucune fonction native pour copier un répertoire en VB.Net ! On peut déplacer des répertoires, en créer (avec arborescence complète !) ou en supprimer et renommer, mais pas en copier avec leur contenu.
Voici un bout de code ± optimisé palliant à ce manque surprenant…
Imports System.IO
Imports System.Threading.Tasks
''' <summary>
''' Copie un répertoire (et tout son contenu) vers un nouvel emplacement
''' </summary>
''' <param name="sSourcePath">Chemin du répertoire source à copier</param>
''' <param name="sDestinationPath">Chemin du répertoire de destination</param>
''' <returns>VRAI si la copie se déroule bien, FAUX sinon</returns>
''' <remarks></remarks>
Public Function CopyDir(ByVal sSourcePath As String, ByVal sDestinationPath As String) As Boolean
'Appelle la version utilisant les objets DirectoryInfo
Return CopyDir(New DirectoryInfo(sSourcePath), New DirectoryInfo(sDestinationPath))
End Function
''' <summary>
''' Copie un répertoire (et tout son contenu) vers un nouvel emplacement
''' </summary>
''' <param name="oSource">Objet DirectoryInfo représentant le répertoire source à copier</param>
''' <param name="oDestination">Objet DirectoryInfo représentant le répertoire de destination</param>
''' <returns>VRAI si la copie se déroule bien, FAUX sinon</returns>
''' <remarks></remarks>
Private Function CopyDir(ByVal oSource As DirectoryInfo, ByVal oDestination As DirectoryInfo) As Boolean
Dim bResult As Boolean = True 'Retour de la copie (VRAI = succès)
Try
oDestination.Create() 'Création du répertoire de destination (le cas échéant)
'Copie de tous ses fichiers (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
oFichier.CopyTo(Path.Combine(oDestination.FullName, oFichier.Name))
End Sub)
'Copie (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()
CopyDir(oSousRepertoire, oDestination.CreateSubdirectory(oSousRepertoire.Name))
Next
Catch ex As Exception
'Si une erreur se produit, on indique l'erreur - à adapter selon vos besoins, notamment pour tracer les sources d'erreur !
bResult = False
End Try
Return bResult
End Function
En espérant que cela puisse servir à quelques uns d’entre vous.
À noter que la fonction ci-dessus utilise partiellement le parallélisme, ce qui permet d’optimiser les performances en copie. On peut très certainement mieux faire, mais à l’usage, cela suffit amplement !
Voir tous les articles de la catégorie Programmation



6 commentaires
Très bon code, Pardonnez mon ignorance lol mais si je veux écraser les fichiers de destination ?
C’est vraiment pile ce que je cherchais ; après avoir parcuru une dizaine d’exemples, plutot compliqués, je suis heureux de tomber sur un code qui semble simple et efficace 🙂 Je vais tester, et je reviens commenter le résultat 🙂 Cela dit, il vaut mieux un qui sait plutot que 10 qui cherchent :)Un grand merci, d’avance 🙂
Re bonjour ;
Bon, j’essaie de tester, mais je n’arrive pas a lancer la fonction.
J’ai remplacer « oSource » par « Src » et « oDestination » par « FinPath », qui sont des variables de type string, contenant les noms des chemins source et cible.
Pourriez vous m’indiquer la syntaxe correcte SVP ?
Par exemple, copydir(Src, FinPath) renvoie un message d’erreur « impossible de convertir une valeur string en directoryinfo »
Merci
Re bonjour 🙂
J’ai trouvé 🙂
J’ai remis le nom des variables initial, et j’ai ajouté les lignes suivantes pour appeler la fonction CopyDir :
Dim oSource As New DirectoryInfo(Src)
Dim oDestination As New DirectoryInfo(FinPath)
CopyDir(oSource, oDestination)
Il ne me reste plus qu’a traiter en fonction de la valeur retournée par bResult 🙂
Ah ok 🙂
J’étais en train de vous répondre 😉
Re 🙂
J’ai mis le try=>catch=>end try juste dans la Sub(oFichier As FileInfo), sinon, le code plante en cas d’existence du dossier de destination, alors qu’à cet endroit, le try=> end try joue parfaitement son role.
Merci encore pour ce code si utile 🙂