Progress barre lors de la copie de fichiers [Résolu]

Papasayans 4 Messages postés mardi 20 mai 2008Date d'inscription 13 novembre 2008 Dernière intervention - 11 nov. 2008 à 12:11 - Dernière réponse : Papasayans 4 Messages postés mardi 20 mai 2008Date d'inscription 13 novembre 2008 Dernière intervention
- 13 nov. 2008 à 13:57
Bonjour,

je me tourne vers vous car je début en VB et que je tombe sur un probleme que je ne peut surmonter seul.

(je ne vais surement pas employer les bon termes mais bon je me lance)

j'ai créer un petit programme pour transférer des fichiers d'un CD-rom vers un répertoire du disque dur. Tout fonctionne comme je le veut mais je voudrais intégrer une progress barre lors du transfert des fichiers.

j'ai donc créer une picturebox avec avec un timer pour gérer la barre de progression et maintenant voila la question :

comment intégrer la commande de copie afin que ma progress barre fonction lors du transfert des fichiers.

je vous remerci de vos réponses.

je vous met les lignes de codes que j'ai déja faite.

Merci a tous

Dim niveau As Long, max As Long

Private Sub affiche_Timer()
   niveau = niveau + 1   If niveau max Then affiche.Enabled False
   Pb.Line (0, 0)-(niveau * Pb.ScaleWidth / max, Pb.ScaleHeight), vbGreen, BF
   If niveau = max Then
      Transfert.Hide
      fin.Show
   End If
   'Shell "cmd /c md c:\temp", 0
   'Shell "cmd /c xcopy \datas\*.* c:\temp /e", 0
End Sub

Private Sub Form_Load()
   max = 50
   niveau = 0
End Sub

pour le momment ca fonctionne mais sans aucune création de répertoire ni copie de fichier.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 11 nov. 2008 à 13:40
3
Merci
A noter que la ProgressBar existe déjà toute faite dans les controles de VB6, il faut inclures les composants Microsoft Windows Common Controle pour l'avoir dans la barre d'outils.

Ensuite sur le principe, effectivement pour afficher l'avancement de la copie sur la progressbar, tu ne vas pas pouvoir le faire en utilisant xcopy. Il va te falloir copier les fichiers un à un et entre chaque copie incrémenter la progressbar.

Sinon en utilisant xcopy, tu pourras faire une progressbar qui reflete juste un traitement encours mais tu n'auras pas la représentation du taux d'avacement.
C'est tout à fait acceptable aussi, c'est un choix à faire.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
Papasayans 4 Messages postés mardi 20 mai 2008Date d'inscription 13 novembre 2008 Dernière intervention - 12 nov. 2008 à 13:28
3
Merci
Je te remerci de ta réponse mais j'ai quand même 214 fichiers répartie dans 17 répertoires donc ca va faire long a tapez les lignes de code.

Merci Papasayans 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de Papasayans
Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 12 nov. 2008 à 15:35
3
Merci
Comme je te le disais, tu as donc 2 solutions.

Soit tu veux que ta progressbar représente exactement l'avancement de la copie, il te faudra donc pour cela, d'abord connaitre le nombre de fichiers à copier, et ensuite faire une première boucle sur la liste des dossiers et pour chacun des ces dossiers faire une seconde boucle sur les fichiers à copier. Et à chaque copie de fichier, tu incrémente la progressbar. Cela t'oblige effectivement à copier chacun des fichiers, un à un.

Soit il n'est as nécessaire que ta progressbar représente exectement l'avancement. Dans ce cas tu peut effectivement utiliser un timer pour animer ta progressbar. Mais contrairement à ce que tu fais, lorsque ta progressbar arrive au maximum, tu la remet à 0 et tu continue l'incrémentation. Et comme ça indéfiniment.
Il te faudra par contre, à coté une autre fonction, qui va dans l'ordre :
- démarrer le timer de la progressbar
- lancer la copie de l'ensemble des fichiers
- attendre la fin de la copie (attention à la commande Shell qui, utilisée seule n'attend pas la fin de l'execution pour rendre la main)
- arreter le timer de la progressbar et la masquer si besoin.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
Papasayans 4 Messages postés mardi 20 mai 2008Date d'inscription 13 novembre 2008 Dernière intervention - 12 nov. 2008 à 22:38
3
Merci
Quel parametre dois je mettre avec shell pour que celui ci attend la fin avant de rendre la main au programme ? car je viens de voir ta seconde réponse mais entre temps j'avais suivi ton conseil et tapez les lignes de codes afin qu'il copie 1 par 1 les fichiers.

Merci Papasayans 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de Papasayans
Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 13 nov. 2008 à 08:57
3
Merci
C'est plus complexe que ça, la commande Shell n'est pas prévue pour attendre la fin de l'execution.

Tu peux regarder ma source, j'y ai mis un mécanisme qui attend justement la fin de l'execution. Le problème est que dans ce cas, je suspend le fonctionnement du code durant l'attente, donc dans ce cas ta progressbar ne sera pas mis à jour.

Il me semble qu'il existe une autre solution, mais ça ne me revient pas pour le moment.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
Papasayans 4 Messages postés mardi 20 mai 2008Date d'inscription 13 novembre 2008 Dernière intervention - 13 nov. 2008 à 13:57
3
Merci
Ca ne drevrais pas être un probleme vu que j'incremente ma progress barre d'un a chaque fichier copier. Donc ta source peut mettre utile. Ou puis je la trouver ?

pour infos je vais te recopier ce que j'ai modifier avant d'avoir vu ton message :

Dim niveau As Long, max As Long, ok As Long, ori As String, des As String

Private Sub affiche_Timer()
   niveau = niveau + 1
   ori = "Copie de "
   des = " Vers "
   ok = 0
   Pb.Line (0, 0)-(niveau * Pb.ScaleWidth / max, Pb.ScaleHeight), vbGreen, BF
   If niveau = max Then
      Transfert.Hide
      fin.Show
   End If   If niveau 1 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\00000001.TMP" + des + "C:\TEMP"
      'Shell "cmd /c md c:\temp", 0
      'Shell "cmd /c copy \datas\00000001.tmp c:\temp", 0
      ok = 1
   End If   If niveau 2 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\0x040c.INI" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\0x040c.ini c:\temp", 0
      ok = 1
   End If   If niveau 3 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\CoD4MW.MSI" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\CoD4MW.MSI c:\temp", 0
      ok = 1
   End If   If niveau 4 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\FirewallInstallHelper.DLL" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\FirewallInstallHelper.DLL c:\temp", 0
      ok = 1
   End If   If niveau 5 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\ISSetup.DLL" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\ISSetup.DLL c:\temp", 0
      ok = 1
   End If   If niveau 6 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\PB.CAB" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\PB.CAB c:\temp", 0
      ok = 1
   End If   If niveau 7 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\Setup.INI" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\Setup.INI c:\temp", 0
      ok = 1
   End If   If niveau 8 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\WindowsInstaller-KB893803-x86.EXE" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\WindowsInstaller-KB893803-x86.EXE c:\temp", 0
      ok = 1
   End If   If niveau 9 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\autorun.INF" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\autorun.INF c:\temp", 0
      ok = 1
   End If   If niveau 10 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\instmsia.EXE" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\instmsia.EXE c:\temp", 0
      ok = 1
   End If   If niveau 11 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\instmsiw.EXE" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\instmsiw.EXE c:\temp", 0
      ok = 1
   End If   If niveau 12 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\pbsvc.EXE" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\pbsvc.EXE c:\temp", 0
      ok = 1
   End If   If niveau 13 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\setup.EXE" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\setup.EXE c:\temp", 0
      ok = 1
   End If   If niveau 14 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\splash.BMP" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\splash.BMP c:\temp", 0
      ok = 1
   End If   If niveau 15 And ok 0 Then
      Transfert.fichier.Caption = ori + "\DATAS\version.INF" + des + "C:\TEMP"
      'Shell "cmd /c copy \datas\version.INF c:\temp", 0
      ok = 1
   End If   If niveau max Then affiche.Enabled False
   'Shell "command.com /c xcopy \datas\*.* c:\cod4 /e", 0
End Sub

Private Sub Form_Load()
   max = 15
   niveau = 0
End Sub

voila les lignes de code comme tu peut le voir y'a pas de probleme si ton astuce m'arrête le programme durant la copie du fichier.

Merci Papasayans 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de Papasayans

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.