[R] Barre de progression + dirmove

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

[R] Barre de progression + dirmove

#1

Message par LeSuisse »

Bonjour,
Je voudrai savoir s'il a un moyen d'avoir une barre progression avec la commande dirmove en fonction du nombre restant de fichier a déplacé et/ou en fonction d'octect ?

merci d'avance de vos réponses
Modifié en dernier par LeSuisse le lun. 23 août 2010 21:45, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#2

Message par Tlem »

Vous devriez faire quelques recherches sur le forum, car se sujet a déjà été abordé.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#3

Message par LeSuisse »

J'ai bien essayé de trouver des exemples de barre de progression mais pas avec dirmove.
Puisse avoir un ou des liens ou un exemple simple avec dirmove et une barre de progression.

Merci d'avance
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#4

Message par Tlem »

Aucune des fonctions de gestion de fichiers ou dossiers de AutoIt ne permet en natif une barre de progression sur l'évolution de la commande en cours.

Ou bien vous développez votre propre fonction, ou bien vous utilisez les API Windows, mais dans ce cas la progression ne sera pas intégrée à votre GUI.

Une recherche sur le forum avec le terme 'Progression' ou 'ProgressBar' devrait vous en dire plus.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#5

Message par LeSuisse »

développe ma propre fonction ou utiliser les api windows ça va devenir très complique pour moi

donc j'ai choisi une notre solution.
Un label qui me dit: "attendre"
lancement de la commande dirmove
et un autre pour la fin + un bouton fin

je me repencherais sur cette question barre de progression + dirmove quand j'aurai plus d'experience

merci te ton aide

@+
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#6

Message par Tlem »

Une barre de progression qui indique combien de temps il reste avant la fin d'une exécution est vraiment agréable pour celui qui doit attendre, mais elle implique un code bien plus complexe qu'une simple barre d'attente. ;)

Vous pourriez faire un compromis en réalisant à l'aide des exemples de barres de progression du forum, une barre 'infinie' :
- De gauche à droite puis encore de gauche à droite, puis encore de gauche à droite, etc ...
ou
- De gauche à droite puis de droite à gauche puis de gauche à droite puis de droite à gauche, etc ...
En 'parallèle' (grâce à AdlibRegister) de temps en temps, analysez la quantité de donnée restante pour le transfert et affichez le. :roll:
Cette dernière partie est plus ou moins complexe car elle demande du temps machine et si vous faites cette action trop souvent, votre script risque de devenir plutôt lent. :mrgreen:
Hé oui, AutoIt n'est pas multitâche, donc, il faut choisir un bon compromis. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
GELDROC
Niveau 6
Niveau 6
Messages : 295
Enregistré le : sam. 10 oct. 2009 10:15
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#7

Message par GELDROC »

le partirai plus vars la création d'une fonction qui commence par crée une liste des fichier , sous répertoire et fichier de sous répertoire et ect... en exécutant un DIR

puis on compte le nombre de ligne dans la liste afin de crée la bar de progression

et ensuite on copie chaque fichier de la liste ci c'est un fichier
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#8

Message par Tlem »

Je ne suis pas sur que ce soit vraiment la meilleure solution.

Personnellement, je partirait avec un $Var = DirGetSize($Dir, 1) qui sera plus ou moins long lors de la première utilisation (environs 600 ms sur mon dossier Windows la première fois puis 230 ms).

Avec cette commande, nous avons la taille totale du dossier ($Var[0]), le nombre total de fichier ($Var[1]) et le nombre total de dossier ($Var[2]).
Si on effectue cette tâche régulièrement, il est simple de calculer le nombre de fichiers restant ou taille totale à déplacer/copier ... :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
GELDROC
Niveau 6
Niveau 6
Messages : 295
Enregistré le : sam. 10 oct. 2009 10:15
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#9

Message par GELDROC »

Oui mais pourquoi ni avais-je pas pensé . bien joué cela me servira surement un jour .
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#10

Message par LeSuisse »

pour l'instant je l'ai fait a un changement de label
une fois que la commande dirmove est lancer j'ai impression que les fenêtres ne réponde pas
je vais me penche sur la barre de progression avec vos conseils mais je ne pense pas que ça sera pour aujourd'hui (aie ma tête)
voici mon code

Code : Tout sélectionner

$begin = TimerInit()
;~ lancement de cmd
run ("cmd")
WinWaitActive ("C:\Windows\system32\cmd.exe")
;~ variable de la date
$mois = @mon-1
$annee = @YEAR
if $mois = 0 then 
    $mois = 12
    $annee = @YEAR-1
EndIf
if $mois < 10 Then
    $mois = 0 & @mon-1
EndIf
$1 = 'xcopy "$rep1\*.*" "t:\$rep2\' & $annee & "." & $mois & '\*.*" /d:' & $mois & "-01-" & $annee & " /s/c/i/f/y"
send ($1)
send ("{enter}")
$1 = 'xcopy "$rep3\*.*" "t:\$rep2\' & $annee & "." & $mois & '\*.*" /d:' & $mois & "-01-" & $annee & " /s/c/i/f/y"
send ($1)
send ("{enter}")
$1 = 'xcopy "$rep4\*.avi" "t:\$rep2\' & $annee & "." & $mois & '\*.*" /d:' & $mois & "-01-" & $annee & " /s/c/i/f/y"
send ($1)
send ("{enter}")
send ("exit")
send ("{enter}")
WinWaitClose ("C:\Windows\system32\cmd.exe")
$dif = TimerDiff($begin)
$min = round($dif/1000/60,0)
$sec = abs(Round((($dif/1000/60)-$min)*60,0))
;~ fin de la copie

#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>

Global $msg, $deplacer, $explorer, $ok, $lettre, $size, $ar_array, $lettre2, $label, $copie, $debut, $fin, $min2, $sec2
;trouver le nombre d'octect
$size = DirGetSize("t:\$rep2",1)
$taille = round($size[0]/ 1000000000, 2) ; mettre les octect en Go
$fichier = $size[1] ; trouver le nombre de fichier
$repertoire =$size[2] ; touver le nombre de fchier

;~ creation d'une boite de dialogue
    $copie = GUICreate("copie fini", 270, 200) ; fenêtre principale
    GUISetState(@SW_SHOW) ; will display an empty dialog box
    GUICtrlCreateLabel ("la copie  est fini en " & $min & " min" & $sec & " s", 10, 10) ; creation d'un texte
    GUICtrlCreateLabel ("taille (Go): " & $taille, 10, 30)
    GUICtrlCreateLabel ("nombre de fichier: " & $fichier, 10, 50)
    GUICtrlCreateLabel ("nombre de dossier: " & $repertoire, 10, 70)
    GUICtrlCreateLabel ("deplacer vers ...", 10, 100)
    $lettre = GUICtrlCreateCombo ("", 100, 100, 50) 
    _GUICtrlComboBox_AddDir($lettre, "", $DDL_DRIVES, False) ; creation d'un combo avec les lecteurs
    $deplacer = GUICtrlCreateButton ("deplacer", 160, 100 , 100) ; creation d'un bouton
    $explorer = GUICtrlCreateButton ("explorer et quitte", 160, 130, 100)
    $ok = GUICtrlCreateButton ("quitte", 160, 160 , 100)
;~ creation des choix de bouton
    While 1
        $msg = GUIGetMsg()
        Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
        case $msg = $deplacer
            $lettre2 = GUICtrlRead($lettre) ; garde ma lettre (combo) en memoire 
;~          GUIDelete ($copie) ; supprimer une fenetre principal
            GUICreate("deplacement", 200 , 150)
            GUISetState(@SW_SHOW)
            $label = GUICtrlCreateLabel ("attend j'ai pas fini de deplacer vers " & $lettre2, 10,10)
            $debut = TimerInit()
            DirMove ('t:\$rep2', $lettre2 & '\', 1) ; depalcer un repertoire + les sous repertoires + fichiers
            $fin = TimerDiff($debut)
            $min2 = round($fin/1000/60,0)
            $sec2 = abs(Round((($fin/1000/60)-$min2)*60,0))
            $size2 = DirGetSize($lettre2 & '\boulot',1)
            $taille2 = round($size[0]/ 1000000000, 2) ; mettre les octect en Go
            $fichier2 = $size[1] ; trouver le nombre de fichier
            $repertoire2 = $size[2] ; touver le nombre de fchier
            GUICtrlDelete ($label) ; supprimer un label 
            GUICtrlCreateLabel ("fini le deplacement vers " & $lettre2, 10, 10)
            GUICtrlCreateLabel ("fait en " & $min2 & "min " & $sec2 & " s", 10, 30)
            GUICtrlCreateLabel ("taille (Go): " & $taille2, 10, 50)
            GUICtrlCreateLabel ("nombre de fichier: " & $fichier2, 10, 70)
            GUICtrlCreateLabel ("nombre de dossier: " & $repertoire2, 10, 90)
            $ok = GUICtrlCreateButton ("fin", 75, 120 , 50)
        Case $msg = $explorer
            run ("explorer t:\$rep2")
            Exit ; fin du program
        Case $msg = $ok
            Exit
        EndSelect       
    WEnd
    GUIDelete()
;~ EndFunc   ;==>Example1
 
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#11

Message par Tlem »

Déjà, pour la première partie de votre script, vous pourriez remplacer les 30 premières lignes par ceci :
► Afficher le texte
:roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#12

Message par Tlem »

En ce qui concerne la progression de copie ou de déplacement, l'affaire est plus ou moins compliquée.
En principe, il faudrait passer par la mise en mémoire des fichiers/dossiers à traiter, puis effectuer au fur et à mesure, tout en mettant à jour une barre de progression.

Ca peut être sympa avec une jolie barre de progression, mais pour ma part j'aime bien aussi la méthode Microsoft (c'est à dire une fenêtre à part qui affiche la progression).

Voici une fonction adaptée du code de ce lien : http://www.autoitscript.com/forum/index ... st&p=82020
► Afficher le texte
A utiliser comme ceci :
► Afficher le texte
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

Re: [...] Barre de progression + dirmove

#13

Message par LeSuisse »

salut
désolé pour mon silence
je pense que ce script est fini grâce a toi merci beaucoup
le voilà

Code : Tout sélectionner

#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>

; a modifier: destination, source1, source2, source3 sans le \ de la fin
$destination = ""
$source1 = ""
$source2 = ""
$source3 = ""
$source4 = $destination
$begin = TimerInit() ; debut du timer
;calcul de la date m -1
$aNewDate = StringSplit(_DateAdd( 'm',-1, _NowCalcDate()), "/")
Global $Annee = $aNewDate[1], $Mois = $aNewDate[2], $Jour = $aNewDate[3]
;copie des repertoires avec la xcopy de cmd
Global $Dst = $destination
Global $Src[3] = [$source1, $source2, $source3]

SplashTextOn("Sauvegarde", "Sauvegarde des fichiers modifiés en cours ...", 550, 60, -1, -1, 4, "", 20) ; debut de la sauuvegarde
;formule pour xcopy sous cmd
For $i = 0 to UBound($Src) - 1
    $cmd = 'XCOPY "' & $Src[$i] & '\*.*" "' & $Dst & "\" & $annee & "." & $mois & '\*.*" /d:' & $mois & "-01-" & $annee & " /s/c/i/f/y"
    RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE)
Next
Sleep(1000)
SplashOff() ; fin de sauvegarde
$dif = TimerDiff($begin) ; fin du timer
$min = round($dif/1000/60,0) ; calcul en min du timer
$sec = abs(Round((($dif/1000/60)-$min)*60,0)) ; calcul en second du timer

Global $msg, $deplacer, $explorer, $ok, $lettre, $size
;trouver le nombre d'octect
$size = DirGetSize($destination,1)
$taille = round($size[0]/ 1000000000, 2) ; mettre les octect en Go
$fichier = $size[1] ; trouver le nombre de fichier
$repertoire =$size[2] ; touver le nombre de fchier

;~ creation d'une boite de dialogue
    $copie = GUICreate("copie fini", 270, 200) ; fenêtre principale
    GUISetState(@SW_SHOW) ; will display an empty dialog box
    GUICtrlCreateLabel ("la copie est fini en " & $min & " min" & $sec & " s", 10, 10) ; creation d'un texte
    GUICtrlCreateLabel ("taille (Go): " & $taille, 10, 30)
    GUICtrlCreateLabel ("nombre de fichier: " & $fichier, 10, 50)
    GUICtrlCreateLabel ("nombre de dossier: " & $repertoire, 10, 70)
    GUICtrlCreateLabel ("deplacer vers ...", 10, 100)
    $lettre = GUICtrlCreateCombo ("", 100, 100, 50) 
    _GUICtrlComboBox_AddDir($lettre, "", $DDL_DRIVES, False) ; creation d'un combo avec les lecteurs du PC
    $deplacer = GUICtrlCreateButton ("deplacer", 160, 100 , 100) ; creation d'un bouton
    $explorer = GUICtrlCreateButton ("explorer et quitte", 160, 130, 100)
    $ok = GUICtrlCreateButton ("quitte", 160, 160 , 100)
;~ creation des choix de bouton
    While 1
        $msg = GUIGetMsg()
        Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
        case $msg = $deplacer
            $dst = GUICtrlRead($lettre) ; garde ma lettre (combo) en memoire 
            $src = $source4
            ExitLoop            
        Case $msg = $explorer
            run ("explorer destination")
            Exit ; fin du program
        Case $msg = $ok
            Exit
        EndSelect       
    WEnd
    GUIDelete()
;~ EndFunc   ;==>Example1

;barrre de progression de windows
Global Const $FO_MOVE                   = 0x0001
Global Const $FO_COPY                   = 0x0002
Global Const $FO_DELETE                 = 0x0003
Global Const $FO_RENAME                 = 0x0004

Global Const $FOF_MULTIDESTFILES        = 0x0001
Global Const $FOF_CONFIRMMOUSE          = 0x0002
Global Const $FOF_SILENT                = 0x0004
Global Const $FOF_RENAMEONCOLLISION     = 0x0008
Global Const $FOF_NOCONFIRMATION        = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE     = 0x0020
Global Const $FOF_ALLOWUNDO             = 0x0040
Global Const $FOF_FILESONLY             = 0x0080
Global Const $FOF_SIMPLEPROGRESS        = 0x0100
Global Const $FOF_NOCONFIRMMKDIR        = 0x0200
Global Const $FOF_NOERRORUI             = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION           = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING       = 0x4000
Global Const $FOF_NORECURSEREPARSE      = 0x8000

; code pour le Deplacement
$n = _ActionWithProgress($Src, $Dst, '', $FO_MOVE)
If Not $n Then ConsoleWrite('error:' & @error & @CRLF)
    
Func _ActionWithProgress($sFrom, $sTo, $sTitle = '', $sAction = $FO_COPY)
    Local $SHFILEOPSTRUCT, $pFrom, $pTo, $pTitle, $aDllRet, $nError = 0
    Local $flags = BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION, $FOF_NOERRORUI)
        $SHFILEOPSTRUCT = DllStructCreate("hwnd hwnd;uint wFunc;ptr pFrom;ptr pTo;int fFlags;int fAnyOperationsAborted;ptr hNameMappings;ptr lpszProgressTitle")
    DllStructSetData($SHFILEOPSTRUCT, "hwnd", 0)
    DllStructSetData($SHFILEOPSTRUCT, "wFunc", $sAction)
        $pFrom = DllStructCreate("char[" & StringLen($sFrom)+2 & "]")
    DllStructSetData($pFrom, 1, $sFrom)
    DllStructSetData($pFrom, 1, Chr(0), StringLen($sFrom)+2) ; second null at the end
    DllStructSetData($SHFILEOPSTRUCT, "pFrom", DllStructGetPtr($pFrom))
        $pTo = DllStructCreate("char[" & StringLen($sTo)+2 & "]")
    DllStructSetData($pTo, 1, $sTo)
    DllStructSetData($pTo, 1, Chr(0), StringLen($sTo)+2) ; second null at the end
    DllStructSetData($SHFILEOPSTRUCT, "pTo", DllStructGetPtr($pTo))
        DllStructSetData($SHFILEOPSTRUCT, "fAnyOperationsAborted", 0)
    DllStructSetData($SHFILEOPSTRUCT, "hNameMappings", 0)
        If $sTitle <> '' Then
       $pTitle = DllStructCreate("char[" & StringLen($sTitle)+1 & "]")
        ;$pTitle = DllStructCreate("char[4]")
       DllStructSetData($pTitle, 1, $sTitle)
        ;DllStructSetData($pTitle, 1, 'aaa')
       DllStructSetData($pTitle, 1, Chr(0), StringLen($sTitle)+1) ; null at the end

        $flags = BitOR($flags, $FOF_SIMPLEPROGRESS)
        DllStructSetData($SHFILEOPSTRUCT, "lpszProgressTitle", DllStructGetPtr($pTitle))
;~      DllStructSetData($SHFILEOPSTRUCT, "lpszProgressTitle", 'aaa')
    Else
        DllStructSetData($SHFILEOPSTRUCT, "lpszProgressTitle", 0)
    EndIf
        DllStructSetData($SHFILEOPSTRUCT, "fFlags", $flags)

    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    If @error Or $aDllRet[0] <> 0 Then
        $aDllRet = DllCall("kernel32.dll", "long", "GetLastError")
        If Not @error Then $nError = $aDllRet[0]
    EndIf
        ; test if button Abort was pressed
    If DllStructGetData($SHFILEOPSTRUCT, "fAnyOperationsAborted") Then $nError = -1

    $pFrom = 0
    $pTo = 0
    $pTitle = 0
    $SHFILEOPSTRUCT = 0
        If $nError <> 0 Then
        SetError($nError)
        Return False
    EndIf
    Return True
EndFunc
; fin de la barre de windows
 
pour moi ça me va
si pour toi ça te va je vais marquer résolu
merci encore
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Barre de progression + dirmove

#14

Message par Tlem »

Mon avis importe peux. Ce qui compte c'est que votre script fonctionne et que vous soyez satisfait du résultat. ;)

Après, il est sans doute possible d'optimiser, mais est-ce que cela en vaut le coup. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
LeSuisse
Niveau 1
Niveau 1
Messages : 7
Enregistré le : jeu. 19 août 2010 18:28
Status : Hors ligne

[R] Barre de progression + dirmove

#15

Message par LeSuisse »

je ne pense pas que je vais me pencher sur l'optimisation désolé de ce programme il fonctionne assez bien moi
il va travailler pour moi et ça c'est cool :D

merci encore pour ton aide

@+ bon courage
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Barre de progression + dirmove

#16

Message par Tlem »

N'oubliez pas la balise [R] dans le titre de votre premier message si votre sujet est résolu et non dans le dernier message.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre