DirCopy im Hintergrund

  • Hi Community...
    Ich habe ein Problem, undzwar möchte ich mir den Fortschritt von DirCopy in einer PrograssBar anzeigen lassen.
    Bisher hatte ich das so, ging aber logischerweise nicht:

    Spoiler anzeigen
    [autoit]


    $Progress1 = GUICtrlCreateProgress(8, 40, 395, 25)
    GUICtrlSetLimit(-1, 1500620671, 0)
    dircopy("LOL3","C:\LOL\XD")
    while 1
    $size = dirgetsize("C:\LOL\XD")
    guictrlsetdata($Progress1,$size)
    WEnd

    [/autoit]


    Die 1500620671 ist die Größe des Quellordners in Bytes.
    Kann mir einer helfen?

  • Vielleicht kannst du ja auf irgendeine Weise die Größe des Ordners erfassen und somit eine Prozentanzeige basteln.

    LG_alpines

    €dit:

    Vielleicht hilft dir das Script mit der Prozentanzeige weiter:
    Achtung ! Das ist ein Downloader für INet nicht für DirCopy.

    [autoit]

    $sURL = InputBox("Download", "URL eingeben", "")

    [/autoit][autoit][/autoit][autoit]

    $iSize = InetGetSize($sURL)
    $hIGet = InetGet($sURL, "FireFox.exe", 0, 1)

    [/autoit][autoit][/autoit][autoit]

    ProgressOn("Download", "Progress", "0%")
    $iBytesRead = 0

    [/autoit][autoit][/autoit][autoit]

    Do
    If InetGetInfo($hIGet, 0) <> $iBytesRead Then
    $iBytesRead = InetGetInfo($hIGet, 0)
    $iPercentage = Round($iBytesRead / $iSize * 100, 1)
    ProgressSet($iPercentage, $iPercentage & "%")
    EndIf
    Sleep(50)
    Until $iBytesRead = $iSize

    [/autoit][autoit][/autoit][autoit]

    ProgressSet(100, "100%", "Completed")
    Sleep(2000)
    ProgressOff()

    [/autoit]
  • Bittsehr:

    Spoiler anzeigen
    [autoit]

    $sSource = FileSelectFolder("Bitte Quellpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1)
    $sDest = FileSelectFolder("Bitte Zielpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $sSource <> $sDest Then
    CopyWithProgress($sSource, $sDest)
    Else
    MsgBox(0, "Fehler", "Quelle und Ziel müssen unterschiedlich sein")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    #Include <Date.au3>
    Func CopyWithProgress($srcDir, $destDir) ;Original gigx siehe https://autoit.de/index.php?page…25989#post25989
    Local $tsBeginn = _NowCalc(), $tsDiff =-1, $tsRest ;eingefügt für Restdauer
    If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1)
    If StringRight($destDir, 1) <> "\" Then $destDir = $destDir & "\"
    If Not FileExists($destDir) Then DirCreate($destDir)
    $srcSize = DirGetSize($srcDir, 1)
    $1_percent = $srcSize[0] / 100
    Run('XCOPY "'& $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G',@TempDir,@SW_HIDE )
    ProgressOn("Advanced status of file copying", "", "",10,10)
    Do
    if $tsDiff < 0 Then Sleep(5000)
    $destSize = DirGetSize($destDir, 1)
    $tsDiff = _DateDiff("s",$tsBeginn,_NowCalc())
    $tsRest = round($tsDiff / ($destSize[0] / $1_percent) * 100,0) - $tsDiff
    ConsoleWrite($tsDiff & " " & $1_percent & " " & $tsRest &@CRLF)
    ProgressSet(Round($destSize[0] / $1_percent, 2), Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied.", Round($destSize[0] / $1_percent, 2) & "% - Done! " & $tsRest & " sec. Rest")
    Sleep($tsDiff)
    Until $destSize[0] >= $srcSize[0]
    MsgBox(0,"Fertig in " & $tsDiff & " sec.",Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & Round($destSize[0] / $1_percent, 2) & "% - Done! ")
    ProgressOff()
    EndFunc
    #cs
    /D:M-T-J Kopiert nur die an oder nach dem Datum geänderten Dateien.
    Da kein Datum angegeben, werden nur Dateien kopiert,
    die neuer als die bestehenden Zieldateien sind.
    /S Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
    /E Kopiert alle Unterverzeichnisse (leer oder nicht leer).
    /V Überprüft jede neue Datei auf Korrektheit.
    /C Setzt das Kopieren fort, auch wenn Fehler auftreten.
    /H Kopiert auch Dateien mit den Attributen 'Versteckt' und 'System'.
    /R Überschreibt schreibgeschützte Dateien. (eventuell entfernen)
    /O Kopiert Informationen über den Besitzer und ACL.
    /X Kopiert Dateiüberwachungseinstellungen (bedingt /O).
    nicht gesetzt evtl. setzen
    /Y Unterdrückt die Aufforderung zur Bestätigung, dass eine
    vorhandene Zieldatei überschrieben werden soll.
    praktisch aber evtl. entfernen, dann darf run aber nicht mit @SW_HIDE gestartet werden,
    da sonst ein unsichtbares Fenster auf eine Eingabe wartet
    /F Zeigt die Namen der Quell- und Zieldateien beim Kopieren an.
    wenn mit @SW_HIDE gestartet unnötig, da Fenster unsichtbar
    /G Ermöglicht das Kopieren von verschlüsselten Dateien auf ein
    Ziel wo Verschlüsselung nicht unterstützt wird.
    #ce

    [/autoit]

    MfG, campweb

  • Jaa, nur dass ich das in meine eigene ProgressBar packen möchte und das nicht gebacken bekomme...

  • Naja wo ist das Problem? Du musst doch nur bei der Funktion von campweb das progresson und progressof auskommentieren und anstelle von progressset ein guictrlsetdata($myprogressbar,$percent) reinpacken.

  • Also ich habs jetzt mal auf meine Bedürfnisse angepasst, doch leider geht es immernoch nicht, er mach schon gleich am Anfang die ProgressBar ganz voll...
    Hier der Code:

    Spoiler anzeigen
    [autoit]

    Func _EF_CopyWithProgress($Object,$FromDir,$ToDir)
    $FromSize = DirGetSize($FromDir)
    msgbox(64,"",$FromSize)
    GUICtrlSetLimit($Object,$FromSize,0)
    If StringRight($FromDir, 1) = "\" Then $FromDir = StringLeft($FromDir, StringLen($FromDir) - 1)
    If StringRight($ToDir, 1) <> "\" Then $ToDir = $ToDir & "\"
    If Not FileExists($ToDir) Then DirCreate($ToDir)
    Run('XCOPY "'& $FromDir & '" "' & $ToDir & '" /E /H /Y /I',@ScriptDir,@SW_HIDE)
    ;ProgressOn("Advanced status of file copying", "", "",10,10)
    Do
    $ToSize = DirGetSize($ToDir)
    guictrlsetdata($Object,$ToSize)
    sleep(500)
    Until $ToSize >= $FromSize
    ;ProgressOff()
    EndFunc

    [/autoit]
  • Also die Hilfe sollte man schon lesen und Prozentrechnen sollte man auch können wenn man einen prozentualen Verlauf darstellen will.

    1. Progressbars können nur die Werte 0-100 haben.
    2. GUICtrlSetLimit ist nicht für Progressbars gedacht, also weg damit
    3. Wie berechnest du nun den Wert für die Progressbar?

    (aktuelle Größe Zielverzeichnis / Größe Quellverzeichnis) * 100 = Fortschritt in Prozent

    Diesen Wert setzt du dann in jedem Schleifendurchlauf mit guictrlsetdata($progressbar,$prozent)

  • 1. & 2.) Wenn man mit Koda das Limit einer Progressbar einstellt, steht es so im Quellcode, und daher dachte ich, warum auch immer, dass das so geht. 8|
    3. ) KA

  • Die Antwort zu Frage 3 hab ich dir ja bereits selbst gegeben. Was Koda angeht hast du allerdings recht, Sinn macht es jedenfalls nicht, denn selbst wenn man das Limit damit festsetzt hat das keine Auswirkung auf den darstellbaren Bereich. Es bleibt dabei, es können nur Werte von 0-100 gesetzt werden. Ich gebe aber zu, dass dies scheinbar nicht explizit in der Hilfe steht.

  • Das GuiCtrlSetLimit hat sehrwohl einen Sinn !
    Man ändert damit ja nicht die Länge der ProgressBar, sondern wie viel z.B. ein Strich wert ist.
    Nehmen wir an, wir haben eine ProgressBar mit genau 100 Strichen (Ja ich hab noch Win XP) und eine Datei die 100 Bytes groß ist.
    Dann wäre jeder Byte ein Strich.
    Wenn wir eine ProgressBar mit 100 Strichen haben, aber das Limit auf 200 stellen, und eine Datei haben die 200 Bytes groß ist, ist jeder Strich 2 Bytes wert. Also kommt nur alle 2 Bytes ein Strich.

    Und mit deiner Rechnung hats geklappt, DANKE! :D

  • Man ändert damit nichtmal optisch etwas bei progressbars, siehe Bild (links setlimit auf 2000, rechts auf 20):

    [Blockierte Grafik: http://i.imgur.com/V7dVQ.png]

    Wozu die Funktion gut ist? Man kann damit zum Beispiel bei einem Slider Minimum und Maximum festlegen, dort verhält es sich so wie du es dir vorgestellt hast. Je nach Control werden aber auch andere Limits festgesetzt, wie zum Beispiel die erlaubte Zeichenzahl einer Editbox. Details findest du in der Hilfe.

  • Zitat

    Ich meine jetzt bei ProgressBars und nicht generell, das weiß ich ja !


    Meine Güte, ist das so schwer zu verstehen? GUICtrlSetLimit hat bei Progressbars keinen Effekt weil die Funktion nicht dafür gedacht ist. Und normalerweise ist ein halbwegs guter Programmierer auch in der Lage den Prozentwert zu errechnen. :pinch:
    Haben Socken keinen Sinn weil man sie nicht sinnvoll in Kombination mit Löffeln verwenden kann? :wacko:

  • Jaja ist ja schon gut, brauchst dich nicht gleich so aufzuregen ;(
    Zu den Socken:
    Kommt drauf an, Also der Nikolaus kann das, der steckt da ja immer sachen rein am 6. Dezember :P

  • Hallo Hugbert,

    wo ist das Problem das Script anzupassen, geht doch ganz einfach ProgressSet raus, GuiCtrSetdata rein. Das ganze sieht dann fertig so aus:

    Spoiler anzeigen
    [autoit]

    #include <StaticConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sSource, $sDest, $bStop

    [/autoit] [autoit][/autoit] [autoit]

    $idfrmMain = GUICreate("DEMO XCOPY zum Kopieren benutzen", 300, 410)
    GUICtrlCreateLabel("Quellverzeichnis", 5, 20, 160)
    $idbtnSelSource = GUICtrlCreateButton(" &Quelle ändern", 215, 10, 80, 20)
    $idedtSource = GUICtrlCreateEdit($sSource, 5, 35, 290, 60, BitOR($ES_MULTILINE, $ES_READONLY))

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("Zielverzeichnis", 5, 120, 160)
    $idbtnSelDest = GUICtrlCreateButton("&Ziel ändern", 215, 110, 80, 20)
    $idedtDest = GUICtrlCreateEdit($sSource, 5, 135, 290, 70, BitOR($ES_MULTILINE, $ES_READONLY))

    [/autoit] [autoit][/autoit] [autoit]

    $idProgress = GUICtrlCreateProgress(5, 230, 290, 25)
    $idLblInfo = GUICtrlCreateLabel("", 5, 260, 290, 70, $SS_CENTER)
    $idbtnStart = GUICtrlCreateButton("&Start", 215, 340, 80, 25)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idbtnSelSource
    $sSource = FileSelectFolder("Bitte Quellpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1, $sSource, $idfrmMain)
    If $sSource <> "" Then
    GUICtrlSetData($idedtSource, $sSource)
    EndIf
    Case $idbtnSelDest
    $sDest = FileSelectFolder("Bitte Quellpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1, $sDest, $idfrmMain)
    If $sDest <> "" Then
    GUICtrlSetData($idedtDest, $sDest)
    EndIf
    Case $idbtnStart
    $bStop = False
    GUICtrlSetData($idbtnStart, "&Stop")
    CopyWithProgress($sSource, $sDest)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func CopyWithProgress($srcDir, $destDir) ;Original gigx siehe https://autoit.de/index.php?page…25989#post25989
    Local $tsBeginn = _NowCalc(), $tsDiff = -1, $tsRest ;eingefügt für Restdauer
    If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1)
    If StringRight($destDir, 1) <> "\" Then $destDir = $destDir & "\"
    If Not FileExists($destDir) Then DirCreate($destDir)
    $srcSize = DirGetSize($srcDir, 1)
    $1_percent = $srcSize[0] / 100
    $pid = Run('XCOPY "' & $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G', @TempDir, @SW_HIDE)
    While ProcessExists($pid)
    If $tsDiff < 0 Then Sleep(100)
    $destSize = DirGetSize($destDir, 1)
    $tsDiff = _DateDiff("s", $tsBeginn, _NowCalc())
    $tsRest = Round($tsDiff / ($destSize[0] / $1_percent) * 100, 0) - $tsDiff
    $iPercent = Round($destSize[0] / $1_percent, 0)
    ConsoleWrite($tsDiff & " " & $iPercent & " " & $tsRest & @CRLF)
    If $iPercent <> GUICtrlRead($idProgress) Then
    GUICtrlSetData($idProgress, $iPercent)
    GUICtrlSetData($idLblInfo, Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2) & " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & $iPercent & "% - Done! " & $tsRest & " sec. remaining")
    EndIf
    If GUIGetMsg() = $idbtnStart Then
    ProcessClose($pid)
    $bStop = True
    EndIf
    WEnd
    $tsDiff = _DateDiff("s", $tsBeginn, _NowCalc())

    [/autoit] [autoit][/autoit] [autoit]

    $destSize = DirGetSize($destDir, 1)
    If $bStop Then
    GUICtrlSetData($idLblInfo, "Abbruch durch Benutzer")
    Else
    GUICtrlSetData($idLblInfo, Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2) & " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & Round($destSize[0] / $1_percent, 2) & "% - Done! " & $tsDiff & " sec. ellapsed")
    EndIf
    GUICtrlSetData($idbtnStart, "&Start")
    EndFunc ;==>CopyWithProgress
    #cs
    /D:M-T-J Kopiert nur die an oder nach dem Datum geänderten Dateien.
    Da kein Datum angegeben, werden nur Dateien kopiert,
    die neuer als die bestehenden Zieldateien sind.
    /S Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
    /E Kopiert alle Unterverzeichnisse (leer oder nicht leer).
    /V Überprüft jede neue Datei auf Korrektheit.
    /C Setzt das Kopieren fort, auch wenn Fehler auftreten.
    /H Kopiert auch Dateien mit den Attributen 'Versteckt' und 'System'.
    /R Überschreibt schreibgeschützte Dateien. (eventuell entfernen)
    /O Kopiert Informationen über den Besitzer und ACL.
    /X Kopiert Dateiüberwachungseinstellungen (bedingt /O).
    nicht gesetzt evtl. setzen
    /Y Unterdrückt die Aufforderung zur Bestätigung, dass eine
    vorhandene Zieldatei überschrieben werden soll.
    praktisch aber evtl. entfernen, dann darf run aber nicht mit @SW_HIDE gestartet werden,
    da sonst ein unsichtbares Fenster auf eine Eingabe wartet
    /F Zeigt die Namen der Quell- und Zieldateien beim Kopieren an.
    wenn mit @SW_HIDE gestartet unnötig, da Fenster unsichtbar
    /G Ermöglicht das Kopieren von verschlüsselten Dateien auf ein
    Ziel wo Verschlüsselung nicht unterstützt wird.
    #ce

    [/autoit]

    Das Originalscript ist aber nicht von Campweb sondern von gigx siehe https://autoit.de/index.php?page…25989#post25989

    mfg autoBert