Datengrösse bei Filecopy der Copy ermitteln

  • Hallo Leute

    ich hätte eine Frage zum Thema Filecopy einer Datei von z.b. von 3 GB und ich möchte ein Progresspar mitlaufen lassen woher weis ich das der Kopiervorgang zu 50% Fertig ist.

    Wie und wo bekomme ich die Info her.

    Ich habe schon versucht die Dateigrösse abzufangen aber die ist vom ersten Moment eine grösse von 3GB logischerweise.
    Also wie stelle ich das an.

    gruss

    McBaldrian

    Solange
    du den anderen sein Anderssein nicht verzeihen kannst, bist du noch weit ab vom
    Wege der Weisheit.

  • FileCopy blockt das Skript bis der Kopiervorgang abgeschlossen ist.
    Zwischendurch kannst du also keinen Code ausführen, geschweige denn eine Progressbar aktualisieren.
    Es gibt daher Ansätze über das Shell-Objekt oder Windows-API-Funktionen.

    Ein anderer Ansatz ist es, selbst eine Kopierfunktion zu schreiben.
    Das ist ja prinzipiell nichts weiter als den Inhalt aus einer Datei zu lesen (hier blockweise) und in eine Zieldatei zu schreiben.
    Hier mal ein Beispiel (es ist noch eine Bremse eingebaut - wenn es produktiv eingesetzt werden soll die Zeile 50 auskommentieren):

    Copy mit Progressbar
    [autoit]

    #RequireAdmin

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

    $Quelle = @SystemDir & '\taskmgr.exe'
    $Ziel = "C:\taskmgr.exe"

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

    If _ProgressCopy($Quelle, $Ziel) Then MsgBox(0,"", "Kopiervorgang erfolgreich!")

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

    Func _ProgressCopy($SourceFile, $DestinationFile)
    If Not FileExists($SourceFile) Then Return SetError(1,1,0)
    If $SourceFile == $DestinationFile Then Return SetError(2,2,0)

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

    #region------------------------------------Declare Variables-------------------------------
    Local $ByteBlock, $Counter
    Local Const $BlockSize = Int(FileGetSize($SourceFile) / 99)
    Local Const $Opt = Opt("GUIOnEventMode", 0)
    Local $OpenHandle = FileOpen($SourceFile, 16)
    Local $WriteHandle = FileOpen($DestinationFile, 26)
    #endregion---------------------------------------------------------------------------------

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

    If $OpenHandle = -1 Or $WriteHandle = -1 Then Return SetError(3,3,0)

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

    #region------------------------------------GUI create--------------------------------------
    Local $GUI = GUICreate('', 400, 105, Default, Default, 0x80880000)
    Local $Label1 = GUICtrlCreateLabel($SourceFile, 8, 10)
    Local $Label2 = GUICtrlCreateLabel($DestinationFile, 8, 30)
    Local $Label3 = GUICtrlCreateLabel("0%", 360, 25, 30, 20, 0x2)
    Local $Button = GUICtrlCreateButton("Abbrechen", 160, 75, 80)
    Local $PBar = GUICtrlCreateProgress(8, 50, 384, 20)
    GUISetState()
    #endregion---------------------------------------------------------------------------------

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

    #region----------------------------------Copy File-----------------------------------------
    Do
    $ByteBlock = FileRead($OpenHandle, $BlockSize)
    If @error Then ExitLoop
    FileWrite($WriteHandle, $ByteBlock)
    $Counter += 1
    GUICtrlSetData($PBar, $Counter)
    GUICtrlSetData($Label3, $Counter & ' %')

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

    If GUIGetMsg() = $Button Then
    Opt("GUIOnEventMode", $Opt)
    FileClose($OpenHandle)
    FileClose($WriteHandle)
    GUIDelete($GUI)
    FileDelete($DestinationFile)
    Return SetError(4,4,0)
    EndIf

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

    Sleep(20) ;Bremse - Auskommentieren für maximale Geschwindigkeit
    Until 0
    #endregion---------------------------------------------------------------------------------

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

    Opt("GUIOnEventMode", $Opt)
    FileClose($OpenHandle)
    FileClose($WriteHandle)
    GUIDelete($GUI)
    Return 1
    EndFunc

    [/autoit]
  • Als weitere Option wäre da noch die Möglichkeit, die Win-API Funktion "CopyFileEx" zu nutzen. Diese bietet die Möglichkeit den Kopierfortschritt anzeigen zu lassen. Mit Google (Suche nach: "CopyfileEx AutoIt") findet man da auch ein paar Beispiel-Ansätze.

    Unteranderem gibt es die UDF "_MultiFileCopy", die bietet bereits eine einfache Lösung.

    Einmal editiert, zuletzt von KloMeister (13. November 2014 um 09:33)