Что нового

Как осуществить проверку функции в самой функции?

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.
Использую AutoIt: v.3.3.8.1

Есть функция загрузки файла:
Код:
Func _1()
   GUISetState(@SW_HIDE)
   ProgressOn('Скачивание файла', 'Файл проверки', '0 %', -1, -1, 18)
$hDownload = InetGet('http://www.autoitscript.com/autoit3/files/beta/update.dat', @ScriptDir & '\update.dat', 1, 1)
Do
    If InetGetInfo($hDownload, 1) Then
        $iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & _
                ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
    EndIf
    Sleep(500)
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
ProgressOff()
EndFunc


Как правильно включить в неё проверку размера скаченного файла:
Код:
$InetSize = InetGetSize("http://www.autoitscript.com/autoit3/files/beta/update.dat", 1)
$FileSize = FileGetSize(@ScriptDir & "\update.dat")
If $InetSize > $FileSize Then
InetGet('http://www.autoitscript.com/autoit3/files/beta/update.dat', @ScriptDir & '\update.dat', 1, 1)
EndIf

И что-бы если > то функция с прогрессбаром исполнялась еще раз?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
может просто делать проверку на разность в размере файла на сервере и файла дома..если есть изменения, тогда качать. или я не так понял?

Код:
Func _1()
   GUISetState(@SW_HIDE)
   $InetSize = InetGetSize("http://www.autoitscript.com/autoit3/files/beta/update.dat", 1)
$FileSize = FileGetSize(@ScriptDir & "\update.dat")
If $InetSize > $FileSize Then
	MsgBox(0,'','качаю обновление',2)
   ProgressOn('Скачивание файла', 'Файл проверки', '0 %', -1, -1, 18)
$hDownload = InetGet('http://www.autoitscript.com/autoit3/files/beta/update.dat', @ScriptDir & '\update.dat', 1, 1)
Do
    If InetGetInfo($hDownload, 1) Then
        $iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & _
                ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
    EndIf
    Sleep(500)
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
ProgressOff()
Else
	MsgBox(0,'','обновления нет')
	EndIf
EndFunc

хотя, если в файле update.dat изменилось только несколько цифр без добавления, то размер будет один и тот же
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Я хотел осуществить это проверку потому, что иногда загрузка обрывается и файл загружается не до конца.
Примерно я себе это представляю так:

Код:
Функция_1()
Загрузка файла
Проверка его размера (может лучше хэш сумма?)
Если совпало, то конец функции
Если не совпало, то Функция _1() с начала
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
загрузка какого файла? update.dat весит байты.
чтобы проверить хеш нужно скачать. это лишнее телодвижение. особенно при нестабильном инете.
в предыдущем посте идет проверка размера файла , который на сервере в инете с файлом у тебя на компе. разница в размере есть, значит идет обновление. чего вообще ты хочешь добиться ?ведь ты привел часть скрипта
с другой стороны: в файле update.dat есть размер файла. можно качать update.dat , считывать размер, если есть изменения, то качать программу. считывание функцией
Код:
IniRead

так как запись в update.dat имеет все условия для работы этой функции
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
joiner
На счет хэша понятно. Это точно мне не нужно. А насчет чего хочу, хочу добиться докачки при разрыве. Вот таким странным способом, ибо придумать лучший способ пока не получается. Кроме как:

Код:
Функция_1()
Загрузка файла
Проверка его размера (может лучше хэш сумма?)
Если совпало, то конец функции
Если не совпало, то Функция _1() с начала

Но как реализовать это тоже пока придумать не могу.
Вернее не пойму как запустить функцию с начала при несовпадении сумм.
Изначальное условие это отсутствие файла который в интернете (в данном случае update.dat)
Т.е. Я запускаю скрипт, скрипт закачивает файл, идет проверка по размеру, и в зависимости от результата следуют действия.
Получа6тся основная задача это организовать докачку при разрыве.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Привел к такому виду, на примере Др.Веб

Код:
Func _1()
GUISetState(@SW_HIDE)
ProgressOn('Скачивание файла', 'Dr.WEB-CureIt', '0 %', -1, -1, 18)
	$hDownload = InetGet('http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe', @ScriptDir & '\drweb-cureit.exe', 1, 1)
Do
    If InetGetInfo($hDownload, 1) Then
        $iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
	EndIf
    Sleep(500)
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
ProgressOff()

$InetSize = InetGetSize("http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe", 1)
$FileSize = FileGetSize(@ScriptDir & "\drweb-cureit.exe")
If $InetSize > $FileSize Then
InetGet('http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe', @ScriptDir & '\drweb-cureit.exe', 1, 1)
EndIf

EndFunc


Но все ровно как-то коряво и вопрос остался, как при проверке размера в случае несовпадении суммы запустить функцию заново.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
ivsatel
Ну так запусти ее заново :smile: Это рекурсией называется :smile:
Код:
Func _1()
GUISetState(@SW_HIDE)
ProgressOn('Скачивание файла', 'Dr.WEB-CureIt', '0 %', -1, -1, 18)
    $hDownload = InetGet('http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe', @ScriptDir & '\drweb-cureit.exe', 1, 1)
Do
    If InetGetInfo($hDownload, 1) Then
        $iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
    EndIf
    Sleep(500)
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
ProgressOff()

$InetSize = InetGetSize("http://download.geo.drweb.com/pub/drweb/cureit/drweb-cureit.exe", 1)
$FileSize = FileGetSize(@ScriptDir & "\drweb-cureit.exe")
If $InetSize <> $FileSize Then
 _1()
EndIf
EndFunc
 
Верх