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 :

VB.net Framework 4 - copie de dossier avec barre de progression


Sujet :

VB.NET

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut VB.net Framework 4 - copie de dossier avec barre de progression
    Bonjour,

    Pour le compte d'une société en tant qu'auto entrepreneur, on m'a demander de créer un logiciel d'archivage de divers schémas.

    C'est quelque chose de simpliste, recherche d'archive et archivage.

    Le projet est développé en VB.net au stade Framework 4 (je sais pas si c'est bien dis mais j'imagine que les infos sont justes). Cela m'a été imposé pour une raison de Windows XP

    1. L'utilisateur saisit les infos du dossier : num de contrat, etc ... (je n'ai pas le droit de divulgué toutes les infos)

    2. Il saisit aussi les pièces à joindre (des dossiers volumineux contenant divers fichiers type PDF / word(.doc) / Word(.docx) / JPG / BMP).

    3. Il clic sur archiver et la copie commence.

    4. Si la copie est ok ajout dans la base de donnée sinon suppression des résidus.

    Je coince au numéro 3 ...

    Je voudrais faire quelque chose de propre avec une barre de progression.

    A la place pour l'instant j'ai un bricolage pour ne pas être bloquer sur le reste mais je voudrais palier à ce problème.

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    MkDir(Application.StartupPath & "\archives\" & archive.ANUM & " " & archive.ANAME & " " & archive.AVERSION)
     
    copyreturn = DirectoryCopy(archive.ARoot, Application.StartupPath & "\archives\" & archive.ANUM & " " archive.ANAME & " " & archive.AVERSION & "\", True)
    C'est pas vraiment terrible et très simpliste pour plusieurs raison :
    - L'application ce fige le temps de la copie
    - L'application n'affiche pas de progression

    Je n'en suis plus à mon coup d'essai, mais le fait qu'on m'est imposé le vb.net comme langage m'handicape un peu car je ne le connais que peu.

    Si quelqu'un à une idée pour faire les choses mieux, je suis preneur.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Ta solution tourne autour d'un BackgroundWorker

    Bon code,
    J@ck.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut Merci
    Je vais tester ça d'ici fin de semaine, j'ai des choses en route des choses que je peux finir les yeux fermé que je vais faire en priorité,

    Je te remercie en tout cas de ta participation, ça à en effet l'air d'être une solution parfaite !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut Réponse tardive
    Bonjour,

    La dite solution fonctionne relativement bien, je ne peux pour l'instant en tout cas pas mettre résolu.

    Je vous explique, l'objectif est de créer un module générique implantable au travers de cette solution, et pourquoi pas d'autres à venir.

    En gros je dois avoir une fonction générique de départ dont l'entête est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Public Sub StartCpy(ByVal src As String, ByVal dest As String, Optional ByRef pgb As ProgressBar = Nothing, Optional ByRef NB As String = "", Optional ByRef NBTot As String = "")
    J'ai actuellement un backgroundworker qui s'occupe de la copie et décider de coupler ça à un thread qui tant que le backgroundworker fonctionne va calculer le nombre de fichier et la taille maxi ainsi que le nombre de fichier déjà copier et la taille déjà copier.

    Jusque la pas de soucis, sauf que, bien que le paramètre soit optionnel, je n'arrive pas à l'utiliser depuis le thread que je créer plus tard afin de modifier la propriété " maximum " ainsi que la propriété " value " de la barre de progression.

    J'ai essayé de faire directement appel au controle depuis le thread, ou de passer sous forme de structure la barre de progression via un " byref " mais je ne suis pas parvenu à mes fins.

    La déclaration de mon Thread se fait dans l'entête du module comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Public CP_Thread As Thread
    Le lancement du thread comme suit (dans la fonction StartCpy):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        CP_Thread = New Thread(AddressOf CpyThreadSub)
        CP_Thread.IsBackground = True
        CP_Thread.Start()
    Voici également le contenu de mon CpyThreadSub actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        Public Sub CpyThreadSub()
            While backgroundWorker1.IsBusy = True
     
                Thread.Sleep(100)
                Form1.ProgressBar1.Value = CP_Value.NB
                Form1.ProgressBar1.Maximum = CP_Value.NBTot
                Form1.ProgressBar1.Refresh()
     
     
            End While
     
        End Sub
    Du fait, ce n'est que pour " essayé " déjà que j'ai fais cela, mais rien que ça, sa ne fonctionne pas.

    J'aimerais vraiment récupéré les paramètres en provenance de StartCpy(...) pour modifier la valeur, de manière à rester générique et n'avoir besoin que de l'entête de fonction pour tout faire.

    Si quelqu'un sait comment faire, je suis preneur, j'ai entendu parler de invoke mais je n'ai rien compris à ce sujet ... Les threads sont complètement différent de ce que j'en sais dans les autres langages que j'utilise :s.

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    bonjour,

    Plusieurs choses :

    - utilisation des fichiers modules a proscrire, il faut préférer utiliser des classes shared ......
    - le bgw est un thread donc inutile d appeler un autre thread prealablement ou durant car sinon il risque d y avoir desynchronisation donc bugs de refresh UI ...etc.....
    - le bgw possede l event ProgressChanged donc ul faut appeler la methode reportProgress dans le DoWork afin de mettre a jour l'UI.

    Regardes MSDN pour plus d infos

    ++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut Suite
    Plusieurs choses :

    - utilisation des fichiers modules a proscrire, il faut préférer utiliser des classes shared ......

    -> je veux bien, j'aimerais quelques infos à ce sujet à ce moment la, quelle différence entre des module de classe et des modules de fonction classique ? j'ai utilisé ça en cours à l'époque et je n'ai pas souvenir des modules de classe.
    Aussi, tout ce que j'ai programmer d'autre est déjà en module classique et fonctionne bien, quelle difficulté pour convertir tout ça ?

    - le bgw est un thread donc inutile d appeler un autre thread prealablement ou durant car sinon il risque d y avoir desynchronisation donc bugs de refresh UI ...etc.....

    -> Jusque la ok

    - le bgw possede l event ProgressChanged donc ul faut appeler la methode reportProgress dans le DoWork afin de mettre a jour l'UI.

    -> C'est la que le soucis ce pose, la copie telle que je la fait actuellement, c'est une seule ligne de code (je rappelle que je copie soit un fichier unique, soit un dossier contenant plusieurs gros fichier).
    En ce qui concerne la copie, j'utilisais (je pensais conserver ceci) la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copyreturn = DirectoryCopy(archive.ARoot, Application.StartupPath & "\archives\" & archive.ANUM & " " archive.ANAME & " " & archive.AVERSION & "\", True)
    Du coup, dans le même lapse de temps que le bgw je pensais déclencher un autre thread pour compter les fichiers déjà copier par cette ligne. Je me trompe peut être dans la manière de procédé.
    Sinon, j'ai bien lu et compris le ProcessChanged et ReportProgress, je m'étais basé sur le premier exemple de MSDN pour ce faire dispo ici :

    https://msdn.microsoft.com/fr-fr/lib...code-snippet-1

    C'est vrai qu'en y repensant à ce niveau, pas de soucis avec l'UI, ça fonctionnais bien !

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. Javascript copy de repertoire avec barre de progression
    Par avalokitech dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/01/2011, 16h56
  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 fichier avec barre de progression
    Par Papy214 dans le forum C#
    Réponses: 6
    Dernier message: 06/11/2008, 10h17
  5. Copie de fichiers avec détails de progression
    Par Shypster dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2008, 22h51

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