Форум » [x]Harbour » Непонятка с приемом файлов с FTP » Ответить

Непонятка с приемом файлов с FTP

Eduard: Есть следующая задача, получение энного кол-ва файлов с FTP, которые попадают на FTP с рабочих машин скажем так сотрудников, необходимо этот процесс автоматизировать, дабы ручками не собирать их в архив. Для этого была написана программа для рекурсивного получения файлов с источника (то есть с ФТП). На фтп есть папки с видом код рабочего места -> дата за которую передана информация (где то так gerc\67701\22.04.2012\*.) Само получение информации с одного рабочего места проблем не возникает, но если в листинге программы далее идет получение информации с другого рабочего места, то в результате команда ЛИСТ получается пустая и соответственно файл(ы) не получены. вот часть листинга, с подробным описанием, где по вашему мнению может быть ошибка? Используется МиниГуи только для получения результатов на экран. [more]procedure datagerc() LOCAL lRetorno := .T., aGauge, nPos := 1, olddir, cFile:= "", cStr2, tt, dt2 Local dt:=SUBSTR(DTOC(DATE()),1,2)+"."+SUBSTR(DTOC(DATE()),4,2)+"."+SUBSTR(DTOC(DATE()),7,4) cUrl := "ftp://" + cUser + ":" + cPassword + "@" + cServer cFile := "*.PSB" //файлы на ФТП olddir:= DIRCHANGE() DIRCHANGE(FoldDssIn) tt:=InputBoxDate("Введите дату формирования данных ГЕРЦ","Дата", DATE()) //задаем дату для получения информации dt2:=SUBSTR(DTOC(tt),1,2)+"."+SUBSTR(DTOC(tt),4,2)+"."+SUBSTR(DTOC(tt),7,4) // формат папки на сервере 02.01.2013 IF Len( cFile ) > 0 oUrl := tUrl():New( cUrl ) oFTP := tIPClientFtp():New( oUrl, .t. ) oFTP:nConnTimeout := 10000 oFTP:bUsePasv := .T. IF At( "@", cUser ) > 0 oFTP:oUrl:cServer := cServer oFTP:oUrl:cUserID := cUser oFTP:oUrl:cPassword := cPassword ENDIF addtextList1("Ждите, идет получение данных по отделению связи Б-Днестровский-1, 67701") IF oFTP:Open( cUrl ) oFtp:CWD( cPathFTP ) //переходим в каталог oFtp:CWD( "67701" ) // -/- oFTP:CWD(dt2) -//- FOR EACH cFile IN oFTP:listfiles(cFile) //даем команду ЛИСТ, проверяем есть ли такие файлы на ФТП oFtp:exGauge := { | done, size| ShowGaugePriem( done, size ) } IF !oFtp:DownloadFile( cFile[F_NAME] ) AddTextList1("На сервере отсутствуют данные за дату "+tt) MsgStop("На сервере отсутствуют данные за дату "+tt) lRetorno := .F. ELSE AddTextList1("данные по ОС 67701 за дату " + dt2 + " "+cFile[F_NAME] + " успешно получены ") lRetorno :=.T. ENDIF NEXT oFTP:CDUP() // новая команда, добавлена в ftpcli.prg, так как там нет такого метода //перемещается на предыдущий каталог oFTP:CDUP() /- oFTP:CDUP() // корневой каталог addtextList1("Ждите, идет получение данных по отделению связи Б-Днестровский-3, 67703") // пытаетмя получить данные по 2-й точке oFtp:CWD( cPathFTP ) //сменили каталог oFtp:CWD( "67703" ) //-- oFTP:CWD(dt2) // -/- FOR EACH cFile IN oFTP:listfiles(cFile) //даем команду ЛИСТ - И ВОТ ТУТ ТИПА ОШИБКИ, ВОЗВРАЩАЕТ ПУСТОЙ КАТАЛОГ, СООТВЕСТВЕННО ФАЙЛОВ НЕТ!!! oFtp:exGauge := { | done, size| ShowGaugePriem( done, size ) } IF !oFtp:DownloadFile( cFile[F_NAME] ) AddTextList1("На сервере отсутствуют данные за дату "+tt) MsgStop("На сервере отсутствуют данные за дату "+tt) lRetorno := .F. ELSE AddTextList1("данные по ОС 67703 за дату " + dt2 + " "+cFile[F_NAME] + " успешно получены ") lRetorno :=.T. ENDIF NEXT oFTP:CDUP() oFTP:CDUP() oFTP:CDUP() oFTP:Close()[/more] смотрел логи, в логе команда лист по 2-й точке (67703) показывает что нет файлов в данном каталоге, а точнее вообще ничего не показывает... [more]20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67703/20.04.2013" is current directory. << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (10,215,16,100,153,245). << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 12, LIST *.PSB<cr><lf> ) >> 12 << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from 10.215.1.92:57052; transfer starting. << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok << [/more]

Ответов - 63, стр: 1 2 3 4 All

Dima: Eduard Начни с ручной проверки о которой я выше написал. Нужно убедится что работает (или не работает)

Dima: Eduard пишет: BulletProof FTP Server Старенький и видимо глючненький. Я юзаю последнюю версию Gene6 (он же бывший BulletProof) CDUP понимает.

Eduard: 100% глючит BulletProof FTP Server, поставил ради эксперимента на тестовую машину FileZilla server, создал там же идентичную структуру папок как на основном сервере, после в проге проверил получение файлов, результат на 100% рабочий.


Dima: Eduard пишет: 100% глючит BulletProof FTP Server, поставил ради эксперимента на тестовую машину FileZilla server, G6FTP Server не пробовал ? Юзаю его давно и в "бою" он проверен. Глюков нет.

Eduard: Где подправить текст, для показа строки выполнения, перестало показывать прогресс-бар % получения после замены сервера oFtp:exGauge := { | done, size| ShowGaugePriem( done, size ) } PROCEDURE ShowGaugePriem( nSent, nSize ) Local nValue nValue := 100 * nSent/nSize IF nSent > 0 ft_gerc.Text_1.Value := Str(nValue,3)+" %" ft_gerc.ProgressBar_1.value := nValue DO EVENTS ENDIF RETURN

Eduard: Dima пишет: G6FTP Server не пробовал ? к сожалению на работе нет возможности скачать, инет на нашем предприятии заблокирован, придется дома скачивать...

AlexMyr: Eduard пишет: инет на нашем предприятии заблокирован, придется дома скачивать... Вот, как в стишке: откуда вирусишки, дома качаю, и на работу несу ...

Dima: AlexMyr пишет: дома качаю, и на работу несу Ну не факт

Eduard: Dima пишет: G6FTP Server не пробовал ? попробовал G6FTP Server последнию версию, также пробовал BPFTP тоже из последних версий, результат - только первый проход... дальше не идет, благо у меня есть доступ через ВПН, к своим серверам на работе, немножко поигрался с фтп-серверами. Только в FileZille был получен отличный вариант - все файлы из папок скачались. Единственное что не работает в программе, отображение результатов работы в граф. виде (прогресс-бар), может что-то надо подправить в тексте программы? PROCEDURE ShowGaugePriem( nSent, nSize ) Local nValue nValue := 100 * nSent/nSize IF nSent > 0 ft_gerc.Text_1.Value := Str(nValue,3)+" %" ft_gerc.ProgressBar_1.value := nValue DO EVENTS ENDIF RETURN

Dima: Теперь у меня полтергейст с приемом файлов с FTP На 15 точках стоит абсолютно одинаковая мой программа. На 14 точках все в шоколаде а на 15 не идет прием файлов. Затык на команде oFtp:downloadFile , судя по логам все красиво , но реально она возвращает .F. Судя по логам самого FTP тоже все красиво. Не пойму куда копать. Файер выключен. Антивируса нет , впрочем как и вирусов (проверяли не давно) Прием-передача идет в пассивном режиме , пробовали актив - не помогает. LIST директории показывает нормально. PS Harbour 3.2 + библа HBtip

petr707: IE, Свойства обозревателя, вкладка "Дополнительно" все параметры со словом FTP

Dima: petr707 Упс. Спасибо , даже не знал что это может повлиять. Завтра проверим , отпишу.

Dima: да забыл добавить , если с этой проблемной машины попробовать скачать этот же файл с заходом на FTP через браузер или FAR Manager или Total Commander, то проблем нет. проблема с закачкой файла именно в hbtip методом downloadFile , при чем только на этом компе. Что еще работает в Harbour с FTP кроме HBTIP и HBCURL ?

Eduard: Навряд ли параметры обозревателя будут влиять, надо что-то другое копать... да и там все то 2 параметра, которые по умолчанию включены (смотрел под 7-кой, думаю в ХР такие-же стоят): 1. Использовать пассивный FTP-протокол (для совместимости с браузерами и ДСЛ-модемами) 2. Разрешить просмотр FTP-папок (За пределами Internet Exp.)

petr707: hb_run("ftp.exe -n -s:get_ftp.txt") ... ---get_ftp.txt--- open cUrl user xxx passw cd /zzz binary get filename by 2)у HBTIP - только если параметр oFTP:nConnTimeout увеличить 3) права на локальный ресурс у процесса oFtp:DownloadFile( cLocalFile ,cRemoteFile) есть? 4) есть еще наколка - нельзя использовать в Passw символы типа % (нужно экранировать таким же), но если авторизация проходит, то дело не в этом

Dima: petr707 пишет: 2)у HBTIP - только если параметр oFTP:nConnTimeout увеличить 20000 petr707 пишет: 3) права на локальный ресурс у процесса oFtp:DownloadFile( cLocalFile ,cRemoteFile) есть? да petr707 пишет: 4) есть еще наколка - нельзя использовать в Passw символы типа % (нужно экранировать таким же), но если авторизация проходит, то дело не в этом проходит

ММК: Dima пишет: Что еще работает в Harbour с FTP кроме HBTIP и HBCURL ? Дима, а глянь вот эту тему.Может "натолкнет" на какую мысль... Во всяком случае FW у тебя есть - можешь глянуть на FTP с этой стороны... http://forums.fivetechsupport.com/viewtopic.php?f=3&t=23075&sid=b4fdf17131ab3cbe4c86aa7bf72d4115

Dima: Нашли причину ;) Ранее программа лежала в папке d:\minisklad_shumen4 и прием не работал. Переименовали папку в d:\minisklad и все заработало. При чем только в активном режиме (пассив на прием так и не работает). Не нравится проге символ _ в папке или длинное имя ? Попробовал у себя , работает с любой папкой нормально. ХЗ что было. Может юзер накосячил с выбором в программе active/passive......... PS Рядом находится другая торговая точка и тот же провайдер но инет у них по WIFI и прием работает и в пассивном и активном режимах.

Dima: Косяки вылезают не понятные , может кто сталкивался (LIB : Hbtip) В папке на FTP лежит 3 ZIP файла с размерами 1.5 метра , 8 метров , 5 килобайт. ListFiles срабатывает нормально. Далее если массив не пустой в цикле сливаю 3- файла. Первый заходит нормально (размер 1.5 метра). На втором downloadFile выдает .F. и на 3-м тоже. Код примерно таков [pre2] function Main() local cUrl := "ftp://" + "dima" + ":" + "pass" + "@" + "182.107.231.162" // адрес фтп я тут слегка исказил local aftp local i local ret:=.f. REQUEST HB_LANG_RUWIN REQUEST HB_CODEPAGE_RU866 hb_SetCodepage( "RU866" ) HB_LANGSELECT( 'RUWIN' ) cls oUrl := tUrl():New( cUrl ) oFTP := tIPClientFtp():New( oUrl, .f. ) // .t. если трассировка oFTP:nConnTimeout := 20000 oFTP:nDefaultPort:=21 oFTP:bUsePasv := .t. oFtp:exGauge := {| done, size | fShowGauge( done, size ) } IF oFTP:Open( cUrl ) ? "Open" if oFtp:Cwd("/minisklad/UPDATEMINI") ? "CWD" aftp:=oFtp:ListFiles("*.zip") ? len(aftp) aftp:=asort(aftp) if len(aftp)#0 for i=1 to len(aftp) ? aftp[ i ][1] ? aftp[ i ][2] ret:=oFtp:downloadFile(CurDrive()+":\"+CurDir()+"\"+aftp[1],aftp[ i ][1] ) ? ret next endif endif endif oFTP:Close() wait "Нажмите любую клавишу" return nil Func fShowGauge( nSent, nSize ) static lisik:=.t. if lisik @ 24,0 SAY "Получаю обновление: " + Replicate( "▒", 60 ) lisik:=.f. endif IF nSent > 0 @ 24, 20 SAY Replicate( "█", 60 * nSent / nSize ) ENDIF RETURN .t. [/pre2] файл на 8 метров ни при каких условиях сливаться не хочет

petr707: После каждого Download ставлю oFTP:reset()



полная версия страницы