Hallo com,
bin gearde dabei das Grundgerüst für einen Downloader zu schreiben. Ja ich weiß gibt es schon viele, aber dieser lädt mehrere Dateien gleichzeitig parallel herunter. Gibt es warscheins auch schon ein paar.
Leider macht mir meine Internetverbindung (max. 64 kBit/s) beim Testen einen Strich durch die Rechnung bzw. weiß ich nicht ob Fehler im Skript vorliegen oder alles mit den abgebrochenen DL's zu erklären ist. Wäre also nett wenn der ein oder andere dies kurz testen könnte:
#include <WinAPI.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <Array.au3>
Opt('MustDeclareVars', 1)
Global $iWatch
Global $sLocalPath = @ScriptDir & "\TestDLs\"
If Not FileExists($sLocalPath) Then DirCreate($sLocalPath)
Global $aFiles[5][6] ;zeile 0 für Gesamtgrösse Spalten 2=Grösse aller DownLoaddateien, 3=bereits downheloaded, 4 Bytes durch Neustart verworfen,
;danach Spalten 0=URL, 1=Lokaler Pfad, 2=DL-Grösse,3=DL-Bytes , 4=DL-Handle, 5=Fehler Anzahl
Global $aData[1]
Global $aKBs[10]
$aFiles[0][0] = 4 ;Anzahl der Downloads
$aFiles[1][0] = "http://download.bleepingcomputer.com/Xplode/AdwCleaner.exe"
$aFiles[1][1] = "AdwCleaner.exe"
$aFiles[2][0] = "http://download.iobit.com/action-center/asc920-0330.exe"
$aFiles[2][1] = "Advanced_SystemCare.exe"
$aFiles[3][0] = "http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe"
$aFiles[3][1] = "DrWeb-CureIt.exe"
$aFiles[4][0] = "http://data-cdn.mbamupdates.com/web/JRT.exe"
$aFiles[4][1] = "JRT.exe"
Dim $hGUI_c[$aFiles[0][0] + 2]
Dim $idprgInfo[$aFiles[0][0] + 2]
Dim $idlblInfo[$aFiles[0][0] + 2]
Global $msg, $sLblText, $tdStart
Global $hGuiMain = GUICreate("Multi-Downloader 0.4.0.3", 325, 250)
Global $button = GUICtrlCreateButton("Start", 5, 20, 70, 20)
Global $Display = GUICtrlCreateButton("Debug", 5, 70, 70, 20)
Global $idlblKBs = GUICtrlCreateLabel('', 95, 45, 230, 60)
GUICtrlSetFont(-1, 15, 800)
For $i = 1 To $aFiles[0][0] + 1
If $i = $aFiles[0][0] + 1 Then
$sLblText = 'Gesamt'
Else
$sLblText = $aFiles[$i][1]
EndIf
_MakeDLPanel($i, $sLblText)
GUISwitch($hGuiMain)
Next
GUISetState()
Func _MakeDLPanel($iNo, $sText)
$idprgInfo[$iNo] = GUICtrlCreateProgress(8, 70 + $iNo * 30, 310, 30)
$hGUI_c[$iNo] = GUICreate("", 309, 30, 8, 70 + $iNo * 30, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TRANSPARENT, $WS_EX_MDICHILD), $hGuiMain)
GUISetBkColor(0x989898, $hGUI_c[$iNo])
GUICtrlCreateLabel($sText, 0, 8, 220, 25, $ES_LEFT)
GUICtrlSetFont(-1, 12, 1000)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$idlblInfo[$iNo] = GUICtrlCreateLabel("", 221, 8, 90, 25, $ES_RIGHT)
GUICtrlSetFont(-1, 12, 1000)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
_WinAPI_SetLayeredWindowAttributes($hGUI_c[$iNo], 0x989898)
GUISetState(@SW_SHOWNA, $hGUI_c[$iNo])
EndFunc ;==>_MakeDLPanel
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $Display
_ArrayDisplay($aFiles)
Case $button
$tdStart=TimerInit()
For $i = 1 To $aFiles[0][0]
;$aFiles[$i][2] = InetGetSize($aFiles[$i][0],1)
$aFiles[$i][4] = InetGet($aFiles[$i][0], $sLocalPath & $aFiles[$i][1], 1, 1)
Next
AdlibRegister('_WatchDL', 1000)
_ArrayDisplay($aFiles)
EndSwitch
WEnd
Func _WatchDL()
;Local Static $iOld
Local $iDiff
Local $nPercent
$iWatch += 1
If $iWatch > $aFiles[0][0] Then $iWatch = 1
If $aFiles[$iWatch][4] > 0 Then
$aData = InetGetInfo($aFiles[$iWatch][4], -1)
If @error Then
ConsoleWrite(@error & @TAB & @extended & @CRLF)
Return
EndIf
If $aFiles[$iWatch][2] = 0 Then
$aFiles[$iWatch][2] = $aData[1] ;Downloadgrösse ermitteln
$aFiles[0][2] += $aFiles[$iWatch][2] ;und auch zur Gesamtdownloadgrösse hinzuzählen
EndIf
$nPercent = Round($aData[0] / $aFiles[$iWatch][2] * 100, 1)
$nPercent = StringReplace($nPercent, '-1.#IND', '')
$aFiles[$iWatch][3] = $aData[0]
GUICtrlSetData($idprgInfo[$iWatch], Int($nPercent))
GUICtrlSetData($idlblInfo[$iWatch], _FormatString($nPercent))
If $aData[2] Then
If $aData[3] Then
InetClose($aFiles[$iWatch][4])
$aFiles[$iWatch][4] = 'Erfolg'
GUICtrlSetData($idprgInfo[$iWatch], 100)
Else
$aFiles[$iWatch][5] += 1
If $aFiles[$iWatch][5] < 10 Then
$aFiles[$iWatch][4] = InetGet($aFiles[$iWatch][0], $sLocalPath & $aFiles[$iWatch][1], 1, 1)
$aFiles[0][4]+=$aFiles[$iWatch][3]
Else
$aFiles[0][2] -= $aFiles[$iWatch][2]; von gesamt DL-größe abziehen
$aFiles[$iWatch][2] = 0
$aFiles[$iWatch][3] = 0
$aFiles[$iWatch][4] = 'Abbruch'
GUICtrlSetData($idprgInfo[$iWatch], 0)
GUICtrlSetData($idlblInfo[$iWatch], 'Abbruch')
EndIf
EndIf
EndIf
$aFiles[0][3] = 0
For $iWatch = 1 To $aFiles[0][0]
$aFiles[0][3] += $aFiles[$iWatch][3]
Next
#cs
If $aFiles[0][3] <> 0 Then $iDiff = $iOld - $aFiles[0][3]
_ArrayPush($aKBs, $iDiff)
Local $iKBs = 0
For $i = 0 To UBound($aKBs) - 1
$iKBs += $aKBs[$i]
Next
$iKBs = Round($iKBs / 10240, 2)
GUICtrlSetData($idlblKBs, _FormatString($iKBs, 'KByte/sec'))
$iOld=$aFiles[0][3]
#ce
Local $iElapsed=TimerDiff($tdStart)/1000
Local $iKBs = Round(($aFiles[0][3]+$aFiles[0][4]) / $iElapsed/1024, 1)
GUICtrlSetData($idlblKBs, _FormatString($iKBs, 'KByte/sec'))
$nPercent = Round($aFiles[0][3] / $aFiles[0][2] * 100, 1)
$nPercent = StringReplace($nPercent, '-1.#IND', '')
GUICtrlSetData($idprgInfo[$iWatch], Int($nPercent))
GUICtrlSetData($idlblInfo[$iWatch], _FormatString($nPercent))
EndIf
Local $bWorking = False
For $i = 1 To $aFiles[0][0]
$bWorking = ($aFiles[$i][4] > 0)
If $bWorking Then ExitLoop
Next
If Not $bWorking Then
_ArrayDisplay($aFiles, 'Downloads beendet')
AdlibUnRegister('_WatchDL')
EndIf
EndFunc ;==>_WatchDL
Func _FormatString($number, $sExt = '% ')
If Not StringInStr($number, '.') Then $number &= '.0'
If $number = '.0' Then $number = '0.0'
Return StringReplace(StringFormat("%8s " & $sExt, $number), '.', ',')
EndFunc ;==>_FormatString
Alles anzeigen
am Schluß sollte ein ArrayDisplay erscheinen, diese Daten bitte kopieren und hier posten. Vorschläge werden auch noch dankend angenommen. Das Skript ist derzeit im Proof of Concept Stadium also nicht zu streng bei evtl. Kritik
vielen Dank im voraus und weiterhin ein schönes Wochenende
(auto)Bert