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

En espérant que cela puisse servir à quelques uns d’entre vous.

6 commentaires sur VB.Net : copier un répertoire
  1. pcpunch Répondre

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

  2. Alex CoolZEn Répondre

    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 🙂

  3. Alex CoolZEn Répondre

    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

  4. Alex CoolZEn Répondre

    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 🙂

  5. Alex CoolZEn 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 🙂

Laisser un commentaire

Votre adresse email ne sera pas publiée. Merci de saisir votre nom ou pseudo (pas de pseudo SEO merci !), votre email et votre commentaire.