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
Langage du code : VB.NET (vbnet)
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
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 🙂