[Beispiel] mini-Downloader

  • Angeregt durch https://autoit.de/index.php?page…8348#post238348 habe ich einmal ein kleines Beispielskript eines einfachen Downloaders erstellt:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page…4341#post164341

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

    Skriptbeispiel für den Umgang mit INI-Files und ComboBox
    #ce ----------------------------------------------------------------------------

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiComboBox.au3>
    #include <StaticConstants.au3>
    ;#include <Array.au3>

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

    Const $sElect = "bitte einen Download auswählen"
    Global $sUrl ;ausgewählte DownloadUrl
    Global $sIni = @ScriptDir & "\Download.INI" ;Pfad zur Inidatei
    Global $sLocalFolder ;letztes Verzeichnis in das gespeichert wurde
    Global $aData[3] ;Download-Infos
    Global $iFileSize ;Grösse des DL-Files
    Global $tStart ;Download gestartet
    Global $nKBPerSec ;KB pro Sekunde
    Global $iPercent ;aktuell heruntergeladenen Prozentanteil der Datei

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

    If Not FileExists($sIni) Then
    $sData = "AutoIt 3.3.6.1=http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe" & @LF
    $sData &= "AutoIt Beta=http://www.autoitscript.com/autoit3/files/beta/autoit/autoit-v3.3.7.20-beta-setup.exe" & @LF
    $sData &= "Scite=http://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe" & @LF
    $sData &= "dt. Hilfe=http://translation.autoit.de/autoitinfo/hilfedateien/AutoIt-Hilfe-Deutsch-3.3.6.1-Stand-27_05_11.zip" & @LF
    $sData &= "Organize Includes=http://www.autoitscript.com/forum/index.php?app=core&module=attach&section=attach&attach_app=core&module=attach&section=attach&attach_id=29947" & @LF
    IniWriteSection($sIni, "URLs", $sData)
    EndIf

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

    $hGui = GUICreate("mini-Downloader", 300, 105, 302, 218)
    $idcboProg = GUICtrlCreateCombo("", 8, 8, 200, 25)
    $idbtnAdd = GUICtrlCreateButton("&Hinzufügen", 213, 8, 80)
    $idbtnDel = GUICtrlCreateButton("&Löschen", 213, 35, 80)
    $idprgInfo = GUICtrlCreateProgress(8, 70, 285, 30)
    GUICtrlSetState(-1, $GUI_HIDE)
    $idlblInfo = GUICtrlCreateLabel("", 2, 72, 282, 25, $ES_CENTER)
    GUICtrlSetFont(-1, 14, 2000)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetState(-1, $GUI_HIDE)
    $idbtnDL = GUICtrlCreateButton("&Downloaden", 8, 35, 200)
    GUICtrlSetState($idbtnDL, $GUI_DISABLE)
    read_INI()
    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
    IniWrite($sIni, "Path", "Local", $sLocalFolder)
    Exit
    Case $idbtnAdd
    $write1 = InputBox("Downloadadresse", "Bitte eine gültige Download-Adresse eingeben")
    If $write1 <> "" Then
    $write2 = InputBox("Download verwalten unter", "Bitte Kurzbegriff eingeben")
    If $write2 <> "" Then IniWrite($sIni, "URLs", $write2, $write1)
    GUICtrlSetData($idcboProg, $write2, $write2)
    EndIf
    get_Selection()
    Case $idbtnDel
    $sDel = GUICtrlRead($idcboProg)
    IniDelete($sIni, "URLs", $sDel)
    GUICtrlSetData($idcboProg, "")
    read_INI()
    Case $idcboProg
    get_Selection()
    Case $idbtnDL
    ;get_Selection()
    $bCanceld = False
    GUICtrlSetData($idbtnDL, "Download &abbrechen")
    $aDatei = StringSplit($sUrl, "/")
    $sDatei = $aDatei[$aDatei[0]]
    $sLocal = FileSaveDialog($sDatei & "Speichern unter", $sLocalFolder, "Alle (*.*)", 18, $sDatei, $hGui)
    If Not @error Then
    GUICtrlSetState($idprgInfo, $GUI_SHOW)
    GUICtrlSetState($idlblInfo, $GUI_SHOW)
    GUICtrlSetData($idlblInfo, "Download startet")
    $aTmp = StringSplit($sLocal, "\")
    $sLocalFolder = $aTmp[$aTmp[1]]
    $iFileSize = InetGetSize($sUrl)
    $hDL = InetGet($sUrl, $sLocal, 1, 1)
    $tStart = TimerInit()
    $aData[0] = 0
    Do
    $bCanceld = _MySleep(250)
    If $bCanceld Then ExitLoop
    $aData = InetGetInfo($hDL, -1)
    If $aData[0] > 0 Then
    $tDiff = TimerDiff($tStart)
    $nKBPerSec = Round($aData[0] / $tDiff * 1000 / 1024, 2)
    $iPercent = Round($aData[0] / $iFileSize * 100, 2)
    If GUICtrlRead($idlblInfo) <> $iPercent Then
    GUICtrlSetData($idprgInfo, $iPercent)
    GUICtrlSetData($idlblInfo, $iPercent & " % " & $nKBPerSec & " KB/sec")
    WinSetTitle($hGui, "", "DL: " & $sDatei & " " & $iPercent & "%")
    EndIf
    EndIf
    Until $aData[2]
    InetClose($hDL)
    ;_ArrayDisplay($aData)
    If $aData[0] < $aData[1] Then $aData[3] = False ;dummerweise werden nur DL-Fehler auf meiner Seite erkannt es kommt aber vo das der DL aus anderen Gründen nicht erfolgreich war
    If $aData[0] < $iFileSize Then $aData[3] = False ;dummerweise werden nur DL-Fehler auf meiner Seite erkannt es kommt aber vo das der DL aus anderen Gründen nicht erfolgreich war
    If Not $aData[3] Then
    If $bCanceld Then
    $sMsg = "Download wurde durch Benutzer abgebrochen"
    Else
    $sMsg = "Download hat abgebrochen," & @CRLF & "überprüfen sie Ihre Internetverbindung." & @CRLF & @CRLF & "Probieren Sie danach noch einmal!"
    EndIf
    MsgBox(48, "Fehler:", $sMsg)
    FileDelete($sLocal)
    Else
    GUICtrlSetState($idbtnDL, $GUI_DISABLE)
    GUICtrlSetData($idcboProg,$sElect,$sElect)
    MsgBox(64, $sLocal, "erfolgreich heruntergeladen")
    EndIf
    Else
    MsgBox(48, "Fehler:", "keinen Namen zum Speichern ausgeählt")
    EndIf
    GUICtrlSetData($idprgInfo, 0)
    GUICtrlSetData($idlblInfo, 0)
    GUICtrlSetState($idlblInfo, $GUI_HIDE)
    GUICtrlSetState($idprgInfo, $GUI_HIDE)
    GUICtrlSetData($idbtnDL, "&Downloaden")
    WinSetTitle($hGui, "", "mini-Downloader")
    EndSwitch
    WEnd

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

    Func _MySleep($iMSec)
    Local $nMsg, $dt = TimerInit()
    Do
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idbtnDL
    Return 1; DL Abbrechen wurde gedrückt
    EndSwitch
    Sleep(10)
    Until TimerDiff($dt) > $iMSec
    EndFunc ;==>_MySleep

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

    Func read_INI()
    $list1 = IniReadSection($sIni, "URLs")
    ;ConsoleWrite($list1 & @CRLF)
    If IsArray($list1) Then
    For $i = 1 To $list1[0][0]
    GUICtrlSetData($idcboProg, $list1[$i][0])
    Next
    EndIf
    _GUICtrlComboBox_InsertString($idcboProg, $sElect, 0)
    _GUICtrlComboBox_SetCurSel($idcboProg, 0)
    $sLocalFolder = IniRead($sIni, "Path", "Local", @ScriptDir)
    EndFunc ;==>read_INI

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

    Func get_Selection()
    If GUICtrlRead($idcboProg) = $sElect Then
    GUICtrlSetState($idbtnDL, $GUI_DISABLE)
    GUICtrlSetData($idlblInfo, "")
    Else
    GUICtrlSetState($idbtnDL, $GUI_ENABLE)
    $Prog = GUICtrlRead($idcboProg)
    ;ConsoleWrite("ausgewählt: " & $Prog & @CRLF)
    $sUrl = IniRead($sIni, "URLs", $Prog, "")
    EndIf
    EndFunc ;==>get_Selection

    [/autoit]

    Die vorbelegten Dateien in der INI sollten sich alle Anfänger herunterladen. Ich weis dass man dies mit einer Listview viel schöner lösen kann aber wie gesagt aufgrund des o.g. Themas habe ich diese Beispiel auf Basis einer Combobox geschrieben. Wenn man anstatt einer Combo ein List erstellt funktioniert das Skript genauso. Profis wundern sich vielleicht über die Zeilen 105 u. 106, dies ist ein Workaround da InetGetInfo nicht immer den korrekten Status ob der DL erfolgreich war zurückgibt.

    Hier noch ein ScreenShot: autoit.de/wcf/attachment/14493/

    Falls jemanden der Skriptaufbau bekannt vorkommt, richtig es ist aus meinem Mini-Urlmanager abgeleitet.

    Edits: Link dieses Themas in Skript eingefügt. AutoIt-Tag korrigiert, Dem Kind einen anderen Namen gegeben, kleine Schönheitskorrekturen im Skript (Variablennamen, eine überflüssige Zeile entfernt, nach erfolgreichem DL wird DL-Button gesperrt und die "bitte wählen"-Aufforderung erscheint in der ComboBox)

    mfg autoBert

  • Danke AutoBert habe einen Loader mit einen List gemacht und einen anderen mit einer Combo . Combo finde ich doch besser da sie mehr Platz spart ! Klein aber Fein :P