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 d'un dossier avec progressbar


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Copie d'un dossier avec progressbar
    Bonjour,

    J'utilise Visual basic 2008 express depuis peu et je souhaite réaliser une petite application dont le rôle sera de copier un dossier, avec ses sous-dossiers et fichiers dans un autre dossier (équivalent d'un xcopy x:\source y:\destination /s/e).

    Comme la copie peut durer un petit moment, je souhaiterais ajouter une barre de progression pour que l'utilisateur ne s'impatiente pas.

    Mais après plusieurs heures de recherche, je commence à me décourager car je n'ai rien trouvé d'exploitable.

    C'est pourquoi je me tourne vers vous.

    Auriez-vous des pistes ou un exemple de code assez simple que je pourrais utiliser comme base ?

    Merci d'avance...
    cordialement,

  2. #2
    Membre expérimenté Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour,

    Vous pouvez regarder du côté du BackgoundWorker pour faire un thread d'arrière plan. Et dans la méthode Work() de ce thread, une boucle qui parcours les fichiers à traiter...

    En espérant avoir répondu à votre question.
    Ingénieur Multimédia - TMM Communication

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Pour le BackGroundWorker, regarde sur ce site il y a un tutos et j'ai même créé une source dessus !

    Go to : http://aspic.developpez.com
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Qu'est-ce qui te pose problème exactement ? Je suppose que tu as déjà trouvé le contrôle ProgressBar... pour faire avancer la barre il suffit de modifier la propriété Value au fur et à mesure de ton traitement.

    Pour ne pas bloquer l'interface pendant le traitement, il faut faire la copie dans un autre thread (c'est à dire un autre "fil d'exécution" qui s'exécute en parallèle). Le plus simple pour faire ça est d'utiliser le BackgroundWorker, mentionné dans les posts ci-dessus. Par contre, tu ne peux pas modifier l'interface graphique (et donc la ProgressBar) directement à partir d'un autre thread : à la place, tu appelles la méthode ReportProgress du BackgroundWorker, qui va déclencher un évènement (ProgressChanged) sur le thread de l'interface graphique. Il suffit de gérer cet évènement pour mettre à jour la ProgressBar.

    Voilà, j'espère que c'est à peu près clair... en lisant les tutoriels ça devrait l'être encore plus !

  5. #5
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Perso, pour la progressbar, je te conseille d'aller chercher le poids total des fichiers/repertoires et de jouer sur cela.
    C'est la methode qui est la plus courante et surtout la plus significative.
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Explication
    Merci pour votre aide si rapide. C'est très sympa de votre part.

    Effectivement j'utilise une progressbar, mais je ne sais pas quelle méthode de copie pourra rendre la main à chaque fichier pour pouvoir incrémenter la progressbar. Copyfolder ne convient visiblement pas ?

    Les conseils de Danyel me font penser à une analyse récursive pour obtenir le poids du dossier à copier (à moins qu'il existe une méthode directe), puis une copie récursive fichier par fichier avec incrément de la progressbar ? Suis-je sur la bonne piste ?

    Je ne connaissais pas non plus le BackgoundWorker.
    Mais comme je suis débutant, je souhaiterais d'abord faire un code qui soit le plus simple possible et l'optimiser ensuite (quand j'aurai atteins mon objectif principal).

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut le BGW
    Tout compte fait, j'ai le sentiment que le BGW ne serait peut-être pas une bonne solution pour mon programme car en fait, je ne souhaite pas que l'utilisateur ait la main avant la fin de la copie pour des raisons de procédure (le début d'une étape doit correspondre à la fin de l'étape précédente).
    Qu'en pensez-vous ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Val25 Voir le message
    Les conseils de Danyel me font penser à une analyse récursive pour obtenir le poids du dossier à copier (à moins qu'il existe une méthode directe), puis une copie récursive fichier par fichier avec incrément de la progressbar ? Suis-je sur la bonne piste ?
    Oui, de toutes façons tu devras parcourir tous les répertoires récursivement. Il n'y a pas de méthode de copie d'un répertoire entier. Donc tu peux, par exemple, établir une liste des fichiers à copier tout en calculant la taille totale, puis copier les fichiers un par un. Le pourcentage de progression que tu indiques avec ReportProgress est tailleCopiée / tailleTotale * 100.

    Citation Envoyé par Val25
    Tout compte fait, j'ai le sentiment que le BGW ne serait peut-être pas une bonne solution pour mon programme car en fait, je ne souhaite pas que l'utilisateur ait la main avant la fin de la copie pour des raisons de procédure (le début d'une étape doit correspondre à la fin de l'étape précédente).
    Qu'en pensez-vous ?
    Si tu n'utilises pas de BackgroundWorker ou de thread, l'interface ne répondra plus jusqu'à la fin du traitement, donc l'utilisateur ne verra pas la progression...

  9. #9
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Val25 Voir le message
    Tout compte fait, j'ai le sentiment que le BGW ne serait peut-être pas une bonne solution pour mon programme car en fait, je ne souhaite pas que l'utilisateur ait la main avant la fin de la copie pour des raisons de procédure (le début d'une étape doit correspondre à la fin de l'étape précédente).
    Qu'en pensez-vous ?
    Dans ce cas là, tu peux toujours bloquer "l interface" (disabled les boutons...) pour que l'utilisateur ne fasse pas de betises toujours en utilisant un BackGroundWorker.

    Sinon pour obtenir le poids des fichiers, il faut faire une procédure récursive.

    Va dans la FAQ, j'ai écris des exemples pour lister les fichiers et dossiers dans une Treeview et Listview !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut [résolu]
    Voici le code le plus simple que j'ai pu obtenir :

    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
     
    Private Sub CopyFolder(ByVal Path_Source As String, ByVal Path_destination As String)
            Dim TheSubFolder As String()
            Dim TheFiles As String()
            Dim SubFolder_name As String
            Dim Path_dest As String
     
            TheSubFolder = Directory.GetDirectories(Path_Source)
            TheFiles = Directory.GetFiles(Path_Source)
     
            'On ne garder que la fin du chemin source
            SubFolder_name = Replace(Path_Source, Path_Profile, "")
     
            'On complète le chemin de destination avec la fin du chemin source
            Path_dest = Path_destination & "\" & SubFolder_name
     
            'On crée le sous-dossier destination s'il n'existe pas
            If Not My.Computer.FileSystem.DirectoryExists(Path_dest) Then
                My.Computer.FileSystem.CreateDirectory(Path_dest)
            End If
     
            'On copie les fichiers
            For Each currentFile As String In TheFiles
                My.Computer.FileSystem.CopyFile(currentFile, Path_dest & "\" & System.IO.Path.GetFileName(currentFile), True)
                taille_copie += currentFile.Length
                ProgressBar1.Value = Int(taille_copie)
            Next
     
            'Récursivité pour chaque sous-dossier
            For Each SubFolder As String In TheSubFolder
                Call CopyFolder(SubFolder, Path_destination)
            Next
        End Sub
    Voila, c'est la complétion du chemin de destination qui m'a le plus posé problème. En effet, si le chemin source est D:\temp\toto\titi, le chemin de destination devra être D:\sauvegarde\toto\titi.
    Cette partie du code ne me plait pas trop car elle fait intervenir une variable globale (path_profile).

    Si vous avez une autre idée...

    En tout cas merci de votre aide.

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Le code ne me choque pas spécialement, tu pourrais te passer de ta variable globale en passant des chemins complets en paramètre.

    Et penses au tag
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Val25
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call CopyFolder(SubFolder, Path_destination)
    Euh... ça fait longtemps qu'on a plus besoin de mettre Call devant un appel de fonction
    Je crois que la dernière fois que j'ai eu à utiliser ce mot-clé c'était avec QBASIC

  13. #13
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    En tout cas, il y a une solution plus rapide... regarde dans la FAQ !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut FAQ
    J'ai cherché mais sans succès.
    Serait-il possible de mettre un lien ?
    merci

  15. #15
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Finalement
    Joli code effectivement et en + il gère les erreurs.
    Merci.

  17. #17
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Et oui ! La prochaine fois, fait une recherche plus attentive
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Copie Certains Dossiers (avec leurs arborescences)
    Par stzurg dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 28/08/2011, 14h19
  2. Copie d'un dossier avec la publication
    Par amoniaque dans le forum VB.NET
    Réponses: 7
    Dernier message: 27/01/2009, 12h25
  3. lire un fichier copié dans un dossier avec le meme code
    Par vieri31 dans le forum C++Builder
    Réponses: 22
    Dernier message: 27/05/2008, 03h23
  4. Copie de fichiers avec progressbar
    Par serialmatrix dans le forum C++
    Réponses: 3
    Dernier message: 11/02/2006, 18h30

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