Что нового

[Сеть, интернет] Как вытащить колво скачанных байт из _FTP_SetStatusCallback

moonshiner

Новичок
Сообщения
4
Репутация
0
Беру файлы с FTP через _FTP_FileGet, нужно показывать прогресс в GUI

Бьюсь над данной проблемой, в мануале есть только один пример

Код:
#include <FTPEx.au3>
#include <Debug.au3>

_DebugSetup(StringTrimRight(@ScriptName, 4) & ' example', True)

Local $server = 'ftp.mozilla.org'
Local $username = ''
Local $pass = ''

Local $Open = _FTP_Open('MyFTP Control')
Local $Callback = _FTP_SetStatusCallback($Open, 'FTPStatusCallbackHandler')

Local $Conn = _FTP_Connect($Open, $server, $username, $pass, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0, $Callback)

Local $Ftpc = _FTP_Close($Open)

Func FTPStatusCallbackHandler($hInternet, $dwContent, $dwInternetStatus, $lpvStatusInformation, $dwStatusInformationLength)
    #forceref $hInternet, $dwContent
    If $dwInternetStatus = $INTERNET_STATUS_REQUEST_SENT Or $dwInternetStatus = $INTERNET_STATUS_RESPONSE_RECEIVED Then
        Local $Size, $iBytesRead
        $Size = DllStructCreate('dword')
        _WinAPI_ReadProcessMemory(_WinAPI_GetCurrentProcess(), $lpvStatusInformation, DllStructGetPtr($Size), $dwStatusInformationLength, $iBytesRead)
        _DebugOut(_FTP_DecodeInternetStatus($dwInternetStatus) & ' | Size = ' & DllStructGetData($Size, 1) & ' Bytes    Bytes read = ' & $iBytesRead)
    Else
        _DebugOut(_FTP_DecodeInternetStatus($dwInternetStatus))
    EndIf
EndFunc   ;==>FTPStatusCallbackHandler

Грешным делом подумал, что количество прочитанных байт берется из переменной iBytesRead. Но после проверки выяснилось, что значение этой переменной всегда =4. Вне зависимости от размера скачеваемого контента.

К сожалению очень мало информации о данном методе, был бы благодарен за ссылку на хорошую справку, или готовый пример.

P.S. InetGet Не предлагать, не работает эта функция у меня.
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
ProgressOn("FILE", "Downloading ", "0%")
$url = 'ftp://ftp.sac.sk/sac/avmuseum/v98i403e.zip';Set URL
Local $hDownload = InetGet($url, @DesktopDir & "\v98i403e.zip", 1, 1)
$FileSize = InetGetSize($url) ;Get file size
While Not InetGetInfo($hDownload, 2) ;Loop until download is finished
Sleep(100) ;Sleep for half a second to avoid flicker in the progress bar
$BytesReceived = InetGetInfo($hDownload, 0) ;Get bytes received
$Pct = Int($BytesReceived / $FileSize * 100) ;Calculate percentage
ProgressSet($Pct, $Pct & "%") ;Set progress bar
WEnd
ProgressSet(100,"Download Complete!")
Sleep(2000)
ProgressOff()
InetClose($hDownload)

_FTP_SetStatusCallback у тебя не будет работать ровно по той же причине, что и InetGet. Дело то не в функции.
 
Автор
M

moonshiner

Новичок
Сообщения
4
Репутация
0
Подведу итог, InetGet, _FTP_ProgressDownload, не работают

_FTP_FileGet и ftp://логин:пароль@сервер из проводника работают.

Ошибка что выдает фтп:

426 Data connection unexpectedly closed, file transfer /test/test.txt aborted by client.

Клиент опробован на разных системах, результат одинаковый.

Кто нибудь сталкивался с чем-то подобным?

Последний вариант - попробую обновить фтп сервер, хотя кроме этого скрипта, других проблем на нем не было замечено.

P.S. Обновление не помогло, на что думать, даже не знаю...
 
Верх