Kopieren/Verschieben mit Statusbar-Anzeige?

  • Hallo,

    ich möchte eine riesige Sicherungsdatei verschieben (Zeit: ca. 70 min) und ich denke immer der Rechner ist abgestürzt, weil sich einfach gar nichts tut.

    Frage1:
    Gibt es einen Zeitvorteil bei einer der Varianten oder ist der vernachlässigbar?

    [autoit]


    ;Variante 1
    $befehl = "move "&$pfad_sich_Server&$dateiliste[$i]&" "&$pfad_ziel
    RunWait(@ComSpec & " /c " & $befehl)

    ;Variante 2
    FileMove($pfad_sich_Server&$dateiliste[$i],$pfad_ziel)

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

    ;Variante 3 (nachträglich eingefügt, vgl. Verweis weiter unten)
    ;~ 4 Do not display a progress dialog box.
    ;~ 8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
    ;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
    ;~ 64 Preserve undo information, if possible.
    ;~ 128 Perform the operation on files only if a wildcard file name (*.*) is specified.
    ;~ 256 Display a progress dialog box but do not show the file names.
    ;~ 512 Do not confirm the creation of a new directory if the operation requires one to be created.
    ;~ 1024 Do not display a user interface if an error occurs.
    ;~ 2048 Version 4.71. Do not copy the security attributes of the file.
    ;~ 4096 Only operate in the local directory. Don't operate recursively into subdirectories.
    ;~ 9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.
    _FileCopy($pfad_sich_Server&$dateiliste[$i] ,$pfad_ziel )

    Func _FileCopy($fromFile,$tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 512
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
    EndFunc

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


    Frage2: (Lösung wurde oben nachträglich eingefügt)
    Gibt es eine weitere Möglichkeit um eine Restzeitanzeige für das Kopieren bzw. Verschieben von Dateien mit AutoIt zu erhalten?

    Im Prinzip könnte ich die Windows-Kopierfunktion verwenden, denn dort gibt es den fortlaufenden Balken - aber wie greife ich darauf von AutoIt aus zu?

    Vielen Dank
    viele Grüsse
    Carsten

    2 Mal editiert, zuletzt von Carsten (11. Juni 2007 um 12:02)

    • Offizieller Beitrag

    HI,

    so ähnlich:

    [autoit]

    Func _copy($From_File, $To_File, $option = 1)
    If Not FileExists($From_File) Then Return -1
    $fromBytes = FileGetSize($From_File)
    FileCopy($From_File, $To_File, 1)
    While FileGetSize($To_File) < $fromBytes
    WEnd
    EndFunc ;==>_copy

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

    _FileCopy("c:\Downloads\WindowsXP-KB835935-SP2-DEU.exe" ,"C:\temp")

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

    Func _FileCopy($fromFile,$tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 256
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
    EndFunc

    [/autoit]

    So long,

    Mega

    PS geht auch mit Move!

  • Hallo, vielen Dank.

    Ich habe gesucht, aber wohl die falschen Stichwörter eingegeben, 'rekursiv' wollte ich ja nix machen.... :)

    Hier ist das aber wirklich gut beschrieben:
    Link auf anderen Beitrag

    Ich habe die für mich relevante Möglichkeit bereits oben eingefügt.

    Vielen Dank
    Carsten

  • Aber bei wirklich großen Dateien funktioniert es wunderbar :)


    @mega

    Hallo Mega,

    dein PS 'geht auch mit Move' habe ich noch nicht ganz kapiert.

    Wenn ich
    $winShell.namespace($tofile).MOVEHere($fromFile,$FOF_RESPOND_YES)
    anstelle
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
    schreibe, klappt es nicht.

    Was muss ich tun um zu verschieben?

  • Klappt einwandfrei -
    Auf die Idee es so zu versuchen bin ich ja selbst gekommen, hat aber nicht geklappt. War wohl ein Tippfehler......

    Vielen Dank
    Beitrag geschlossen,
    User zufrieden :)

  • @ Xenobiologist:

    Diese Kopierfunktion:

    [autoit]


    ;~ 4 Do not display a progress dialog box.
    ;~ 8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
    ;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
    ;~ 64 Preserve undo information, if possible.
    ;~ 128 Perform the operation on files only if a wildcard file name (*.*) is specified.
    ;~ 256 Display a progress dialog box but do not show the file names.
    ;~ 512 Do not confirm the creation of a new directory if the operation requires one to be created.
    ;~ 1024 Do not display a user interface if an error occurs.
    ;~ 2048 Version 4.71. Do not copy the security attributes of the file.
    ;~ 4096 Only operate in the local directory. Don't operate recursively into subdirectories.
    ;~ 9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.
    _FileCopy($pfad_sich_Server&$dateiliste[$i] ,$pfad_ziel )

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

    Func _FileCopy($fromFile,$tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 512
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
    EndFunc

    [/autoit]

    ist zwar die beste, die es meiner Meinung nach gibt. Doch wie kann ich hierbei mehrere Dateien kopieren?
    (dem $fromFile mehrere Dateien zuordnen??) ?(

    Wäre über Hilfe sehr dankbar!!

    mfg
    Leo.1906

  • Naja. Ich wollte das so wie bei Windows, dass mehrere Dateien mit einer Progressbar kopiert werden.
    (wenn man bei Windows mehrere Dateien makiert, und sie dann kopiert, kommt ein Dialog für alle Datein.)

    Es ist schon wichtig, dass alle Dateien auf einmal kopiert werden können. (allein der Optik halber ;) )

    Hab schon alles was mir einfällt ausprobiert (2 Fromfiles mit semikolon dazwischen, mit einem Plus, mit einem Komma,...)

    Weist du wie man das Problem lösen kann?

    mfg
    Leo.1906

    • Offizieller Beitrag

    Ich sehe grad, du möchtest, dass der Status(Progressbar) sich auf alle Dateien bezieht. Da weiß ich nicht ob das möglich ist.
    Ansonsten Array mit den Quelldateien übergeben und einzeln ausführen. Aber das kannst du auch außerhalb der Funktion machen und diese, wie schon erwähnt, in einer Schleife aufrufen.

    • Offizieller Beitrag

    Hi,

    versuch doch mal sowas

    Spoiler anzeigen
    [autoit]

    Func _copyProgress($From_dir, $Dest_dir, $filter = '*.*')
    Local $count = 0, $dir = ""
    $FileList = _FileListToArray($From_dir, $filter, 0)
    If(Not IsArray($FileList)) And(@error = 1) Then SetError(-1)
    ProgressOn("Copy", "Files :", "0 files")
    For $i = 1 To UBound($FileList) - 1
    If FileGetAttrib($FileList[$i]) = "D" Then $dir = "\*.*"
    If FileCopy($From_dir & "\" & $FileList[$i] & $dir, $Dest_dir & "\", 9) Then
    $count += 1
    ProgressSet($count * 100 / $FileList[0], _
    "From: " & $From_dir & "\" & @LF & "To: " & $Dest_dir & "\" & @LF & $FileList[$i], _
    StringFormat('%05.2f', Round(($count * 100 / $FileList[0]), 2)) & " % " & @TAB & $count & "/" & $FileList[0] & " Done")
    EndIf
    ; Sleep(1)
    Next
    ProgressSet(100, "Done", "Complete")
    Sleep(500)
    ProgressOff()
    Return 1
    EndFunc ;==>_copyProgress

    [/autoit]

    Mega

  • Naja.. das is zwar ganz gut, aber ich möchte eigentlich die Windows Progressbar.
    Alles was ich dazu wissen muss ist, wie man der Windows Kopiermethode sagt, welche Dateien es kopieren soll (mehrere).

    Ach noch was: Wisst ihr eigentlich, ob es diese Windows Kopierfunktion auch mit löschen gibt?
    (FileDelete mit Windows Progressbar. Hab so was schon mal gesehen, aber diese Methode hat die Dateien ganz gelöscht (ohne sie in den Papierkorb zu werfen))

    mfg
    Leo.1906