Что нового

[Сеть, интернет] Качаем файл с FTP при помощи _FTP_FileGet или InetGet!

Статус
Закрыто для дальнейших ответов.

kserg-2002

Новичок
Сообщения
18
Репутация
0
Всем Доброе время суток!
Подскажите, пытался скачать и с InetGet, и вот с _FTP_FileGet.
Есть FTP-сервер с логином, паролем, пассивный режим.
Пытаюсь подключиться, чтобы скачать оттуда определенный файл.
Код:
#Include <FTPEx.au3>
#Include <Array.au3>
#Include <File.au3>
#Include <Date.au3>

Global $hFtp, $hSession, $aFind, $hFind

$FTP_My = 'MyFtp.com' 
$Login = 'Login'
$Password = 'Password'

$hFtp = _FTP_Open('MyFtp')
$hFTP_Result = _FTP_Connect($hFtp, $FTP_My, $Login, $Password, 1)
$aData = _FTP_FindFileFirst($hFTP_Result,'', $hFind)
While Not @error
	If StringInStr($aData[10],"127")<>0 Then
		$FileSize_FTP_byte = _FTP_FileGetSize($hFTP_Result, $aData[10]) ; Размер файла на FTP
		$FileSize_FTP_Mb = Round($FileSize_FTP_byte/1048576)
		MsgBox(0,'Размер файла','Размер файла на FTP = ' & $FileSize_FTP_byte & ' байт.', 5)
		MsgBox(0,'Дата и время','Дата изменения: ' & _FTP_FileTimeLoHiToStr($aData[6], $aData[7]) & @CR)
		
		$Path = 'E:\_Script\' & $aData[10]
		
		$File_Get = _FTP_FileGet($hFTP_Result, $FTP_Result & '/' & $aData[10], $Path)
		If Not @error Then
			MsgBox(0,'Файл', 'Скачали файл. ' & $aData[10])
		Else
			MsgBox(0,"Ошибка","Не удалось принять файл! " & $aData[10])
			Exit
		EndIf
	EndIf
    $aData = _FTP_FindFileNext($hFind)
WEnd
_FTP_FindFileClose($hFind)
_FTP_Close($hFtp)
Exit


1. Собственно, данные о файле получает ($FileSize_FTP_byte), а скачать не получается! Это основное.
2. Я знаю точное название файла. Можно ли сразу просмотреть, если есть конкретно этот файл, то его начать скачивать?
3. Файл большой. Так что, пожалуй, надо сделать прогресс-бар какой-либо, чтоб отображался процесс закачки файла, в процентах, например, либо в Мегабайтах от общего объема.
4. После скачивания надо проверить, чтоб размер точно совпадал, что файл удачно скачался.
5. Если будет обрыв связи, то прервется скачивание?
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

Товарищи, ну кто работал с FTP? Я пытался и с помощью InetGet сделать - не получается...

Похоже, пошел процесс с InetGet...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

kserg-2002
Я, например с ftp.filekeeper.org скачиваю файлы с помощью InetGet без проблем. Название файла получили и отсюда качаю: http://filekeeper.org/папка/папка1/название файла. (папка и папка1 должны быть известны).
А прогресс-бар и проверку скачанного файла можно с помощью InetGetInfo() организовать.
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

madmasles, да, Спасибо. Сейчас как раз с этим и пытаюсь разобраться...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

kserg-2002
Я бы в Вашем коде вместо
Код:
;...
    $aData = _FTP_FindFileNext($hFind)
WEnd
;...
сделал
Код:
;...
While Not @error
    $aData = _FTP_FindFileNext($hFind)
    If $aData[0] = 0 Then ExitLoop
    If StringInStr($aData[10],"127")<>0 Then
;...

А с прогресс-баром примерно так
Код:
;...
$hDownload = InetGet($sUrlFTP & $sFileName, $sTempAM & "\" & $sFileName, 1, 1)
		Do
			Sleep(20)
			$aData = InetGetInfo($hDownload, -1)
			If $aData[1] > 0 Then
				GUICtrlSetData($Label3, Round($aData[0] / 1024, 2) & " КБ")
				GUICtrlSetData($Progress1, $aData[0] / $aData[1] * 100)
			EndIf
		Until InetGetInfo($hDownload, 2)
;...
С переменными разберетесь.
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

Так, хорошо, процесс идет.
Получаю дату файла.
Почему-то бывают такие ситуации, и, в основном, вроде, на определенных компьютерах.
На большинстве дату получает правильно. А на определенных компьютерах почему-то дату получает за минусом одного года! Например, сегодняшняя: 20100526. Неправильно получает: 20090526 !!!
С абсолютно тем же файлом (архив) на других ПК - все нормально.
-----------
Еще бывает, что год получает правильно, а дату... на неск-ко дней меньше.
Например, также сегодня: 20100526, а получает 20090522
Файла такого не существует. Размер получает = 0.
-----------
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

Так... Потестировал несколько дней, посмотрел.
Есть несколько точек, куда я пытаюсь загрузить файл с FTP.
На большинстве проходит хорошо.
На одной точке стабильно, каждый день получает дату файла на год меньше, то есть не 2010, а 2009.
На другой точке стабильно получает дату файла 20100522. Всегда 22-ое число почему-то.
Наступит вот июнь - посмотрю, что тогда получит.
Не могу найти, почему...
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

Гхм... 1-ое июня было... Всё то же самое... Кто может что подсказать?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

kserg-2002
У меня так стабильно работает:
Код:
#include <FTPEx.au3>
#include <Array.au3>

$server = ''
$username = ''
$pass = ''
$s_Remote = '/папка1/папка2/' ;конечная папка на FTP где лежат файлы
$sUrl = "http://FTP-server.my/"

$timeout = TimerInit()

$iResult_Internet_Ping_URL = _Internet_Ping_URL($sUrl)
Select
	Case $iResult_Internet_Ping_URL = 99
		MsgBox(0, "99", "Ошибка в " & $sUrl)
	Case $iResult_Internet_Ping_URL = 999
		MsgBox(0, "999", "Сайт " & $sUrl & " не доступен")
	Case $iResult_Internet_Ping_URL = 0
		MsgBox(0, "0", "Подключитесь к интернету")
EndSelect
For $i = 1 To 5
	$Open = _FTP_Open('MyFTP');открываем FTP
	$Conn = _FTP_Connect($Open, $server, $username, $pass, 1);коннектимся к серверу в активном режиме
	If $Conn <> 0 Then ExitLoop; если подключились - выходим из цикла
	_FTP_Close($Open)
	Sleep(500)
Next

_FTP_DirSetCurrent($Conn, $s_Remote);переходим в нужную нам папку
$aFiles = _FTP_ListToArrayEx($Conn, 2, 0, 1);заносим в массив файлы и сведения о них
$time = Round(TimerDiff($timeout) / 1000, 2) & " секунд."
_ArrayDisplay($aFiles, $time)
ProgressOn($time, "Скачивание " & $aFiles[$aFiles[0][0]][0], "скачано 0 kb", 50, 50, 16)
$percent = -Round($aFiles[$aFiles[0][0]][1] / 1024, 2) / 100
_FTP_ProgressDownload($Conn, @ScriptDir & "\" & $aFiles[$aFiles[0][0]][0], $aFiles[$aFiles[0][0]][0], "_UpdateProgress")
_FTP_Close($Open);закрываем соединение с FTP


Func _UpdateProgress($Percentage)
	$percent += Round($aFiles[$aFiles[0][0]][1] / 1024, 2) / 100
	ProgressSet($percent, "скачано " & Round($percent, 2) & " kb")
	Return 1
EndFunc   ;==>_UpdateProgress


;это модифицированная функция CreatoR`a
Func _Internet_Ping_URL($sPing_URL = "http://www.google.ru/", $iPing_TimeOut = 1000)
	;без аргументов проверяет только наличие интернета.
	;с первым аргументом пингует конкретный URL не зависимо от наличия интернета.
	Local Const $INTERNET_CONNECTION_MODEM = 0x1
	Local Const $INTERNET_CONNECTION_LAN = 0x2
	Local Const $INTERNET_CONNECTION_PROXY = 0x4
	Local Const $INTERNET_CONNECTION_OFFLINE = 0x20
	Local Const $INTERNET_CONNECTION_CONFIGURED = 0x40
	Local $iRetState = 99
	Local $aPing_Host = StringRegExp($sPing_URL, 'http://(.*?)/', 3);выдираем хост из $sPing_URL
	If Not IsArray($aPing_Host) Then Return $iRetState;ошибка в URL
	$sPing_Host = $aPing_Host[0]
	Local $stInetGetConnectedState = DllStructCreate("int")

	DllCall("wininet.dll", "int", "InternetGetConnectedState", "ptr", DllStructGetPtr($stInetGetConnectedState), "dword", 0)

	Local $s_stDataState = DllStructGetData($stInetGetConnectedState, 1)


	If BitAND($s_stDataState, $INTERNET_CONNECTION_MODEM) Or _
			BitAND($s_stDataState, $INTERNET_CONNECTION_PROXY) Then $iRetState = 1;есть подключение к интернету

	If BitAND($s_stDataState, $INTERNET_CONNECTION_OFFLINE) Then $iRetState = 0;нет подключения к интернету
	If $sPing_Host = "google.com" Then;если функция без аргументов
		If $iRetState = 0 Then
			Local $iPingCheck = Ping($sPing_Host, $iPing_TimeOut);пингуем "google.com"
			If $iPingCheck > 0 Then $iRetState = 1;есть подключение к интернету
		EndIf
	Else
		Local $iPingCheck = Ping($sPing_Host, $iPing_TimeOut);пингуем хост "$sPing_URL в любом случае
		If $iPingCheck > 0 Then
			$iRetState = 1;есть подключение к интернету и хост доступен
		Else
			$iRetState = 999; хост не доступен.
		EndIf
	EndIf
	Return $iRetState
EndFunc   ;==>_Internet_Ping_URL
Насчет даты файлов не знаю. Надо, наверное с FTP-сервером разбираться.
 

dimazhan

Новичок
Сообщения
1
Репутация
0
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

не подскажете где скачать этот FTPEx.au3?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Сеть, интернет] Как скачать файл с FTP при помощи _FTP_FileGet ?

dimazhan
он включен в стандартную поставку дистрибутива
 
Автор
K

kserg-2002

Новичок
Сообщения
18
Репутация
0
Так. Поднимем темку...
Значит, так, и проблемка возникла, и... хочу переписать скрипт.
В общем, сейчас работает и качает файл функцией InetGet
Работало на всех точках. Теперь с недавнего времени почему-то с одной точки не может получить доступ - и всё тут.
Через Far manager захожу на тот же FTP - нормально.
Но, кстати, нормально только в пассивном режиме.
Вроде, с FTP сервером ничего не происходило, не изменялось.
Может ли повлиять как-то, если, допустим, у провайдера изменился пиринг... маршрут между сетями?
И... если брать, то каким образом мне определить, в каком режиме коннектиться, в активном или пассивном к FTP, и как это можно сделать?
 

tyion

Новичок
Сообщения
1
Репутация
0
ребят, недавно начал изучение и возникла проблема... не пойму в чем дело.

#include <FTPEx.au3>

$server = "111.11.11.11"
$username = "user"
$pass = "123"
$RemoteFile = "test.exe"
$LocalFile = "C:\"

$Open = _FTP_Open('$Conn')
$Conn = _FTP_Connect($Open, $server, $username, $pass,)

if $conn Then
TrayTip("test", "Обновление", 5, 1)
$File_Get = _FTP_FileGet($Conn, $RemoteFile, $LocalFile)
Sleep(5000)
EndIf

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Статус
Закрыто для дальнейших ответов.
Верх