Message animé pendant qu'on compte le nombre de fichier

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 16 nov. 2016 à 15:50
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 18 nov. 2016 à 16:39
Bonjour,
Il y a pas longtemps vb95 m'a donné la méthode de calculer le nombre de dossier et fichier qui se trouve dans un répertoire, il fonctionne trés bien (Merci vb95)
selon le nombre de fichiers ou dossiers qui se trouve dans le répertoire le logiciel sera bloqué pour un certain temps
j'ai ajouté un message au début "Patientez ..." avant l'application commence à compter, ce message disparaît a la fin bien sûr
je voulais que le message soit animé pendant qu'il compte les fichiers/Dossiers c-à-d :
1er mot : Label3.Text = "Patientez "
2eme mot : Label3.Text = "Patientez ."
3eme mot : Label3.Text = "Patientez .."
4eme mot : Label3.Text = "Patientez ..."
5eme mot : Label3.Text = "Patientez "
et ainsi de suite (en boucle)
je sais que il sera un petit peu plus longs, mais c'est pas grave
j'ai fait ça :
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private compteurfichiers As Integer
Private compteurrepertoires As Integer
Private Sub CompterDir(ByVal oSource As DirectoryInfo)
Try
'Compte tous les fichiers d'un répertoire (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
' on compte que les fichiers ( pas les répertoires)
If oFichier.Attributes <> FileAttributes.Directory Then compteurfichiers = compteurfichiers + 1
End Sub)
'Comptage (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()
' on compte le répertoire
compteurrepertoires = compteurrepertoires + 1
' on va compter les fichiers du répertoire
CompterDir(oSousRepertoire)
Next
Catch ex As Exception
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label3.Text = "Patientez "
compteurfichiers = 0
compteurrepertoires = 1 ' on compte le répertoire source
CompterDir(New DirectoryInfo(TextBox1.Text))
Timer1.Start()
Label1.Text = compteurrepertoires.ToString & " Répertoires"
Label2.Text = compteurfichiers.ToString & " Fichiers"
End Sub

et ajouter ce code dans un Timer :
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Label3.Text = "Patientez " Then
Label3.Text = "Patientez ."
ElseIf Label3.Text = "Patientez ." Then
Label3.Text = "Patientez .."
ElseIf Label3.Text = "Patientez .." Then
Label3.Text = "Patientez ..."
ElseIf Label3.Text = "Patientez ..." Then
Label3.Text = "Patientez "
End If
System.Threading.Thread.Sleep(500)
End Sub

qu'un peux me dire où est mon erreur, merci d'avance pour votre aide

7 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 16/11/2016 à 16:20
Bonjour Karin.code
1) Tu déclenches ton Timer une fois le comptage fini : c'est avant le début du comptage qu'il faut le déclencher
2) Inutile de mettre le
System.Threading.Thread.Sleep(500)
. Utilise la propriété Interval du timer
3) une fois le comptage fini mets un
Timer1.Stop

4) Un vrai code de défilement serait bien mieux

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
1
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
16 nov. 2016 à 16:23
Bonjour Vb, non seulement stopper le thread d'un timer est inutile, mais ça peut être contre productif, si la durée de la pause vient contrecarrer le prochain déclenchement quand l'intervalle est cours.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
16 nov. 2016 à 16:36
Tout à fait exact Whismeril
bonjour à toi
Au fait j'ai modifié mes Scrabbles
Pour le dictionnaire je n'utilise plus un tableau de 26 arcs par nœud avec Redim mais une list(of Arcs) . Pourquoi mettre 26 arcs si le nœud n'en comporte qu'un seul d'utile par exemple .Et la méthode Find me permet de trouver l'indice de l'arc associé à une lettre donnée .
Les méthodes Find, Where, etc.... sont bien concises en code mais pas facile de trouver de la doc dessus mis à part les réponses anglophones .
Mais avec de la logique et du tâtonnement on avance
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
16 nov. 2016 à 16:37
Bonsoir Vb95 et Whismeril
merci de m'avoir répondu
Vb95tu veux dire comme ça :

Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private compteurfichiers As Integer
Private compteurrepertoires As Integer
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Label3.Text = "Patientez " Then
Label3.Text = "Patientez ."
ElseIf Label3.Text = "Patientez ." Then
Label3.Text = "Patientez .."
ElseIf Label3.Text = "Patientez .." Then
Label3.Text = "Patientez ..."
ElseIf Label3.Text = "Patientez ..." Then
Label3.Text = "Patientez "
End If
End Sub
Private Sub CompterDir(ByVal oSource As DirectoryInfo)
Try
'Compte tous les fichiers d'un répertoire (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
' on compte que les fichiers ( pas les répertoires)
If oFichier.Attributes <> FileAttributes.Directory Then compteurfichiers = compteurfichiers + 1
End Sub)
'Comptage (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()

' on compte le répertoire
compteurrepertoires = compteurrepertoires + 1
' on va compter les fichiers du répertoire
CompterDir(oSousRepertoire)
Next
Catch ex As Exception
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label3.Text = "Patientez "
Timer1.Start()
compteurfichiers = 0
compteurrepertoires = 1 ' on compte le répertoire source
CompterDir(New DirectoryInfo(TextBox1.Text))
Label1.Text = compteurrepertoires.ToString & " Répertoires"
Label2.Text = compteurfichiers.ToString & " Fichiers"
Timer1.Stop()
End Sub

là le message ne s'affiche même pas ni avant ni après avoir compte le nombre de fichiers/Dossiers, si l’enlève Timer1.Stop le message s'affiche qu'après avoir compter le nombre de fichiers / Dossiers
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
16 nov. 2016 à 16:50
bonjour Karin.code
il faut comprendre que maintenant avec la puissance de nos PC les opérations en boucle se font assez rapidement ( surtout en plus que la sub CompterDir utilise le Parrallel.ForEach : cela revient à faire plusieurs boucles simultanées)
Quelle est la valeur de la propriété Interval de ton Timer ? Par défaut c'est 100 je crois soit 100 millisecondes
Utilises un
Label3.Refresh()
à la fin de la sub duTimer pour rafraichir l'affichage du label
Je teste de mon côté
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
16 nov. 2016 à 17:09
bonjour Karin.code
Après test cela ne fonctionne pas
Il faudrait mettre la sub Compterdir dans un BackGroundWorker pour éviter qu"elle bloque la Form et que le Timer puisse interférer sur la Form
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 nov. 2016 à 17:12
Bonjour,

Pourquoi ne pas mettre un label avec défilement de texte comme ceci:

http://codes-sources.commentcamarche.net/source/53734-amusons-nous-avec-un-label
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 16/11/2016 à 17:27
Ensuite on peut mettre ceci dans un BackgroundWorker
le Timer : tmrlabel avec interval 100
le label: lblmessage

 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim MyThread As BackgroundWorker = CType(sender, BackgroundWorker) 'récupération du thread d'arrière plan
        Dim pourcent As Integer
        MyThread.ReportProgress(pourcent) 'pourcent est un Integer indiquant l'état d'avancement.
       'ici le code de l'action a démarrer
    End Sub
    Private Sub BackgroundWorker1_ProgressChanged( _
ByVal sender As Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        ProgressBar1.Style = ProgressBarStyle.Marquee
        tmrlabel.Start() ' déplacement du texte dans le label 
        lblmessage.Text = " Veuillez patienter......La durée de l'opération est proportionnelle au nombre de frames.  " 'label défilant
    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
        ProgressBar1.Style = ProgressBarStyle.Blocks
        ProgressBar1.Value = 100
        ' ici, elle affiche un message indiquant que le thread d'arrière plan est terminé.  
        ' MessageBox.Show("Opération réussie, vous pouvez enregistrer le gif animé si vous le désirez. ", "Affichage du gif animé", MessageBoxButtons.OK, MessageBoxIcon.Information)
        lblmessage.Text = " Opération réussie..... Vous pouvez enregistrer le gif animé si vous le désirez.  " 'label défilant
      End Sub
    Private Sub tmrlabel_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrlabel.Tick
        ' déplacement du texte dans le label 
        lblmessage.Text = Mid(lblmessage.Text, 2, lblmessage.Text.Length - 1) & Mid(lblmessage.Text, 1, 1)
    End Sub


et pour lancer tout cela:

   BackgroundWorker1.RunWorkerAsync()
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
16 nov. 2016 à 17:25
Salut cs_Le Privert
merci pour ta réponse
le problème si la form est bloqué alors lui aussi bloqué
Salut Vb95
Il faudrait mettre la sub Compterdir dans un BackGroundWorker pour éviter qu"elle bloque la Form et que le Timer puisse interférer sur la Form
maintenant je suis vraiment intéressé si il y a une méthode pour que la form ne soit pas bloqué je veux bien savoir comme ça résoudra beaucoup de mes problèmes, s'il te plait explique moi
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
16 nov. 2016 à 17:33
 Private Sub action()
     compteurfichiers = 0
        compteurrepertoires = 1 ' on compte le répertoire source
        CompterDir(New DirectoryInfo(TextBox1.Text))
    End Sub


tu mets action où j'ai mis:

'ici le code de l'action a démarrer

et dans le button 1

BackgroundWorker1.RunWorkerAsync()
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
16 nov. 2016 à 18:06
Salut cs_Le Privert et Vb95
Avec les dernières modifications cela fonctionne très bien Merci, je peux même utiliser cette méthode pour le poste précédent (celui de copier le contenue d'un disque vers un dossier) il bloque aussi l'application
juste une dernière question pour cs_Le Privert
à quoi sert :
MyThread.ReportProgress(pourcent)

car il y a une erreur qui s'affiche (Ce BackgroundWorker précise qu'il ne signale aucune progression. Modifiez WorkerReportsProgress afin qu'il signale bel et bien une progression.)
je l'ai enlevé et cela fonctionne sans problème
ps : désolé vous répondu tellement vite que je n'ai pas eu le temps de testé et répondre lol :)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
16 nov. 2016 à 18:12
C'est bien cela cs_Le Pivert mais on ne peut pas reporter la progression du comptage des fichiers et répertoires vu que l'on ne sait pas leur nombre
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 nov. 2016 à 17:25
Rebonjour à tous
Pour cs_Le Pivert : c'est bien ce que l'on veut faire mais le problème c'est que le Timer est bloqué par les Threads de la Sub CompterDirà mon avis .
Pour Karin.code : même avec un BackGrondWorker cela ne fonctionne pas . Pourquoi ? c'est la question
Le
System.Threading.Thread.Sleep(500)
là où il est placé ne met pas l'application en pause : il rallonge la duéee du processus du Timer et il y a un risque qu'un nouveau déclenchement du Timer intervienne avant que le processus du déclenchemnt précédent ne soit terminé

0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 nov. 2016 à 18:14
Salut Karin.code

Sur la form tu mets les contrôles suivant
-1 bouton Button1 pour lancer la recherche
-3 Labels 1, 2 et 3 pour afficher les résultats (Label3 affiche le message ( adapte ta taille à la longueur du message)
- 1 Timer1
- 1 BackGroundWorker

Qu'est ce que le BackGround ?
imagine tu construis une voiture : tu fais sous-traiter la construction du moteur . Rien ne t’empêche de monter la carrosserie de la voiture, de monter l'intérieur pendant que ton sous-traitant fabrique le moteur
Le moteur ici c'est le comptage des fichiers et répertoires en BackGround et le reste de la voiture c'est ta Form qui n'est pas bloquée : je pense que tu vois l'analogie .
Ce sont 2 processus différents qui n'interfèrent pas

Teste ceci

Imports System.ComponentModel
Imports System.IO
Imports System.Threading.Tasks

Public Class Form1

Private Message As String = "Patientez "
Private compteurfichiers As Integer
Private compteurrepertoires As Integer

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Timer1.Enabled = False
Label3.Visible = False
Label3.BackColor = Color.White

End Sub
Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick

Message = Message.Substring(1, Message.Length - 1) & Message.Substring(0, 1)
Label3.Text = Message

End Sub

Private Sub CompterDir(ByVal oSource As DirectoryInfo)

Try
'Compte tous les fichiers d'un répertoire (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
' on compte que les fichiers ( pas les répertoires)
If oFichier.Attributes <> FileAttributes.Directory Then compteurfichiers = compteurfichiers + 1
End Sub)
'Comptage (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()

' on compte le répertoire
compteurrepertoires = compteurrepertoires + 1
' on va compter les fichiers du répertoire
CompterDir(oSousRepertoire)
Next
Catch ex As Exception
End Try

End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

Label3.Text = Message
Label3.Visible = True
Timer1.Enabled = True
Timer1.Start()
compteurfichiers = 0
compteurrepertoires = 1 ' on compte le répertoire source
BackgroundWorker1.RunWorkerAsync() ' on lance le processus de comptage en BackGround (tâche de fond)

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

' processus de comptage en BackGround
CompterDir(New DirectoryInfo("C:\")) ' répertoire racine C:\ pour l'exemple ( à modifier )

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

' fin processus Background et retour dans le processu de la form du projet
Label1.Text = compteurrepertoires.ToString & " Répertoires"
Label2.Text = compteurfichiers.ToString & " Fichiers"
Label3.Text = String.Empty
Label3.Visible = False
Timer1.Stop()
Timer1.Enabled = False

End Sub

End Class

0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
16 nov. 2016 à 18:27
Salut Vb95
Je comprend ton bien exemple, et le comme marche super bien
Merci à vous
J'attend la réponse de cs_Le Pivert sur ma question
et je met le sujet comme résolu, ok
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
16 nov. 2016 à 18:52
Salut cs_Le Pivert

Le lien que tu m'a donné ne fonctionne pas, peut-être que c'est provisoire je vais essayer plus tard



Merci
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 16/11/2016 à 19:10
bizarre : il fonctionne nickel chez moi
tu peux avoir la même chose ici : http://plasserre.developpez.com/cours/vb-net/?page=windows-forms5#LX-R

Suppose que tu traite 500 fichiers dans un BackGround pour un traitement assez lourd
Dans ton code de traitement BackGround tu auras une boucle for

For i = 0 to 499
' le traitement pour chaque fichier
MyThread.ReportProgress(pourcent)
Next

Vu que le BackGround ne peut pas accéder à un contrôle de la Form tu ne peux pas avoir une barre de progression pour voir l'avancement

Le
MyThread.ReportProgress(pourcent)
permet de signaler à la Form le pourcentage effectué dans le BackGround ; il faut
autoriser le Background à reporter l'avancement du processus en BackGround

Et c'est la procédure
BackgroundWorker1_ProgressChanged
dans la form qui se charge d'afficher le pourcentage sur la barre de progression

Mais dans ton cas vu que l'on ne sait pas le nombre de fichiers ou de répertoires inutile de mettre une barre de progression
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
16 nov. 2016 à 21:12
oui je comprend merci
c'est utile, je ne peux pas l'utiliser pour ce projet mais je peux l'utiliser pour le projet " Copier le contenu du disque ", je calcul tout d'abord le nombre de fichier dans le disque aprés j'utilise ce code pour savoir le nombre de fichiers copier, dit moi si je me trompe
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
16 nov. 2016 à 21:46
Dans ce projet " Copier le contenu du disque " tu pourrais .
Mais il faut placer le
MyThread.ReportProgress(pourcent)
uniquement pour la copie de fichiers et surtout pas à la création de répertoire .
De plus avec une progression depuis un BackGround la Progressbar de progression doit aller de 0 à 100 ( la progression est en pourcentage : si tu as 200 fichiers et que tu en as traiter 50 , le pourcentage est de 25 %)
Mais si mes souvenirs sont bons pour copier le contenu du disque je ne l'ai pas adapter du comptage des fichiers et répertoires ? Car dans ce cas là je ne sais si cela va fonctionner directement !
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
Modifié par Karin.code le 16/11/2016 à 22:04
Salut vb95
Je vais essayer et te tenir au courant
Bon nuit
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
18 nov. 2016 à 10:53
Salut vb95
On regardant le code de 'Compter le nombre de fichiers/Dossiers" j'ai remarqué cette partie compteurrepertoires = compteurrepertoires + 1
alors j'ai eu l'idée de l'ajouter dans le code "Copier le contenu d'un disque"
voici le code Complet :
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private CopieCpier As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer2.Enabled = True
Timer2.Start()
CopieCpier = 0
BackgroundWorker2.RunWorkerAsync()
End Sub
#Region " Copier Fichiers / Dossiers"
Private Destination As String
Private Source As String
Private Sub CopyDir(ByVal oSource As DirectoryInfo, ByVal oDestination As DirectoryInfo)
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))
CopieCpier = CopieCpier + 1
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
End Try
End Sub
Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
ActionCopier()
End Sub
Sub ActionCopier()
Destination = TextBox1.Text
Source = TextBox2.Text
If Directory.Exists(Destination) = True Then
If MessageBox.Show("Le répertoire destination existe déjà : voulez-vous l'effacer ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
Exit Sub
Else
Directory.Delete(Destination, True)
End If
End If
CopieCpier = 0
CopyDir(New DirectoryInfo(Source), New DirectoryInfo(Destination))
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = CopieCpier.ToString
End Sub
Private Sub BackgroundWorker2_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
MessageBox.Show("copie terminée")
Label1.Text = CopieCpier.ToString
Timer2.Stop()
End Sub
#End Region
End Class

cela fonctionne très bien dans le Label1 le nombre de fichier copier s'afficher (Chaque fois qu'un fichier est copier la valeur du Label1 augment de 1
j'aurais bien aimer qu'au lieu d'afficher le nombre du fichier copier, on affiche la taille copier, j'ai beau essayé mais j'arrive pas, tu n'a pas une idée?
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
18 nov. 2016 à 13:31
Une petite recherche sur Google t'aurait permis de le trouver:

https://msdn.microsoft.com/fr-fr/library/99h600fc(v=vs.100).aspx
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
18 nov. 2016 à 14:24
Salut cs_Le Pivert
Merci pour ta réponse
Pour moi il y a pas de déférence, j'explique :
quand j'utilise
CopieCpier = CopieCpier + 1

il compte le nombre de fichier Déjà copier
quand j'utilise
 CopieCpier = oFichier.Length

il donne la taille des fichiers après qu'il soit copier ( la taille finale)
ce que je voulais c'est d'avoir la taille qui progresse en même temps que le fichier copier
par exemple si on copie un fichier de taille 780 Mo, le fichier ne sera pas copier dans une seconde il va prendre du temps c-à-d commence avec 0 octets -> 50 Ko -> 32 Mo -> 521 Mo -> ... -> enfin 780 Mo
ce que je veux que cette progression s'affiche dans un label si c'est possible bien sûr
j'espère que j'ai bien expliqué
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
Modifié par cs_Le Pivert le 18/11/2016 à 15:37
Quand un fichier est lourd, un message s'ouvre et t'indique la progression de la copie. C'est dans Windows. Donc je ne vois pas l'utilité d'en mettre un en plus!
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
18 nov. 2016 à 16:05
non aucun message indiquant la progression de la copie s'ouvre je viens de vérifier j'ai essayé de copier un fichier Rar lourd d'une taille 15.3 Go et aucun message ne s'affiche
c'est ça l'utilité de ce code, c'est une méthode furtive
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
Modifié par cs_Le Pivert le 18/11/2016 à 16:28
A ce moment là il faut changer de méthode de copie pour avoir cette option. Comme tu l'indiques, c'est une méthode furtive. Donc quand c'est furtif, c'est caché, donc pas de message.
C'est au choix avoir un message ou pas de message.

Voici une méthode où tu auras un message sans traitement lourd qui va ralentir la progression de la copie.

https://msdn.microsoft.com/fr-fr/library/ms127963(v=vs.110).aspx
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
18 nov. 2016 à 16:24
Bonjour Karin.code et cs_Le Pivert
La demande de Karin.code est possible mais lourde à mettre en œuvre
1)On ne profiterait plus de la copie en "Parallel" qui permet au processeur de copier plusieurs fichiers en même temps dans des threads différents .
2) De plus pour la copie d'un gros fichier ( dixit Karin.code) il faudrait gérer un flux de lecture et un flux d'écriture :je prends un bout du fichier source , je le mets dans le flux de lecture, je copie ce flux de lecture dans le flux d'écriture et ce flux d'écriture est ajouté au contenu du fichier . Une fois là j'affiche la taille copiée ( par un Delegate si le copie se passe en BackGround) et je boucle jusqu'à la fin du fichier . et tout cela à répéter pour chaque fichier ( si le fichier est petit je lis tout le fichier en une seuls fois)
Je l'ai fait dans un projet mais pour une toute autre approche : le flux de lecture était remplacé par la lecture du contenu des secteurs du disque dur ( voir http://codes-sources.commentcamarche.net/source/100338-acces-direct-disques-et-partitions-vb-net) et j'en faisais un fichier exploitable
3) L'implantation de cette possibilité ralentirait ton programme à coup sûr
4)Pourquoi réinventer ce que Windows sait faire et de faire du similaire encore plus compliqué ?
La question à de poser est : "Est-ce que cela vaut le coup ?
Ce n'est que mon humble avis
Au plaisir de vous lire
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
18 nov. 2016 à 16:29
Tout à fait d'accord avec toi VB95
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
18 nov. 2016 à 16:34
Salut vb95
Merci pour ta réponse
Est-ce que cela vaut le coup ?
je vais répondre à ta question
cela ne vaut pas le coup
si il ralentit la copie des fichier c'est inutile, je voulais juste améliorer l'apparence du logiciel
dans cette application je préfère choisir la rapidité et la qualité au lieu de l'apparence
vb95 et cs_Le Pivert merci pour votre aide
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
18 nov. 2016 à 16:39
Choix qui me paraît plus que raisonnable !
Au plaisir
0
Rejoignez-nous