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 :

Récupérer la taille des fichiers/dossiers dans une même variable [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Récupérer la taille des fichiers/dossiers dans une même variable
    Bonjour,
    Je suis entrain de réaliser un petit programme de sauvegarde qui copiera certain dossiers et fichiers par défaut (profils utilisateurs) et d'autre choisit par l'utilisateur (à l'aide d'un treeview et listbox).
    Dans l'optique de faire une progressbar, est-il possible de créer une variable et de l'incrémenter de la taille des fichiers/dossiers copiers, sans savoir bien sur à l'avance quels seront les fichiers/dossiers copiés.
    Exemple:
    Je demande l’existence de plusieurs dossier pour les copier ce qui donnerai:
    Si tel dossier existe alors
    copie("", "")
    (et là si c'est possible, récupération de la taille du dossier pour incrémentation de tel variable)
    end if

    Pareil pour la copie des profils utilisateurs sachant que je ne récupère que certain dossiers et certain fichiers dans chaque profil.
    Pareil pour les dossiers sélectionnés par l'utilisateur (listés dans une listbox après sélection dans un treeview).
    Et la taille de tous ces fichiers/dossiers irait dans une seule et même variable.

    Je sais pas si j'ai été assez clair.
    Merci de votre aide.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Ici tu trouvera l'information voulu.

    http://msdn.microsoft.com/fr-fr/libr...v=vs.100).aspx

    Pour résumer.

    Tu récupère l'info d'un fichier.
    Tu as las property length qui te permet de connaître la taille en octet du fichier (c'est un long.)

    Tu additionnes le tout, et tu auras la taille total de tes fichiers.


    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Merci egautier18 pour ta réponse, je connaissais déjà la propriété ".Length", mais mon soucis était au début comment par exemple récupérer la taille de dossiers voulus dans chaque profil présent sur l'ordinateur, mais j'ai réussis à faire quelque chose par exemple en prenant le dossier "Favoris" de chaque profil mais pour l'instant j'arrive juste à l'afficher dans une msgbox.
    Je sais pas si mon code est correct mais pour l'instant il fonctionne:

    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
    Sub Taille_Favoris()
            Dim Profil As String
            Dim Users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            For Each Profil In System.IO.Directory.GetDirectories(Users)
                Dim di As New DirectoryInfo(Profil)
                Dim NomProfil As String = di.Name
                Dim attributeReader As System.IO.FileAttributes
                Dim checkFile As System.IO.DirectoryInfo
                checkFile = My.Computer.FileSystem.GetDirectoryInfo(Users & "\" & NomProfil)
                attributeReader = checkFile.Attributes
                If Directory.Exists(Users & "\" & NomProfil & "\Favorites") Then
                    Try
                        If (attributeReader And System.IO.FileAttributes.System) = System.IO.FileAttributes.ReparsePoint Then
                            Continue For
                        Else
                            MsgBox(FolderSize(Users & "\" & NomProfil & "\Favorites"))
                        End If
                    Catch erreur As Exception
                        My.Computer.FileSystem.WriteAllText(Drive & NomPC & "\Erreurs.txt", vbCrLf & "-" & erreur.Message & vbCrLf, True)
                    End Try
                End If
            Next
        End Sub
     
        Public Shared Function FolderSize(ByVal path As String) As Long
            Dim Drive As String = SelectDrives.ComboBox1.SelectedItem  'Drive = la lettre que l'on sélectionne dans la combobox
            Dim NomPC As String = Environment.MachineName  'variable d'environnement qui donne le nom du pc
            Dim size As Long = 0
            Dim directoryInfo As New DirectoryInfo(path)
            Dim files As IEnumerable(Of FileInfo) = directoryInfo.GetFiles("*", SearchOption.AllDirectories)
            For Each file As FileInfo In files
                Try
                    If (file.Attributes And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint Then
                        ' Ignorer le fichier
                        Continue For
                    Else
                        size += file.Length
                    End If
                Catch erreur As Exception
                    My.Computer.FileSystem.WriteAllText(Drive & NomPC & "\Erreurs.txt", vbCrLf & "-" & erreur.Message & vbCrLf, True)
                End Try
            Next
            Return size
        End Function
    Donc ils s'affiche tous dans la msgbox, mais j'aimerai en fait les additionner et retourner le résultat puis faire de même pour tous les dossier comme "mes documents", bureau, images, téléchargements....enfin tous ceux que je veux sauvegarder et les additionner à leurs tour pour avoir la taille de tous ce que je veux copier et l'utiliser dans la progressbar.

    Ou peut être qqu'un connait une autre manière beaucoup plus simple d'utiliser la progressbar lors d'une copie de plusieurs documents.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Si j'ai bien compris la question il te suffit au lieu de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MsgBox(FolderSize(Users & "\" & NomProfil & "\Favorites"))
    d'additionner le retour de FolderSize dans une propriété.
    tu déclares dans ta class/Form ou en début de ta méthode Taille_Favoris une propriété de type long qu'on appelera MyTotalSize
    et ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyTotalSize += FolderSize(Users & "\" & NomProfil & "\Favorites")
    tout comme tu as pu le faire dans la méthode FolderSize.

    Non ? (désolé si j'ai pas compris du coup)

    A+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Ok merci, j'arrive maintenant à avoir la taille totale de toute ma sauvegarde, mais je n'arrive pas à incrémenter ma progressbar.
    voici mon code, j'utilise FolderSize comme pour "favoris" mais pour le dossier de destination (que j'appelle ici " NomPc" et "tailleN" pour sa taille) mais je sais pas si le processus réactualise tout le temps ta taille réel du dossier de destination pour que mon "FolderDestinationSize" s'incrémente tout seul.....sinon comment fait on?


    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
     Function Taille_NomPc()
     
            Dim Users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            Dim tailleN As Double = 0
            If Directory.Exists(Drive & NomPC & "\") Then
                tailleN = FolderSize(Drive & NomPC & "\")
            End If
            Return tailleN
        End Function
     
        Sub progression()
            Dim FolderDestinationSize As Double = 0
            FolderDestinationSize = Taille_NomPc()
            ProgressBar1.Visible = True
            ProgressBar1.Minimum = 1
            ProgressBar1.Maximum = SizeCopie
            ProgressBar1.Value = FolderDestinationSize
            ProgressBar1.Step = 1
            ProgressBar1.PerformStep()
        End Sub
    Mis à par ça, comment sait-on lorsque la copie est fini si on a pas de progressbar, n'y a t il pas un moyen de savoir quand le processus de la copie s’arrête?
    Et ne peut-on utiliser l'activité du processus pour remplir la progressbar et aussi pour afficher dans un label.text le nom du fichier ou dossier copié en cours?
    Merci à toi egautier18

  6. #6
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour Bylliboy,

    Dans un 1er temps :

    Lorsque tu envisages des opérations de copie de répertoires de fichiers, des phases de calcul assez importantes : IL FAUT AU PREALABLE AVOIR SURVOLE LE COURS SUR LES THREADS (BackgroundWorker, Thread, ...etc.....) !
    Sinon tu risques d'être très rapidement embêté lorsque tu voudras mettre à jour ta partie UI de ton programme.

    Dans un 2ème temps :

    Toujours en lisant des bouquins, il ne faut pas négliger les possibilités offertes par les fonctions natives "Win32" (API ou Pinvoke) !
    Une très bonne base de données est dispo ici : http://www.pinvoke.net/

    Pour terminer :

    Afin d'implémenter une progression lors de la copie d'un fichier : http://www.pinvoke.net/default.aspx/kernel32.copyfileex
    Cela reste valable pour l'ensemble des fichiers d'un répertoire, à toi de prévoir l'algo !

    La meilleur solution qui s'offre à toi c'est le composant backgroundWorker, et oui y'a pas de secret : DE LA LECTURE pour les bonnes pratiques


    A+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Oui je sais, je sais, je dois lire tous les tutos, bouquins concernant le vb.net mais bon j'ai pas trop de temps, mon travail et surtout ma vie familiale et sociale me prennent beaucoup de temps (c'est déjà extraordinaire que ma femme et mon gamin me laissent du temps pour pianoter sur mon pc).
    Ceci dit j'ai "survolé" la partie backgroundworker du tuto de M.Plasserre (j'avais lu le tuto de SDZ mais ils ne parlent que rapidement des threads et pas du backgroundworker).
    Bref, j'ai modifié mon code et mis toutes mes fonctions de copie dans le "BackgroundWorker1_DoWork", je sais maintenant quant le processus se fini en l'affichant dans un label, mais j'arrive toujours pas à faire avancer ma progressbar pourtant j'ai mis "ProgressBar1.Value = e.ProgressPercentage" dans le "BackgroundWorker1_ProgressChanged" comme indiqué dans le tuto.
    Et j'aimerai savoir si c'est possible de faire défiler dans un label le nom des fichiers en cours de copie.

    Mon code:
    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
     Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            Label2.Text =  *****  'un code qui afficherai le currentprocess du Backgroundworker1
            Me.PGB_STATUT.Value = e.ProgressPercentage     'progressbar d'un toolstrip
            Me.PGB_STATUT.PerformStep()
        End Sub
     
     
        Private Sub BT_BackUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_BackUp.Click
            'La méthode RunWorkerAsync() du BackgroundWorker déclenche le thread d'arrière plan.
            BackgroundWorker1.RunWorkerAsync()
        End Sub
     
        'La procédure DoWork contient le code effectué en arrière plan.
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            BackgroundWorker1.WorkerReportsProgress = True
     
            'mes calculs très long
            'tous mes sub et fonctions qui exécutent les différentes copies
     
        End Sub
     
        'Quand le code d'arrière plan est terminé la procédure RunWorkerCompleted est exécutée.
        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            ' ici, elle affiche un message indiquant de le thread d'arrière plan est terminé.
            Me.Label2.Text = "SAUVEGARDE TERMINEE"
        End Sub
    J'ai repris les codes et commentaires du tuto.

  8. #8
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir bylliboy,

    Tu n'es pas le seul a avoir une vie de famille qui passe en priorité par rapport a cette passion.......
    J'ai 2 enfants avec un métier, certe dans l'informatique, mais très prenant en relation avec ma disponibilité
    ..... je pense que nous connaissons tous ou en majeure partie, cette position.

    Cependant de la a dire que tu n'as pas le tps......o_O
    Dans la vie on a le temps qu'on veut bien se donner et/ou s' octroyer....nous le faisons pour notre vie de famille alors nous savons et pouvons egalement le faire pour le reste....question de volonté et d'organisation.....je t'épargne le couplet de mon père malade sur le declin ...et tout le lot de soucis qui va avec.......
    Nous ne sommes pas seuls sur terre donc des gens avant nous sont deja passés par la, c'est bien dans ce but que tu sollicites notre aide et que nous te répondont qu'on a rien sans rien
    Je te dis ca en toute sympathie.

    Brefff ...revenons-en a nos moutons....
    En recherchant un peu sur le fofo j'ai deja traité des problemes a peu de chose près similaires en explicitant le fonctionnement du BGW avec une PGB, des phases de MAJ d'UI et de longs calculs.....

    Si tu n'as pas de temps a consacrer a de la lecture alors je ne pourrais pas t'en consacrer davantage au risque de perdre du tps sur l'explication de choses qu'il serait bon d'avoir un minimum acquise.

    J'espére que tu me comprendras...mais ceci dit je ne suis pas le seul dans cette communauté


    @+

    Cdlt jm

  9. #9
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Wallace, j'ai dis que j'avais pas le temps, mais j'ai aussi dis que j'avais lu des tutos (la preuve j'ai lu et utilisé le BGW comme tu me l'as conseillé).......je faisais juste mon "français" qui aime bien se pleindre.
    Bref, j'utilise le nombre des fichiers (et non plus la taille) pour incrémenter ma progressbar, (à chaque fois qu'un fichier est copier -> progressbar.performstep) qui fonctionne très bien si je n'utilise pas de backgrounworker, mais avec, j'ai le message d'erreur suivant:
    "Opération inter-threads non valide*: le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."
    A mon avis je devrai utiliser le "invoke" mais j'ai beau lire les tutos, j'y comprends rien.
    Y a t il une âme charitable qui pourrai m'expliquer (avec des mots simples) comment l'utiliser avec ma progressbar et mon BGW.
    Merci

  10. #10
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour Bylliboy,

    La notion de Thread ne s'explique pas en 5 minutes donc voici un petit projet exemple qui ne couvre absolument pas toutes les subtilités du composant BGW ainsi que les bases de cours sur le fonctionnement des threads !! :

    ---> La fenêtre principale :

    http://imabox.fr/a3/141406836VPG5Im17.png

    ---> Le code de Form1 (Designer inclu !) :

    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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
     
    Imports System.IO
     
    Public Class Form1
        Inherits System.Windows.Forms.Form
     
    #Region " INITIALIZE "
        Public Sub New()
            InitializeComponent()
        End Sub
     
        'Form remplace la méthode Dispose pour nettoyer la liste des composants.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
     
        'Requise par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE*: la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée à l'aide du Concepteur Windows Form.  
        'Ne la modifiez pas à l'aide de l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.GbxCopySetting = New System.Windows.Forms.GroupBox()
            Me.LblCopySettingTo = New System.Windows.Forms.Label()
            Me.LblCopySettingFrom = New System.Windows.Forms.Label()
            Me.TxbCopySettingTo = New System.Windows.Forms.TextBox()
            Me.BtnCopySettingTo = New System.Windows.Forms.Button()
            Me.TxbCopySettingFrom = New System.Windows.Forms.TextBox()
            Me.BtnCopySettingFrom = New System.Windows.Forms.Button()
            Me.GbxCopyProgress = New System.Windows.Forms.GroupBox()
            Me.LblCopyProgress = New System.Windows.Forms.Label()
            Me.PgbLblCopyProgress = New System.Windows.Forms.ProgressBar()
            Me.BgwCopying = New System.ComponentModel.BackgroundWorker()
            Me.BtnCopy = New System.Windows.Forms.Button()
            Me.GbxCopySetting.SuspendLayout()
            Me.GbxCopyProgress.SuspendLayout()
            Me.SuspendLayout()
            '
            'GbxCopySetting
            '
            Me.GbxCopySetting.Controls.Add(Me.LblCopySettingTo)
            Me.GbxCopySetting.Controls.Add(Me.LblCopySettingFrom)
            Me.GbxCopySetting.Controls.Add(Me.TxbCopySettingTo)
            Me.GbxCopySetting.Controls.Add(Me.BtnCopySettingTo)
            Me.GbxCopySetting.Controls.Add(Me.TxbCopySettingFrom)
            Me.GbxCopySetting.Controls.Add(Me.BtnCopySettingFrom)
            Me.GbxCopySetting.Location = New System.Drawing.Point(12, 12)
            Me.GbxCopySetting.Name = "GbxCopySetting"
            Me.GbxCopySetting.Size = New System.Drawing.Size(541, 92)
            Me.GbxCopySetting.TabIndex = 8
            Me.GbxCopySetting.TabStop = False
            Me.GbxCopySetting.Text = "Paramètres de copie"
            '
            'LblCopySettingTo
            '
            Me.LblCopySettingTo.AutoSize = True
            Me.LblCopySettingTo.Location = New System.Drawing.Point(20, 58)
            Me.LblCopySettingTo.Name = "LblCopySettingTo"
            Me.LblCopySettingTo.Size = New System.Drawing.Size(34, 13)
            Me.LblCopySettingTo.TabIndex = 12
            Me.LblCopySettingTo.Text = "Vers :"
            '
            'LblCopySettingFrom
            '
            Me.LblCopySettingFrom.AutoSize = True
            Me.LblCopySettingFrom.Location = New System.Drawing.Point(27, 29)
            Me.LblCopySettingFrom.Name = "LblCopySettingFrom"
            Me.LblCopySettingFrom.Size = New System.Drawing.Size(27, 13)
            Me.LblCopySettingFrom.TabIndex = 11
            Me.LblCopySettingFrom.Text = "De :"
            '
            'TxbCopySettingTo
            '
            Me.TxbCopySettingTo.BackColor = System.Drawing.Color.White
            Me.TxbCopySettingTo.Location = New System.Drawing.Point(65, 55)
            Me.TxbCopySettingTo.Name = "TxbCopySettingTo"
            Me.TxbCopySettingTo.ReadOnly = True
            Me.TxbCopySettingTo.Size = New System.Drawing.Size(375, 20)
            Me.TxbCopySettingTo.TabIndex = 10
            '
            'BtnCopySettingTo
            '
            Me.BtnCopySettingTo.Location = New System.Drawing.Point(446, 53)
            Me.BtnCopySettingTo.Name = "BtnCopySettingTo"
            Me.BtnCopySettingTo.Size = New System.Drawing.Size(75, 23)
            Me.BtnCopySettingTo.TabIndex = 9
            Me.BtnCopySettingTo.Text = "..."
            Me.BtnCopySettingTo.UseVisualStyleBackColor = True
            '
            'TxbCopySettingFrom
            '
            Me.TxbCopySettingFrom.BackColor = System.Drawing.Color.White
            Me.TxbCopySettingFrom.Location = New System.Drawing.Point(65, 26)
            Me.TxbCopySettingFrom.Name = "TxbCopySettingFrom"
            Me.TxbCopySettingFrom.ReadOnly = True
            Me.TxbCopySettingFrom.Size = New System.Drawing.Size(375, 20)
            Me.TxbCopySettingFrom.TabIndex = 8
            '
            'BtnCopySettingFrom
            '
            Me.BtnCopySettingFrom.Location = New System.Drawing.Point(446, 24)
            Me.BtnCopySettingFrom.Name = "BtnCopySettingFrom"
            Me.BtnCopySettingFrom.Size = New System.Drawing.Size(75, 23)
            Me.BtnCopySettingFrom.TabIndex = 7
            Me.BtnCopySettingFrom.Text = "..."
            Me.BtnCopySettingFrom.UseVisualStyleBackColor = True
            '
            'GbxCopyProgress
            '
            Me.GbxCopyProgress.Controls.Add(Me.LblCopyProgress)
            Me.GbxCopyProgress.Controls.Add(Me.PgbLblCopyProgress)
            Me.GbxCopyProgress.Location = New System.Drawing.Point(12, 147)
            Me.GbxCopyProgress.Name = "GbxCopyProgress"
            Me.GbxCopyProgress.Size = New System.Drawing.Size(541, 76)
            Me.GbxCopyProgress.TabIndex = 9
            Me.GbxCopyProgress.TabStop = False
            Me.GbxCopyProgress.Text = "Progression de la copie"
            '
            'LblCopyProgress
            '
            Me.LblCopyProgress.Location = New System.Drawing.Point(23, 15)
            Me.LblCopyProgress.Name = "LblCopyProgress"
            Me.LblCopyProgress.Size = New System.Drawing.Size(498, 20)
            Me.LblCopyProgress.TabIndex = 9
            Me.LblCopyProgress.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
            '
            'PgbLblCopyProgress
            '
            Me.PgbLblCopyProgress.Location = New System.Drawing.Point(23, 38)
            Me.PgbLblCopyProgress.Name = "PgbLblCopyProgress"
            Me.PgbLblCopyProgress.Size = New System.Drawing.Size(498, 23)
            Me.PgbLblCopyProgress.TabIndex = 8
            '
            'BgwCopying
            '
            Me.BgwCopying.WorkerReportsProgress = True
            Me.BgwCopying.WorkerSupportsCancellation = True
            '
            'BtnCopy
            '
            Me.BtnCopy.Location = New System.Drawing.Point(35, 110)
            Me.BtnCopy.Name = "BtnCopy"
            Me.BtnCopy.Size = New System.Drawing.Size(498, 31)
            Me.BtnCopy.TabIndex = 10
            Me.BtnCopy.Text = "Lancer la copie"
            Me.BtnCopy.UseVisualStyleBackColor = True
            '
            'Frm_Main
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(565, 235)
            Me.Controls.Add(Me.BtnCopy)
            Me.Controls.Add(Me.GbxCopyProgress)
            Me.Controls.Add(Me.GbxCopySetting)
            Me.Name = "Form1"
            Me.Text = "CopyProgress Project"
            Me.GbxCopySetting.ResumeLayout(False)
            Me.GbxCopySetting.PerformLayout()
            Me.GbxCopyProgress.ResumeLayout(False)
            Me.ResumeLayout(False)
     
        End Sub
        Friend WithEvents GbxCopySetting As System.Windows.Forms.GroupBox
        Friend WithEvents LblCopySettingTo As System.Windows.Forms.Label
        Friend WithEvents LblCopySettingFrom As System.Windows.Forms.Label
        Friend WithEvents TxbCopySettingTo As System.Windows.Forms.TextBox
        Friend WithEvents BtnCopySettingTo As System.Windows.Forms.Button
        Friend WithEvents TxbCopySettingFrom As System.Windows.Forms.TextBox
        Friend WithEvents BtnCopySettingFrom As System.Windows.Forms.Button
        Friend WithEvents GbxCopyProgress As System.Windows.Forms.GroupBox
        Friend WithEvents LblCopyProgress As System.Windows.Forms.Label
        Friend WithEvents PgbLblCopyProgress As System.Windows.Forms.ProgressBar
        Friend WithEvents BgwCopying As System.ComponentModel.BackgroundWorker
        Friend WithEvents BtnCopy As System.Windows.Forms.Button
    #End Region
     
    #Region " MAIN PROGRAM "
     
    #Region " COPY SETTINGS "
        Private _fbd As FolderBrowserDialog = Nothing
     
        Private Sub BtnCopySettingTo_Click(sender As Object, e As EventArgs) Handles BtnCopySettingTo.Click
            _fbd = New FolderBrowserDialog
            With _fbd
                .Description = "Sélectionnez le répertoire de destination"
                If .ShowDialog() = DialogResult.OK Then
                    TxbCopySettingTo.Text = .SelectedPath
                End If
            End With
        End Sub
        Private Sub BtnCopySettingFrom_Click(sender As Object, e As EventArgs) Handles BtnCopySettingFrom.Click
            _fbd = New FolderBrowserDialog
            With _fbd
                .Description = "Sélectionnez le répertoire des fichiers à copier"
                If .ShowDialog() = DialogResult.OK Then
                    TxbCopySettingFrom.Text = .SelectedPath
                End If
            End With
        End Sub
    #End Region
     
    #Region " COPY START "
        Private Sub BtnCopy_Click(sender As Object, e As EventArgs) Handles BtnCopy.Click
            If Directory.Exists(TxbCopySettingFrom.Text) AndAlso Directory.Exists(TxbCopySettingTo.Text) Then
                'On vérifie si le même thread Async n'est pas déjà en cours d'exécution avant de le lancer
                If Not BgwCopying.IsBusy Then
                    BgwCopying.RunWorkerAsync()
                End If
            End If
        End Sub
    #End Region
     
    #Region " COPY THREAD "
        Private Sub BgwCopying_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BgwCopying.DoWork
            'MAJ de la partie UI = On appelle l'event ProgressChanged pour sortir du MainThread afin d'éviter de retourner des erreurs du type :
            '"Opération inter-threads non valide*: le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé." !
            'La notion de collecte est importante car s'il y a un gros volume de fichiers alors on préfèrera montrer à l'utilisateur qu'une tache de collecte est en cours !
            BgwCopying.ReportProgress(150, "Collecte des fichiers ...")
            'Collecte des fichiers depuis le répertoire sélectionné avec un filtre autorisant toutes extension.
            ' ATTENTION : si tu veux copier des arborescences complètes c'est à toi de le prévoir en implémentant une sorte de fonction XCOPY !
            Dim files As String() = Directory.GetFiles(TxbCopySettingFrom.Text, "*.*", SearchOption.AllDirectories)
            Dim fCount% = files.Count
     
            If fCount <> 0 Then
                For i% = 0 To fCount - 1
                    If Not File.Exists(TxbCopySettingTo.Text & "\" & New FileInfo(files(i)).Name) Then
                        'MAJ de la partie UI afin de sortir du mainThread pour modifier la valeur de la PgBar et du label qui contiendra le fichier en cours de copie (très utile pour les fichiers volumineux). 
                        BgwCopying.ReportProgress(i * 100 / fCount, "Copie de : " & New FileInfo(files(i)).Name)
     
                        'ATTENTION : prévoir ici l'opération d'annulation
     
                        File.Copy(files(i), TxbCopySettingTo.Text & "\" & New FileInfo(files(i)).Name)
                    End If
                Next
            End If
     
            'ATTENTION : Prendre en compte également que si tu souhaites englober ton coprs d'instruction dans un Try...Catch qu'il existe des subtilités pour les retours d'erreurs !!!!!
        End Sub
     
        Private Sub BgwCopying_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BgwCopying.ProgressChanged
            'La valeur 150 corresponds à la MAJ du label afin d'afficher qu'une collecte est en cours
            If e.ProgressPercentage = 150 Then
                LblCopyProgress.Text = e.UserState.ToString
            Else
                'MAJ du label d'infos de copie et de la pgbar.
                'Ici la valeur e.progressPercentage prends la valeur de 0 à 100 = le pourcentage de progression
                LblCopyProgress.Text = e.UserState.ToString
                PgbLblCopyProgress.Value = e.ProgressPercentage
            End If
        End Sub
     
        Private Sub BgwCopying_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BgwCopying.RunWorkerCompleted
            'Fin de la copie 
            'ATTENTION : prévoir ici la sortie du mainthread qui a retourné des erreur de copie ou bien une annulation
            MessageBox.Show("Copie terminée", "Complet", MessageBoxButtons.OK, MessageBoxIcon.Information)
            LblCopyProgress.Text = String.Empty
            PgbLblCopyProgress.Value = 0
        End Sub
    #End Region
     
    #End Region
     
    End Class

    Bonne lecture

  11. #11
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Bon, j'ai réussi à faire fonctionner ma progressbar avec mon bgw.
    Il faut:
    - créer un "delegate" commun à tous, chez moi ce sera "Delegate Sub dIncrement()"
    - créer le sub où l'on incorpore le code que l'on veut exécuter, chez moi ce sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Increment()
                  PGB_STATUT.PerformStep()
        End Sub
    - et enfin rappeler dans la fonction où je voulais, à la base, mettre mon " PGB_STATUT.PerformStep()", le sub comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.Invoke(New dIncrement(AddressOf Increment))
    Merci au tutos de SDZ (OCR).

  12. #12
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Bylliboy Voir le message
    Bon, j'ai réussi à faire fonctionner ma progressbar avec mon bgw.
    Il faut:
    - créer un "delegate" commun à tous, chez moi ce sera "Delegate Sub dIncrement()"
    - créer le sub où l'on incorpore le code que l'on veut exécuter, chez moi ce sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Increment()
                  PGB_STATUT.PerformStep()
        End Sub
    - et enfin rappeler dans la fonction où je voulais, à la base, mettre mon " PGB_STATUT.PerformStep()", le sub comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.Invoke(New dIncrement(AddressOf Increment))
    Merci au tutos de SDZ (OCR).
    LOL

    J'adore : j'ai réussi à faire fonctionner........ !
    Vaudrait mieux lire : j'ai compris le fonctionnement.....

    Et sinon avant d'invoker ton delegate faudrait songés a tester si la partie UI (le main Form) permet cet appel !
    N'oublies pas le gestionnaire d'erreur en sortie de ton thread !

    Content que tu ai pu résoudre ton problème mais il ne faut pas se cantonner à une seule solution, ce n'est pas ainsi que tu t'épanouira !

    @+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2012, 13h29
  2. Réponses: 2
    Dernier message: 24/03/2006, 09h55
  3. PHP5: charger des fichiers textes dans une base MYSQL
    Par koueletbak dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/03/2006, 11h14
  4. [Conception] Stocker des fichiers multimédia dans une base de données
    Par haifa84 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/03/2006, 17h47
  5. Intégration des fichier XML dans une base de données MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    Réponses: 8
    Dernier message: 25/11/2005, 22h41

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