Что нового

InetGet в цикле

zoxer1

Знающий
Сообщения
72
Репутация
6
Здравствуйте.

С одного сайта хочу скачать обновления для Windows2003. Хочу написать скрипт, чтоб проверял уже скачанные файлы, скачивал отсутвующие файлы с показом прогресса скачивания файла. С форума выдрал из разных скриптов куски и вот что получилось

Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <Array.au3>
#include <File.au3>
#include <GDIpProgress.au3>

Global $item_col = 0
Dim $aFiles
Dim $upd_list

$ListFile = @ScriptDir & "\upd_list.txt"
$hGUI = GUICreate('Обновления Windows2003', 500, 350)
$StatusBar1 = _GUICtrlStatusBar_Create($hGUI)
$Button1 = GUICtrlCreateButton("Button1", 392, 296, 75, 25)
;~ $Progress1 = GUICtrlCreateProgress(8, 312, 374, 16)
$hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 494, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))

$sID = _ProgressCreate(8, 312, 374, 16)
_ProgressSetText($sID, "%P%%")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Обновление", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Размер", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Ссылка", 100)

$sUrl = 'http://pw.bafa.ru/update_win2003.shtml'
$sHTML = BinaryToString(InetRead($sUrl))
$count = StringInStr($sHTML, "Исправления после Windows Server 2003 SP2 (английская версия)")
$result = StringTrimLeft($sHTML,$count)
_get_upd_list()
;~ _FileReadToArray($ListFile, $upd_list)
ConsoleWrite($sHTML)
$aLinks = StringRegExp($result, '["''](http://download.microsoft.com.*?)["'']', 3)
$aNames = StringRegExp($result, '([0-9].*)</a>
', 3)
$aSize = StringRegExp($result, '\(([0-9].*)\)<.*', 3)
;~ $test=StringRegExp($test, '([0-9].*)</a>
', 3) ; Названия
;~ $test=StringRegExp($test, '\((.*)\)</td>', 3) ; размер
;~ $test=StringRegExp($test, '(?s).*?http://.*/(.*)', 3)

for $i = 0 To UBound($aLinks)-1
	
	$temp = StringRegExpReplace($aLinks[$i], '(?s).*?http://.*/(.*)', '\1')
;~ 	MsgBox(0,"",$temp)
	$find = _ArraySearch($aFiles, $temp)
	If $find == -1 Then 
		$item_col = 0
	Else 
		$item_col = 1
	EndIf
	_GUICtrlListView_AddItem($hListView, $aNames[$i], $item_col)
	_GUICtrlListView_AddSubItem($hListView, $i, $aSize[$i], 1)
	_GUICtrlListView_AddSubItem($hListView, $i, $aLinks[$i], 2)
Next

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_exit()

		Case $Button1
			_download("http://download.microsoft.com/download/E/D/7/ED71C471-3229-4120-B9E3-F6B03D7D3714/WindowsServer2003-KB2508429-x86-ENU.exe", "WindowsServer2003-KB2508429-x86-ENU.exe")
		EndSwitch
		
		
WEnd

Func _download($url, $fname)
$hDownload = InetGet($url, @ScriptDir & "\Updates\_" & $fname, 1, 1)
	Do
Sleep(250)
Local $aData = InetGetInfo($hDownload)
	$compleate=InetGetInfo( $hDownload,1)
	$status=InetGetInfo( $hDownload,0)
	$percent=Round($aData[0]/$aData[1]*100, 0)
	
	If $percent >= 0 Then
		_ProgressSet($sID, $percent)
	EndIf
Until InetGetInfo($hDownload, 2)    ; Check if the download is complete.
_FileRename( @ScriptDir & "\Updates\_" & $fname, $fname)
EndFunc


_FileRename($path, $newname); Переименование
Func _FileRename($sPath, $sNewFileName)
    $aPath = StringSplit($sPath, '\'); 
    $sFileName = $aPath[$aPath[0]]; Нахождение названия файла
    $iLen = StringLen($sFileName); Вычисление длины названия файла
    $sFileFolder = StringTrimRight($sPath, $iLen); Нахождение папки, которая содержит файл
    $sPath_new = $sFileFolder & $sNewFileName; Задание нового пути файла (та же папка, но другое название)
    FileMove($sPath, $sPath_new); Перемещение файла внутри одной папки = переименование файла
EndFunc

Func _exit()
	Exit
EndFunc

Func _get_upd_list()
	$aFiles = _FileListToArray(@ScriptDir & '\Updates', '*.exe', 1)
	For $i = 0 To UBound ($aFiles) - 1
		$find = StringRegExp($aFiles[$i], "_.*")
;~ 		MsgBox(0,"",$find)
		If $find == 1 Then
			FileDelete(@ScriptDir & '\Updates\' & $aFiles[$i])
		EndIf		
	Next
	$aFiles = _FileListToArray(@ScriptDir & '\Updates', '*.exe', 1)
	_ArrayDisplay($aFiles)
EndFunc
ссылки на файлы в массиве $aLinks
список уже скачанных файлов в массиве $aFiles
Пока поставил, чтоб скачивался только 1 файл.

Теперь встает один вопрос. Как сделать Скачивание файлов по очереди один за другим после нажатия Кнопки?

P.S.: Как вычислить общий размер файлов которые надлежит скачиванию? (все "красные" файле, которые выдаст в ListView скрипт)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
У тебя есть массив ссылок вот и делай для него цикл:
Код:
Case $Button1
	For $i = 0 To UBound($aLinks) - 1
		_download($aLinks[$i], $aFiles[$i])
	Next
EndSwitch

Если тебе нужно именно друг за другом, а не как у тебя одновременное скачивание, то убери из
Код:
InetGet($url, @ScriptDir & "\Updates\_" & $fname, 1, 1)

последнюю единицу, чтобы функция ожидала окончания скачивания.

А для определения размера файла используй это:
Код:
InetGetSize($aLinks[$i])
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Спасибо за ответ.
Но все же я имел ввиду как скачать именно отсутвующие файлы? Сделать еще один массив $aToDownload например и ставить там 1 или 0, потом пробегатся по нему и где равно 1 скачивать?

Код:
Dim $aToDownload
For $i=0 To UBound($aToDownload)-1
	if $aToDownload[$i] == 1 Then
		InetGet($alinks[$i], @ScriptDir & "\Updates\_" & $fname, 1, 1)
	EndIf
Next


Как узнать Общий объем файлов, которые будут скачиваться? :scratch: пробежатся циклом по ссылкам InetGetSize'ом и потом сложить? Если да, то как это отразится на скорости выполнения скрипта?
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
пробежатся циклом по ссылкам InetGetSize'ом и потом сложить? Если да, то как это отразится на скорости выполнения скрипта?
У меня при пинге 10ms. Идет 9 сек на 100 файлов.


Сделать еще один массив $aToDownload например и ставить там 1 или 0, потом пробегатся по нему и где равно 1 скачивать?
Можно так. А можно например проверять через
Код:
FileExists()
проверять существует ли такой файл... и желательно через
Код:
FileGetSize()
сверять его размер... (на случай если не докачен)
 
Верх