Progress barre lors de la copie de fichiers

Résolu
Papasayans Messages postés 4 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 13 novembre 2008 - 11 nov. 2008 à 12:11
Papasayans Messages postés 4 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 13 novembre 2008 - 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.

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 nov. 2008 à 13:40
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 #   
3
Papasayans Messages postés 4 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 13 novembre 2008
12 nov. 2008 à 13:28
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.
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 nov. 2008 à 15:35
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 #   
3
Papasayans Messages postés 4 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 13 novembre 2008
12 nov. 2008 à 22:38
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.
3

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 nov. 2008 à 08:57
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 #   
3
Papasayans Messages postés 4 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 13 novembre 2008
13 nov. 2008 à 13:57
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.
3
Rejoignez-nous