VB.Net : copier un répertoire

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

6 réflexions sur “VB.Net : copier un répertoire”

  1. Avatar de pcpunch

    Très bon code, Pardonnez mon ignorance lol mais si je veux écraser les fichiers de destination ?

    Répondre
  2. Avatar de Alex CoolZEn

    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 🙂

    Répondre
  3. Avatar de Alex CoolZEn

    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

    Répondre
  4. Avatar de Alex CoolZEn

    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 🙂

    Répondre
  5. Avatar de Alex CoolZEn

    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 🙂

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut