IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Copie de répertoire avec progression


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 12
    Par défaut Copie de répertoire avec progression
    Bonjour a tous,
    Je cherche donc a copier un répertoire(et ses sous-répertoires) avec l'affichage de la progression de la copie sur une progressbar.J'ai déjà fait des recherches mais je n'ai trouvé que des codes pour copier des fichiers avec la progression.
    Merci d'avance @+.

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour, l'API Win32 SHFileOperation permet de faire cela. Il me semble que la biblio dvp.net contient un code de copie de dossiers basée sur cette API.

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut copier un répertoire(et ses sous-répertoires) avec l'affichage de la progression de la copie
    bonjour Nimbus629
    Mais ou as-tu cherche prof Nimbus?Ah le bon vieux prof qui ne s'egare jamais lui.
    Mais le progressbar est gratuit ,out of the box de chez VB.Net dans My.Computer.FileSystem.CopyDirectory.

    voici le bout de code avec un form et un tout petit class DirectoryCopy. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    'CODE DU FORM
     
    '1 Button
    '2 FolderBrowserDialog
    'Le progressbar Windows est gratuit.Pas besoin de le coder
    Public Class frmCopyFolders
        'dossier source
        Private dirNameSource As String
        'nouveau dossier cible (à creer FolderBrowserDialog2  s'il n'existe pas)
        Private dirNameDest As String
     
     
        Private Sub SelectCopyFolders_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectCopyFolders.Click
            dirNameSource = String.Empty
            dirNameDest = String.Empty
            Dim result As DialogResult
            ' Show the FolderBrowserDialog 1.
            result = FolderBrowserDialog1.ShowDialog()
            If (result = DialogResult.OK) Then
                dirNameSource = FolderBrowserDialog1.SelectedPath
                If Len(dirNameSource) = 0 Then Exit Sub
     
            End If
            ' Show the FolderBrowserDialog 2.
            result = FolderBrowserDialog2.ShowDialog()
            If (result = DialogResult.OK) Then
                dirNameDest = FolderBrowserDialog2.SelectedPath
                If Len(dirNameDest) = 0 Then Exit Sub
     
            End If
     
            Call DirectoryCopy.DirectoryCopy(dirNameSource, dirNameDest)
     
        End Sub
     
    End Class
     
    'CODE DU TOUT PETIT  CLASS DIRECTORYCOPY
    'pour avoir le progressbar windows specifier le parametre :
    'FileIO.UIOption.AllDialogs dans My.Computer.FileSystem.CopyDirectory
    'C'est identique si on utilise la consort pour copier des fichiers
    'savoir:My.Computer.FileSystem.CopyFile
     
    Imports System
    Imports System.IO
     
    Public Class DirectoryCopy
     
        Public Shared Sub DirectoryCopy( _
            ByVal sourceDirName As String, _
            ByVal destDirName As String)
     
     
            Dim dir As DirectoryInfo = New DirectoryInfo(sourceDirName)
            Dim dirs As DirectoryInfo() = dir.GetDirectories()
     
            ' If the source directory does not exist, throw an exception.
            If Not dir.Exists Then
                Throw New DirectoryNotFoundException( _
                    "Source directory does not exist or could not be found: " _
                    + sourceDirName)
            End If
     
            ' If the destination directory does not exist, create it.
            If Not Directory.Exists(destDirName) Then
                Directory.CreateDirectory(destDirName)
            End If
            ' Copy directories and  subdirectories.
            My.Computer.FileSystem.CopyDirectory(sourceDirName, destDirName, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
     
        End Sub
     
    End Class
    bon code....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 12
    Par défaut
    Merci pour vos réponses
    Mabrouki, je voudrais savoir s'il est possible de récupérer la valeur de la progressbar qui s'affiche dans la fenêtre Windows lors de la copie , pour la retranscrire sur une progressbar présente sur ma form.
    Merci encore @ +

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut DirectoryCopy et progressbar perso
    Rebonjour nimbus629

    Non helas ,ca n'est pas possible d'acceder au progressbar de My.Computer.FileSystem.CopyDirectory .
    Mais......nimbus mais oui ...tu peux faire ton progressbar personnalise et la copie du dossier et des sous-dossiers comme My.Computer.FileSystem.CopyDirectory
    L'exemple ci-apres qui utilise Directory et ses sous-classes nous permet de prendre tout en main.
    Le form principal est identique au premier deja transmis.La difference vient de la classe
    - DirectoryCopyExample qui permet de copier dossier principal et sous-dossier
    -frmProgress que tu personnalisera comm il te plait avec :
    -un progressbar qui affiche pourcentage de progression des fichiers copies
    -1er label Haut affiche le nom du dossier et fichier copie
    -2eme label Bas affiche le pourcentage de progression en %.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    'Form principal identique au premier deja poste
    '1 Button
    '2 FolderBrowserDialog
     
    Imports System.IO
    Public Class frmCopyFoldersPerso
        'dossier source
        Private dirNameSource As String
        'nouveau dossier cible (à creer FolderBrowserDialog2  s'il n'existe pas)
        Private dirNameDest As String
     
     
        Private Sub SelectCopyFolders_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectCopyFolders.Click
            dirNameSource = String.Empty
            dirNameDest = String.Empty
            Dim result As DialogResult
            ' Show the FolderBrowserDialog 1.
            result = FolderBrowserDialog1.ShowDialog()
            If (result = DialogResult.OK) Then
                dirNameSource = FolderBrowserDialog1.SelectedPath
                If Len(dirNameSource) = 0 Then Exit Sub
     
            End If
            ' Show the FolderBrowserDialog 2.
            result = FolderBrowserDialog2.ShowDialog()
            If (result = DialogResult.OK) Then
                dirNameDest = FolderBrowserDialog2.SelectedPath
                If Len(dirNameDest) = 0 Then Exit Sub
     
            End If
            'si True tous les sous-dossiers sont copies
            Call DirectoryCopyExample.DirectoryCopy(dirNameSource, dirNameDest, True)
     
        End Sub
     
    End Class
     
    '1-Classe DirectoryCopyExample 
    '- copie "recursivement" le dossier source et ses sous dossiers
    'L'utilisateur peut spécifier si les sous-répertoires doivent également être copiés. 
    '-si copySubDirs=True, la méthode les copie de manière récursive 
    'en s'appelant sur chaque sous-répertoire suivant 
    'jusqu'à ce que toutes les copies soient effectuées.
     
    Imports System
    Imports System.IO
     
    Public Class DirectoryCopyExample
        Public Shared Sub DirectoryCopy( _
            ByVal sourceDirName As String, _
            ByVal destDirName As String, _
            ByVal copySubDirs As Boolean)
     
     
            Dim dir As DirectoryInfo = New DirectoryInfo(sourceDirName)
            Dim dirs As DirectoryInfo() = dir.GetDirectories()
     
            ' If the source directory does not exist, throw an exception.
            If Not dir.Exists Then
                Throw New DirectoryNotFoundException( _
                    "Source directory does not exist or could not be found: " _
                    + sourceDirName)
            End If
     
            ' If the destination directory does not exist, create it.
            If Not Directory.Exists(destDirName) Then
                Directory.CreateDirectory(destDirName)
            End If
     
            ' Get the file contents of the directory to copy.
            Dim files As FileInfo() = dir.GetFiles()
     
            'Initialise  frmProgress & Affiche la copie en pourcent 
            Dim frm As frmProgress = New frmProgress
            frm.ProgressBar1.Minimum = 1
            frm.ProgressBar1.Maximum = 100
            frm.ProgressBar1.Value = 1
            frm.ProgressBar1.Step = 1
            frm.Show()
            frm.TopMost = True
            Dim strDisplay As String = String.Empty
            Dim strPerCent As String = String.Empty
            For Each file In files
                ' Create the path to the new copy of the file.
                Dim temppath As String = Path.Combine(destDirName, file.Name)
     
                ' Copy the file.
                file.CopyTo(temppath, True)
                'Update ProgressBar1
                frm.ProgressBar1.PerformStep()
     
                'Display
                frm.lblPerCent.Text = CInt(100 * frm.ProgressBar1.Value / files.Length)
                frm.lblPerCent.Refresh()
                frm.lblDirectoryFiles.Text = file.DirectoryName & file.Name
                frm.lblDirectoryFiles.Refresh()
            Next file
            frm.Close()
     
            ' If copySubDirs is true, copy the subdirectories.
            ' la methode DirectoryCopy s'appelle elle-meme  "recursivement" 
            ' pour faire la copie des sous-dossier ..et les afficher......ainsi de suite
            If copySubDirs Then
                For Each subdir In dirs
                    ' Create the subdirectory.
                    Dim temppath As String = _
                        Path.Combine(destDirName, subdir.Name)
     
                    ' Copy the subdirectories.
                    DirectoryCopy(subdir.FullName, temppath, copySubDirs)
     
                Next subdir
            End If
        End Sub
     
     
     
    End Class
     
    'un simple frmProgress  charge d'afficher:
    '- 1 progressBar 
    '- 2 labels d'information  
    Public Class frmProgress
     
    End Class
    pj: le fichier rar de frmProgress à toute fins utiles
    bon code..............

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Malheureusement ce code présente plusieurs problèmes.
    * Tout est fait sur le thread UI et va donc bloquer celui-ci.
    * Le maximum de la barre de progression est bogué, il correspond toujours à 100 fichiers. Il faudrait corriger cela et tenir compte de la taille des fichiers à copier.
    * Le comportement en cas de sous-répertoires est déficient : la barre de progression repart à zéro à chaque sous-répertoire.
    * Par expérience, mieux vaut utiliser dir.GetFileSystemEntries() plutôt que dir.GetDirectories et dir.GetFiles, le gain de performances est notable.
    * Aucune séparation de l'UI et de la logique.
    * Un code niveau UI ne devrait pas renvoyer d'exceptions, il devrait les traiter directement pour afficher le message d'utilisateur approprié et éventuellement décider des étapes à suivre, par exemple effacer le contenu déjà copié en cas d'échec.
    * Très faible maintenabilité et évolutivité : passer à un déplacement des fichiers, fournir un mécanisme d'annulation de l'opération, etc... Tout cela nécessite une réécriture totale.

    Encore une fois... SHFileOperation. 4 heures de boulot pour un code parfait, bien plus rapide, couvrant tous les cas de figure, qui sera réutilisable pendant vingt ans et sans avoir à être retouché.

Discussions similaires

  1. [MS-DOS]Copie de répertoire avec filtre
    Par tripper.dim dans le forum Windows
    Réponses: 5
    Dernier message: 07/10/2014, 23h23
  2. Script copie de répertoire avec rétention de 30 jours
    Par liondu75 dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 17/06/2011, 14h44
  3. copie de répertoire avec barre de progression
    Par s7even dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/12/2009, 19h36
  4. Copie de fichiers avec détails de progression
    Par Shypster dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2008, 22h51
  5. Batch : copy d'un répertoire avec des espaces
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 26/10/2005, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo