Copie de fichier + Progressbar qui progresse en même temps [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 30 oct. 2016 à 20:47 - Dernière réponse : Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 30 oct. 2016 à 21:30
0
Merci
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.
Commenter la réponse de ucfoutu
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 30 oct. 2016 à 21:46
0
Merci
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)
Commenter la réponse de Karin.code
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 30 oct. 2016 à 21:58
0
Merci
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).
Commenter la réponse de ucfoutu
Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention - 30 oct. 2016 à 22:08
0
Merci
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


vb95 1684 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 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
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 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.
Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 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
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 14 nov. 2016 à 17:55
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"
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 14 nov. 2016 à 18:15
Bonsoir Whismeril
Oui, c'est ce que j'ai dit
tu me la bien expliquer plus haut dans le message numéro 4

Bonsoir Kikou93
C'est une bonne idée Merci
Commenter la réponse de Whismeril
bilbo50 22 Messages postés lundi 24 septembre 2007Date d'inscription 2 janvier 2018 Dernière intervention - 2 janv. 2018 à 10:07
0
Merci
La copie avec une vraie barre de progression sans blocage passe par un thread
Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention - 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....
Commenter la réponse de bilbo50

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.