Patcher, Progress Gesamtdownloadstatus und Einzeldownloadstatus

  • Abend,

    1. Ich habe da ein kleines Problem, da ich gerade versuche, mal einen Patcher zu schreiben, aber vor dem Problem stehe, dass ich nun nicht weiß, wie ich es mit de Gesamtdownloadstatus und dem Einzeldownloadstatus anstelle.

    2. Er downloadet mit InetGet die Datei von meiner Webspace nicht. Wie kann ich dies hinbekommen?

    Script :

    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #Include <File.au3>
    #Include <String.au3>
    $GUI = GUICreate("Patcher", 615, 419, 192, 124)
    $GesamtProgress = GUICtrlCreateProgress(8, 312, 590, 25)
    $EinzelProgress = GUICtrlCreateProgress(8, 376, 590, 25)
    $ButtonPatchen = GUICtrlCreateButton("Patchen", 520, 16, 75, 25)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 520, 56, 75, 25)
    $LGesamtfortschritt = GUICtrlCreateLabel("Gesamtfortschritt", 8, 288, 83, 17)
    $LabelProzent = GUICtrlCreateLabel("Prozent", 104, 288, 40, 17)
    $LabelDownladdatei = GUICtrlCreateLabel("", 8, 352, 137, 17)
    $Prozen = GUICtrlCreateLabel("", 176, 352, 37, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonPatchen
    $PatchlistLoad = InetGet ("http://white1991x.square7.ch/Patchlist.txt",@ScriptDir & "/Source.txt")
    Do
    Sleep(50)
    Until InetGetInfo($PatchlistLoad,2) = True
    $Open = FileOpen(@ScriptDir & "/Source.txt",0)
    If StringInStr($Open,'Bytes Total : "' Then
    $GesamtBytes = _StringBetween($Open,'Bytes Total : "','"')
    $LineCount = _FileCountLines($Open)
    For $i = 1 To $LineCount Step +1
    $ReadLines = FileReadLine($Open,$i)
    $GetData = InetGet ("http://white1991x.square7.ch/" & $ReadLines,$ReadLines)
    Do
    $InfoDataLoad = InetGetInfo($GetData,0)
    GuiCtrlSetData($GesamtProgress,???)
    GuiCtrlSetData($EinzelProgress,???)
    Next
    EndSwitch
    WEnd

    [/autoit]

    Könnte mir da mal bitte jemand helfen? Danke im voraus.

    Gruß, Julien

  • Hallo Julien,

    so sollte es klappen:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>

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

    Global $aLines

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

    $GUI = GUICreate("Patcher", 615, 419, 192, 124)
    $GesamtProgress = GUICtrlCreateProgress(8, 312, 590, 25)
    $EinzelProgress = GUICtrlCreateProgress(8, 376, 590, 25)
    $ButtonPatchen = GUICtrlCreateButton("Patchen", 520, 16, 75, 25)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 520, 56, 75, 25)
    $LGesamtfortschritt = GUICtrlCreateLabel("Gesamtfortschritt", 8, 288, 83, 17)
    $LabelProzent = GUICtrlCreateLabel("Prozent", 104, 288, 40, 17)
    $LabelDownladdatei = GUICtrlCreateLabel("", 8, 352, 137, 17)
    $Prozen = GUICtrlCreateLabel("", 176, 352, 37, 17)
    GUISetState(@SW_SHOW)
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.16") ;sonst streiken manche Freehoster wenn der AutoItUseragent gesetzt ist

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonPatchen
    $PatchlistLoad = InetGet("http://white1991x.square7.ch/Patchlist.txt", @ScriptDir & "/Source.txt", 1, 0) ;wartet bsi fertig
    InetClose($PatchlistLoad)
    _FileReadToArray(@ScriptDir & "\Source.txt",$aLines)
    _ArrayDisplay($aLines)
    If StringInStr($aLines[$aLines[0]], 'Bytes Total : "') Then ;letzte Zeile enthält die Gesamtbytes
    $GesamtBytes = _StringBetween($aLines[$aLines[0]], 'Bytes Total : "', '"')
    Else
    $GesamtBytes = 0
    For $i = 1 To $aLines[0]
    $GesamtBytes += InetGetSize("http://white1991x.square7.ch/" & $aLines[$i])
    Next
    EndIf
    ; ConsoleWrite($GesamtBytes & @CRLF)
    $iDownloaded = 0
    For $i = 1 To $aLines[0]
    $iSize = InetGetSize($aLines[$i])
    $GetData = InetGet("http://white1991x.square7.ch/" & $aLines[$i], @ScriptDir & "\" & $aLines[$i], 1, 1) ;im Hintergrund
    Do
    $aInfo = InetGetInfo($GetData)
    GUICtrlSetData($GesamtProgress, $iDownloaded + $aInfo[0] / $GesamtBytes * 100)
    GUICtrlSetData($EinzelProgress, $aInfo[0] / $iSize * 100)
    Until $aInfo[2]
    $iDownloaded += $aInfo[0]
    InetClose($GetData)
    Next
    EndSwitch
    WEnd

    [/autoit]

    da ich eine sehr langsames INet habe, habe ich das Skript aber nicht komplett durchgetestet,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (21. Januar 2012 um 00:40)

  • Danke für deine schnelle Antwort und deine schnelle Hilfe.
    Also, ich habe es gerade mal getestet, jedoch läuft es nicht ganz so , wie es sein soll.
    1. Die Progressgeschichte läuft auch irgendeiner Art und Weise falsch.
    2. Bei der Source.txt wird alles in die erste Zeile geschrieben? Wieso das eigentlich, laut dem Autoit 3 Quellcode dürfte das eigentlich nicht sein oder?
    Gruß, Julien ;)

  • Hall Julien,

    ich habe das Skripz nch einmal geändert:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>

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

    Global $aLines, $sMsg, $sMsg2

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

    $GUI = GUICreate("Patcher", 615, 419, 192, 124)
    $GesamtProgress = GUICtrlCreateProgress(8, 312, 590, 25)
    $EinzelProgress = GUICtrlCreateProgress(8, 376, 590, 25)
    $ButtonPatchen = GUICtrlCreateButton("Patchen", 520, 16, 75, 25)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 520, 56, 75, 25)
    $LGesamtfortschritt = GUICtrlCreateLabel("Gesamtfortschritt", 8, 288, 590, 17)
    $LabelDownladdatei = GUICtrlCreateLabel("", 8, 352, 590, 17)
    GUISetState(@SW_SHOW)
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.16") ;sonst streiken manche Freehoster wenn der AutoItUseragent gesetzt ist

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonPatchen
    $PatchlistLoad = InetGet("http://white1991x.square7.ch/Patchlist.txt", @ScriptDir & "/Source.txt", 1, 0) ;wartet bsi fertig
    InetClose($PatchlistLoad)
    _FileReadToArray(@ScriptDir & "\Source.txt", $aLines)
    _ArrayDisplay($aLines)
    If StringInStr($aLines[$aLines[0]], 'Bytes Total : "') Then ;letzte Zeile enthält die Gesamtbytes
    $GesamtBytes = _StringBetween($aLines[$aLines[0]], 'Bytes Total : "', '"')
    Else
    $GesamtBytes = 0
    Dim $aFiles[$aLines[0] + 1][2]
    For $i = 1 To $aLines[0]
    If $aLines[$i] <> "" Then
    $aFiles[$i][0] = "http://white1991x.square7.ch/" & $aLines[$i]
    $aFiles[$i][1] = InetGetSize($aFiles[$i][0])
    $aFiles[0][1] += $aFiles[$i][1]
    EndIf
    Next
    EndIf
    $aFiles[0][0] = $aLines[0]
    _ArrayDisplay($aFiles)
    $iDownloaded = 0
    For $i = 1 To $aFiles[0][0]
    If $aFiles[$i][1] <> 0 Then
    $GetData = InetGet($aFiles[$i][0], @ScriptDir & "\" & $aLines[$i], 1, 1) ;im Hintergrund
    GUICtrlSetData($LabelDownladdatei, $aFiles[$i][0] & ": ")
    Do
    $aInfo = InetGetInfo($GetData)
    $iPercentAll = Round(($iDownloaded + $aInfo[0]) / $aFiles[0][1] * 100, 2)
    $iPercentCurrent = Round($aInfo[0] / $aFiles[$i][1] * 100, 2)
    GUICtrlSetData($GesamtProgress, $iPercentAll)
    GUICtrlSetData($EinzelProgress, $iPercentCurrent)
    GUICtrlSetData($LGesamtfortschritt, "Gesamtfortschritt: " & $iPercentAll & "%")
    GUICtrlSetData($LabelDownladdatei, $aFiles[$i][0] & ": " & $iPercentCurrent & "%")
    ConsoleWrite($iDownloaded + $aInfo[0] & " " & $aFiles[0][1] & " " & $iPercentAll & @TAB & $aInfo[0] & " " & $aFiles[$i][1] & " " & $iPercentCurrent & @CRLF)
    Sleep(1000)
    Until $aInfo[2]
    #cs
    [0]|4|11018458
    [1]|http://white1991x.square7.ch/Test2.txt|7345648
    [2]|http://white1991x.square7.ch/Test1.txt|3672810
    [3]|http://white1991x.square7.ch/Bytes Total : "11018458"|0
    #ce
    If $aInfo[3] Then ;wenn erfolgreich
    $iDownloaded += $aInfo[0]
    $sMsg &= $aFiles[$i][0] & @CRLF
    Else
    $sMsg2 &= $aFiles[$i][0] & @CRLF
    EndIf
    InetClose($GetData)
    EndIf
    Next
    if $sMsg <> "" Then MsgBox(64, "Download beendet","Folgende Dateien wurden erfolgreich heruntergeladen:" & @CRLF & @CRLF & $sMsg)
    if $sMsg2 <> "" Then MsgBox(16, "Download beendet","Folgende Dateien konnten nicht heruntergeladen werden:" & @CRLF & @CRLF & $sMsg)
    EndSwitch
    WEnd;### Tidy Error -> switch is never closed in your script.

    [/autoit]

    warum die Dateien bei mir nicht komplett heruntergeladen werden kann ich nicht nachvllziehen. Seltsamerweise wird aber kein Fehler erzeugt, jedenfalls ist Datei1.txt 815608 Bytes gross und nicht wie InetGetSize zurückliefert 3672810. Datei2.txt ist 801688 Bytes gross, InetGetsize liefert aber 7345648 Bytes als Grösse. Da die Summe der mit Inetgetsize zurückgegebenen Grössen die gleiche Grösse (11018458) ergeben die du ermittlelt hast gehe ich davon aus dass die Dateien fehlerhaft heruntergeladen werden.

    mfg autoBert

  • Danke, bei mir läuft es nun mit der Downloadprogress einwandfrei.

    Nun habe ich nur noch das Problem, das er den Text der Textdateien durcheinander bringt.

    Kann man dies noch irgendwie beheben?

    Mal ein Bild :

    [Blockierte Grafik: http://s7.directupload.net/images/120121/n2egzvyt.png]

    *Edit : Hätte da noch ein zweites kleines Problem :

    Auf der Webspace werden auch Ordner hochgeladen, wobei dann der Ordner in den ScriptDir Path heruntergeladen werden sollen. Dabei werden aber ja nicht die Dateien der Unterverzeichnisse aufgelistet mit Prozentanzeige. Gibt es da vielleicht auch noch eine Möglichkeit, wenn ich z.B. den Ordner " Test " auf meiner Webspace habe, dass davon ermittelt wird, welche Dateien sich in dem Ordner befinden , welche Größe sie haben und sie dann auch einzeln gedownloadet werden können? Ich habe mal den Ordner "Test" auf meine Webspace gepackt, die Gesamtbytesgeschichte müsste ich dann nachher noch bearbeiten.

    Einmal editiert, zuletzt von Julien (21. Januar 2012 um 09:56)

  • Hallo Julien,

    • öffne die Datei mit Scite oder mit Wrdpad, da wird sie richtig dargestellt.

    • ist über InetGet nicht möglich, ginge wohl mit FTP, falls du einen FTP-Account einrichten kannst, der in einem bestimmten Bereich nur Leserechte hat ist dies kein Problem. Wenn der Account allerdings Schreibrechte auf deinem Webspace hat kannst du die Idee ganz schnell vergessen, da ansnsten dein Account ganz schnell von jemand Fremden übernommen wird.
      Falls du dich mit FTP beschäftigen willst, schau dir dazu [autoit]
      _FTP_FileOpen
      _FTP_Connect
      _FTP_ListToArray2D
      _FTP_FileGet
      _FTP_Close
      [/autoit]aq.

    mfg autoBert

  • Es soll ein Patcher werden, also wäre es über einen FTP Server viel zu unsicher. Ich weiß, dass es geht mit den Ordnern, aber irgendwie komme bleibe ich wieder bei einem kleinen Problem stecken.

    Ich habe einen speziellen Uploader geschrieben, wodurch die Patchlist auf dem FTP Server erstellt wird.

    Könntest du dir mal bitte "Func _Addfolder" anschauen? Damit möchte ich, dass es später so wieder ausgelesen wird.

    Meine Probleme :

    1. Bei Func _ Addfolder schreibt er in $Edit3 immer eine 1 oder eine 11 dazwischen, welche dies alles versaut, da muss ich wohl ein Fehler irgendwo beim Splitten gemacht haben oder? Wenn ja, wie gehört es denn richtig?

    2. Bei Func_Add werden nur die Dateien in die Editbox geschrieben, welche ich beim ersten Mal ausgewählt habe. Wenn ich danach nochmal auf den selben Button drücke, dann beachtet er ausgewählten Dateien eigtl garnicht.

    Mein Script für den Uploader :

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiEdit.au3>
    #Include <FTPEx.au3>
    #include <File.au3>
    #include <Array.au3>
    $Form1 = GUICreate("Form1", 409, 442, 192, 124)
    $Edit1 = GUICtrlCreateEdit("", 16, 40, 265, 353)
    $Edit2 = GUICtrlCreateEdit("", 328, 208, 65, 41)
    $Edit3 = GUICtrlCreateEdit("", 504, 200, 105, 41)
    GUICtrlSetState(-1,$GUI_HIDE)
    $Uploadlist = GUICtrlCreateLabel("Uploadlist", 16, 8, 50, 17)
    $Dateiehinzufugen = GUICtrlCreateButton("Datei hinzufügen", 304, 40, 91, 25)
    $Upload = GUICtrlCreateButton("Upload", 112, 408, 75, 25)
    $Button1 = GUICtrlCreateButton("Button1", 312, 120, 75, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Upload
    _Upload()
    Case $Dateiehinzufugen
    _Add()
    Case $Button1
    _AddFolder()
    EndSwitch
    WEnd

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

    Func _Upload()
    $CountLine = _GUICtrlEdit_GetLineCount($Edit2)
    For $i = 0 To $CountLine Step +1
    $ReadLine = _GUICtrlEdit_GetLine($Edit2,$i)
    $ReadLine2 = _GUICtrlEdit_GetLine($Edit1,$i)
    $OpenFtp = _FTP_Open('ee')
    If @Error Then
    MsgBox(64,"Fehler","_Ftp_Open")
    EndIf
    $Servername = '' ; Hier würde normalerweise mein vollständiger Servername stehen.
    $Benutzername = '' ; Hier würde normalerweise mein Benutzername stehen.
    $Passwort = '' ; Hier würde normalerweise mein Passwort stehen.
    $FtpConnect = _FTP_Connect($OpenFtp,$Servername,$Benutzername,$Passwort)
    _FTP_FilePut($FTPConnect,$ReadLine,"/" & $ReadLine2)
    If @Error Then
    Exit
    EndIf
    _FTP_Close($OpenFtp)

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

    Next
    EndFunc

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

    Func _Add()
    Global $sFiles = FileOpenDialog("Titel","C:\", "Alle (*.*)", 7) ; File Open Dialoge öffnen
    If @error Then Exit ; ist ein Fehler aufgetreten? wenn ja Exit
    Global $aFiles = StringSplit($sFiles, "|", 2) ; trenne den String der vom FileOpenDialoge übergeben wird immer bei '|' WICHTIG:(Diese Funktion gibt ein ARRAY zurück)
    For $i = 1 To UBound($aFiles) -1 ; Schleife von 1 bis Anzahl der Einträge im Array $aFiles
    _GUICtrlEdit_AppendText($Edit1,$aFiles[$i] & @CRLF)
    $aFiles[$i] = $aFiles[0] & "\" & $aFiles[$i] ;Array anpassen $aFiles [$i = reihe im Array] = $aFiles[0] = Base Pfad zum Ordner &'\'& $aFiles[$i] = Dateinamen; String mit der sich im Array $aFiles befindet mit dem Platz [$i] an die Editbox anhängen.
    _GUICtrlEdit_AppendText($Edit2,$aFiles[$i] & @CRLF)
    Next ; und noch eine Runde
    EndFunc

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

    Func _AddFolder()
    $aOrdner = FileSelectFolder("Bitte wählen sie einen Ordner, welchen sie uploaden möchten.","C:\") ; File Open Dialoge öffnen
    If @error Then Exit ; ist ein Fehler aufgetreten? wenn ja Exit
    $Foldername = StringRegExpReplace($aOrdner, '.+\\(.+)', '$1')
    _GUICtrlEdit_AppendText($Edit1,$Foldername & @CRLF)
    $FileList = _FileListToArray($aOrdner)
    For $i = 1 To UBound($FileList) -1
    $FileList[$i] = $FileList[0] & "\" & $FileList[$i]
    _GUICtrlEdit_AppendText($Edit3,'Folder : "' & $Foldername & $FileList[$i] & '"|' & 'Dateiname : "' & $FileList[$i] & '"' & @CRLF)
    Next
    MsgBox(64,"",GuiCtrlRead($Edit3))
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von Julien (21. Januar 2012 um 17:55)

  • Hallo Julien,

    dein Konzept kann nicht funktionieren:

    • Bei der func _add speciherst du nur die Dateinamen, zum uploaden benötigst du aber den kompletten lkalen Pfad. Die Auswahl einer einzigen Datei funktioniert auch nicht. Wie man bei FilepenDialog zwischen Einfach- und Mehrfachauswahl unterscheiden und beides behandeln kann habe ich in [Beispiel] BMP-, GIF- & JPG-Viewer demonstriert. Desweiteren zeigt dieses Beispiel wie man die Pfade für den Benutzer unsichtbar in einer Listview speichert.
    • Bei der func _addfolder lässt du nur Laufwerk c: zu. Dein Fehler ist $FileList[0] enthält die Anzahl der gefundenen Dateien, anstelle dessen müsstest du "c:\" & $Foldername verwenden. Besser nch du lässt alle LW zu und nimmst den LW-Buchstaben nch mit in Foldername auf.

    mfg autoBert

  • Habe es mal versucht, es aber nicht hinbekommen. ;(
    Würdest du für mich die Sache und vielt noch 2-5 andere Sache, bei denen ich verzweifel für etwas Geld in Form eines Amazon Gutscheins oder einer Paysafecard für mich schreiben?
    Habe nun schon soviele Bilder, etc. für dieses Tool erstellt und und es jetzt aufzugeben, wäre sehr ärgerlich für mich.