Copie de fichier + Progressbar qui progresse en même temps

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 30 oct. 2016 à 20:47
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 2 janv. 2018 à 15:03
Bonjour,
vb95 m'a beaucoup aidé pour le code qui permet de copier à partir d'un disque (Merci vb95), qui se trouve ici :
http://codes-sources.commentcamarche.net/forum/affich-10070215-copier-le-contenu-d-un-repertoire-racine#p10070229
je voulais rendre mon logiciel plus style logiciel copier
je sais que je demande beaucoup mais j'ai envie d'ajouter une Progressbar qui montre l'avancement de copie des fichiers, ce que je veux dire que la Progressbar progresse en même moment que les fichiers sont copiés
j'ai bien eu des idées, j'ai même trouvé un projet dans ici mais il est en VB6 je ne peux pas le lire
Merci pour vous réponse

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2016 à 21:30
Bonjour,
Donne alors comme valeur Max à ta progressbar le nombre de fichiers à copier puis incrémente la valeur de ta progressbar de 1 unité après chaque fichier copié.
Ceci étant à la portée (me semble-t-il) de tout développeur -même débutant- je souhaite que tu nous montres ce que tu en fais.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
30 oct. 2016 à 21:46
Bonjour ucfoutu,
merci pour ta réponse
j'ai déjà pensé à cette méthode et j'ai conclu que ce n'ai pas une bonne méthode
par exemple je le dossier source contient qu'un seul fichier de taille 2 GO, si j'utilise la méthode que tu à mentionner la valeur de la ProgressBar sera 0 pour un certain moment jusqu'à que le fichier soit copié, elle deviendra égale à 100
moi ce que je veux est que la ProgressBar progresse progressivement en même moment que le fichier est en train d’être copié (0 ,1 ,2 ,3 ,10,33,60,70,89,94,100)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2016 à 21:58
Il te faut alors :
1) calculer le nombre total d'octets des fichiers à copier
2) attribuer ce nombre à la valeur max de la progressbar
3) incrémenter, après chaque fichier copié, la progressbar de n (ou n est la taille en octets du fichier copié) unités.

Ne me dis pas, maintenant, que ce que tu veux en faire en fait est de faire progresser la progressbar "en chemin", au fur et à mesure de l'avancement de la copie d'un fichier. Même Microsoft ne met pas en oeuvre un tel mécanisme, pour ses copies. Dans le meilleur des cas, Microsoft "évalue" et "estime", sans aucune rigueur (qui serait au demeurant très contre-productive car très ralentissante).
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
30 oct. 2016 à 22:08
Bonsoir,

sans avoir d'idée précise sur comment savoir ou en est la copie d'un fichier de 2 Go, il va se poser un autre problème.

Le code de copie dont tu as mis le lien est exécuté dans des threads différents, il va te falloir prévoir dans chacun une remontée de la progression vers le thread principal, et ce sans provoquer d'action inter-thread interdite, comme par exemple modifier une propriété d'un contrôle, exemple la valeur d'une progressBar.

Un exemple vite fait, qui part du principe que comme dans l'autre discussion ta copie se fait dans le Form et pas dans une autre classe:

		Private Sub EnvoieProgression(ByVal Pourcent As Integer)
			progressBar1.Value = Pourcent
		End Sub


		Private Sub CalculLong()
			For i As Integer = 0 To 99
				'on compte jusqu'à cent avec des pauses de 100ms
				Thread.Sleep(100)

				'on envoie la progression
				EnvoieProgression(i)
			Next i
		End Sub


Si CalculLong est exécuté par le même Thread que la Form, ce code est "légal". Y'a toutes les chances qu'en fait ça fige et que tu ne voies pas la progressBar avancer mais au moins il ne bogera pas.

Par contre, si comme dans ton cas, CalculLong est exécuté dans un thread différent que celui de la Form, alors EnvoieProgression aussi.
Et selon les options de ton projet, il est possible qu'affecter progressBar1.Value depuis un autre thread ne soit pas autorisé.

Il te faudra utiliser un dispatcher pour passer outre ce problème
		Private Sub EnvoieProgression(ByVal Pourcent As Integer)
			Dispatcher.CurrentDispatcher.BeginInvoke(New Action(Sub() progressBar1.Value = Pourcent))
		End Sub


		Private Sub CalculLong()
			For i As Integer = 0 To 99
				'on compte jusqu'à cent avec des pauses de 100ms
				Thread.Sleep(100)

				'on envoie la progression
				EnvoieProgression(i)
			Next i
		End Sub


0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
30 oct. 2016 à 22:17
Salut ucfoutu et Whismeril ,
merci pour vos suggestion,je vais les étudier en détail
Bonne nuit
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
31 oct. 2016 à 13:19
Bonjour à tous
Et en combinant avec 2 ProgressBar : une pour les fichiers et une pour la totalité du disque
il faudrait fusionner les 2 codes que je t'ai fourni ( celui qui compte le nombre de fichiers et celui qui copie les fichiers )
Et faire intervenir les Threads pour éviter de figer la Form principale
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
14 nov. 2016 à 16:50
Bonjour tout le monde
Tout d'abord je suis vraiment désolé de ne pas vous avoir répondu pendant tout ce temps, j'avais une montagne de travail (j'ai pris un congé maladie et quand je suis revenue c'était l'enfer)
j'ai pris vos suggestions en compte est j'ai créé le code qui me permet :
1. de calculer la taille du dossier de destination et la mettre dans la variable "TailleDestination1" (parce que le dossier de destination peut aussi ne pas être vide), ce code m'a été donné par vb95
2. dans un timer déclencher avec le bouton copier :
- calcul la taille du disque source et la mettre comme taille maximale de la progressbar "TailleSource"
- calcul de la taille du dossier de destination et la mettre dans la variable "TailleDestination2" (à chaque Fois grâce au timer)
progressbar 1.value = TailleDestination2 -TailleDestination1 (comme je l'ai dit plus haut le répertoire de destination peut aussi ne pas être vide)
et comme l'a suggéré Whismeril j'ajoute des Thread.Sleep(100) pour que le changement soit visible dans la progressBar
cela fonctionne pour des petite dossier sont problème
mais quand il s'agit des dossiers lourds (par exemple 200 Go) le ralentissement de la copie des Fichiers se fait remarquer, le temps pour copier sera doublé, parfois le logiciel sera bloqué
alors j'ai décidé d'abandonner cette idée, je vais me contenter d'un message du genre "Veuillez patienter s'il vous plaît ... " qui s'affiche au debut de la copie et disparaîtra a la fin.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
14 nov. 2016 à 17:32
Bonsoir

et comme l'a suggéré Whismeril j'ajoute des Thread.Sleep(100) pour que le changement soit visible dans la progressBar
, heu non je l'ai mis dans mon exemple pour ralentir la boucle sinon compter jusqu'à 100 est si rapide que tu n'aurais pas vu la barre avancer.
Faut surtout pas le mettre pour toi
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
Modifié par kikou93 le 14/11/2016 à 18:08
pourquoi tu a besoin d'un progressbar
Pendant que tu copie le contenue du disque le logiciel sera bloquer, pour qu'il ne te dérange pas ( tu ne peux pas le déplacer ou le minimiser) tu peux faire comme suite :
quand tu clique sur le bouton copier le logiciel sera minimiser et une icône s'affiche dans la zone des notifications grâce à NotifyIcon1
Après que tous les fichiers soit copier le logiciel s'affiche à nouveau avec une boite de dialogue qui dit "Le disque a été copiés avec succès"
0

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

Posez votre question
bilbo50 Messages postés 23 Date d'inscription lundi 24 septembre 2007 Statut Membre Dernière intervention 27 janvier 2020
2 janv. 2018 à 10:07
La copie avec une vraie barre de progression sans blocage passe par un thread
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
2 janv. 2018 à 15:03
Pas le bonjour à toi non plus, c’est ce que l’on a dit y a un an et demi....
0
Rejoignez-nous