Форум » [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: petr707 пишет: После каждого Download ставлю oFTP:reset() Спасибо , не помогло Точнее: Dima пишет: Первый заходит нормально (размер 1.5 метра). На втором downloadFile выдает .F. и на 3-м тоже. После этого рецепта 3 файл зашел нормально. А вот большой файл (8 метров) не хочет скачивать зараза.

petr707: Что пишет в логе ftp-?.log Может по таймауту скидывает соединение при низкой скорости ?

Dima: petr707 Да нет скорость нормальная я уже у себя на своем FTP тестю В логе вот что [pre2] 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from xx.xx.xxx.xx:2778; transfer starting. << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> 0 << 20131217-18:12:14 :INETRECVALL( <pointer>, , 512 ) >> -rw-rw-rw- 1 user group 16177831 Dec 01 16:08 core-master.zip << 20131217-18:12:14 :INETCOUNT( <pointer> ) >> 72 << 20131217-18:12:14 :INETRECVALL( <pointer>, , 512 ) >> << 20131217-18:12:14 :INETCOUNT( <pointer> ) >> 0 << 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok. << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> 0 << 20131217-18:12:14 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (xx,xx,xxx,xxx,83,122) << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> 0 << 20131217-18:12:14 :INETSENDALL( <pointer>, 22, RETR core-master.zip<cr><lf> ) >> 22 << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> 0 << 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> -3 << 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> -4 << 20131217-18:12:14 :INETSENDALL( <pointer>, 6, QUIT<cr><lf> ) >> -1 << 20131217-18:12:14 :INETRECVLINE( <pointer>, , 128 ) >> << 20131217-18:12:14 :INETERRORCODE( <pointer> ) >> -4 << [/pre2]


nick_mi: А если начать с длинного файла?

Dima: nick_mi Да что только не делал. Вот такой размер уже не тянет 1 670 338 байт не пойму куда копать В самом фтп в логе вот такая штука 426 Retrieve aborted; Transfer ok Тот же файл с того же фтп легко тянется с помощью FlashFXP , значит дело не в фтп и какие то косяки в исходном коде Hbtip

petr707: Может , экземпляр Ftp-сервера неудачный ?

Dima: petr707 Выше ответил ;)

Dima: petr707 А у вас тянутся файлы с фтп размером от 2 метров с помощью downloadFile (Hbtip) ? Если тянутся то какая версия Harbour у вас ? У меня Harbour 3.2.0dev (Rev. 18920)

petr707: Download - до 3 Mb, у меня больше Upload действий - до 50 Mb Harbour 2.0 Сделал тест загрузки - 18 Mb , все ок кусок кода - Download - ниже, все - как в примерах FUNCTION tipFTPdnl(cPath, arrf, ltrace ,cStr,lmess,cmask,aList; //7 ,cServer,cUser,cPassword,lset; // 8,9,10 11 ,lPassive;//12 ) LOCAL aFiles LOCAL cUrl LOCAL lRetorno := .T. LOCAL oUrl LOCAL oFTP LOCAL cFile := "" ,iFile Local cRemoteFile :="" Local scrwait,c_sag:="",ctxt:="",ldown Local CRLF := Chr( 13 ) + Chr( 10 ) Local jj,arr_remote:={} if ltrace=NIL ltrace := .f. // ftp-n.log endif cStr := "" lmess :=IIF(lmess=NIL,.f.,lmess) aList:={} Ftp_serv(@cServer,@cUser,@cPassword,lset) cUrl := "ftp://" + cUser + ":" + cPassword + "@" + cServer cUrl := "ftp://" + cServer if cPath =NIL cPath := "__test" endif lPassive:=IIF(lPassive=NIL.or.valtype(lPassive)#"L",.t.,lPassive) IF Len( arrf ) > 0 .or. !(cmask=NIL) oUrl := tUrl():New( cUrl ) oUrl:cUserID := cUser oUrl:cPassword := cPassword oFTP := tIPClientFtp():New( oUrl, ltrace ) oFTP:nConnTimeout := 20000 oFTP:bUsePasv := lPassive //.T. oFTP:oUrl:cUserID := cUser oFTP:oUrl:cPassword := cPassword // Comprobamos si el usuario contiene una @ para forzar el userid IF At( "@", cUser ) > 0 oFTP:oUrl:cServer := cServer oFTP:oUrl:cUserID := cUser oFTP:oUrl:cPassword := cPassword ENDIF IF oFTP:Open()// cUrl ) oFTP:CWD( cPath ) if !(cmask=NIL) aList := oFTP:ListFiles(cmask) //"*.txt" endif FOR each iFile IN arrf cFile := iFile[1] arr_remote := { iFile[2] } if !(lower(iFile[2])==iFile[2]) aadd(arr_remote,lower(iFile[2])) endif if !(UPPER(iFile[2])==iFile[2]) aadd(arr_remote,UPPER(iFile[2])) endif for jj=1 to len(arr_remote) cRemoteFile := arr_remote[jj] c_sag:= " Download : "+cFile+" <- "+cRemoteFile+" " + oURL:cServer +" "+cPath tolog(c_sag) scrwait := op_wait(c_sag,10,10,,c_pict2,," DownLoad: "+cPath) BEG_Gauge(15,5," Download "+cPath+" "+cRemoteFile ,ci_db) oFtp:exGauge := { | done, size| ShowGauge(done, size ) } ldown:= oFtp:DownloadFile( cFile ,cRemoteFile) END_Gauge(15,5) cl_wait(scrwait,10,10) if ldown EXIT endif next jj if !ldown ctxt :=" Нет загрузки Файла : " + cFile ctxt += CRLF+" " + oURL:cServer +" "+cPath if lmess mess( ctxt) endif cStr += ctxt+CRLF lRetorno := .F. LOOP ELSE ctxt :=" Загружен Файл : " + cFile ctxt += CRLF+" " + oURL:cServer +" "+cPath if lmess mess( ctxt) endif cStr += ctxt+CRLF lRetorno := .t. ENDIF oFTP:reset() if !file(cFile) ctxt :=" Нет Файла : " + cFile if lmess mess( ctxt) endif cStr += ctxt+CRLF LOOP endif NEXT oFTP:Close() ELSE cStr := "Нет соединения с сервером FTP" +CRLF; + " " + oURL:cServer+CRLF IF oFTP:SocketCon == NIL cStr += " " + oURL:cServer+CRLF cStr += "Соединение не инициализировано"+CRLF ELSEIF hb_InetErrorCode( oFTP:SocketCon ) == 0 cStr += " " + oURL:cServer+CRLF cStr += "Ответ сервера:" + " " + oFTP:cReply+CRLF ELSE cStr += " " + oURL:cServer+CRLF cStr += "Ошибка сокета:" + " " + hb_InetErrorDesc( oFTP:SocketCon )+CRLF ENDIF if lmess mess(cStr) endif lRetorno := .F. ENDIF ENDIF RETURN lRetorno

Dima: petr707 Спасибо , вроде ни чего не обычного в коде нет. Попробовал свой пример собрать с Harbour 2.0 и скачать файлик на 2 метра , результат такой же , хотя более мелкие файлы скачивает легко. Собираю сейчас Harbour DEV поcледний и попробую с ним. PS Юзаю oFTP:bUsePasv :=.T.

Dima: Вот и все непонятки закончились после того как убил кучу времени. У DownloadFile проблема с длинными именами файлов , при чем в UploadFile этой проблемы нет. Не важно каков размер файла , важна для него длина имени файла. Вот такой файл скачает 12345678.zip а вот такой уже нет 123456789.zip и размер тут не причем. Протестил и в легкую слил файл на 200 метров. Тестил начиная с Harbour 2.0 до последнего DEV. Прошу опровергнуть или подтвердить описанное поведение DownloadFile. Думается мне что это баг который нужно исправлять. ЗЫ Давайте вместе сделаем Harbour лучше

petr707: с моего FTP сервера: одинаково загружаются - файлы с короткими и с длинными именами, с дефисом в имени файла и без.

Dima: petr707 пишет: с моего FTP сервера: А что за FTP сервер ?

petr707: В ftp-n.log сервер сообщает, что он ProFTPD 1.3.1 Server (ProFTPD) В общем контексте исполнения (Harb 2.0) использую установку SetFileApisToOEM() Доступ по FTP на один и тот же ресурс - сильно зависит от настроек Windows,брандмауэра, антивируса и прочее. Иногда получается с одного компа - только ActiveMode, иногда - только Passive. Проблемы проверяю обычно Far'ом Не пробовали бесплатные ресурсы ? типа http://net2ftp.ru/

Dima: Да насчет active/passive знаю и это еще может зависить и от прова. Как тут бороться я знаю. Но вот не понятки с downloadfile меня напрягают. Беру файлик и ложу на свой FTP , назвал его 12345678.zip сливается нормально моей тестовой прогой. Переименовываю его в 1234567890.zip не сливается , проверял многократно. Переименовываю его еще раз от балды в 12345klsjdklfjsklf.zip сливается при чем уверенно ,проверял многократно. Файлы с короткими именами 8.3 сливаются всегда иначе тут связь какая то прослеживается не понятная между размером файла и его его именем. Может сливаться а может и нет. C Upload нет таких проблем. PS Те же файлы всегда сливаются норм любым FTP клиентом. Отсюда напрашивается вывод что FTP сервер не при чем (юзаю G6FTP Server уже давно и работает как часы)

petr707: Между FTP-сервером(с его настройками) и простым HBTIP-ftp клиентом - есть еще его Величество Интернет(канал), который дышит, проседает и т.д. Специализированные FTP-клиенты - умнее. В моем случае сложности : большие-маленькие буквы в именах файлов, конкуренция за соединение с сервером( ограничено число соединений - настройки сервера), конкуренция за доступ к файлам между клиентами. Возможно, настройки среды не соответствуют каналу, который слишком быстрый(иногда это проблема ) или слишком медленный. По идее, Upload по скорости - меньше или равен Download

Dima: petr707 пишет: ProFTPD 1.3.1 Server (ProFTPD) Это под UNIX ?

petr707: да, специально заточенный(собран из модифицированных исходников )

Dima: Eduard пишет: Единственное что не работает в программе, отображение результатов работы в граф. виде (прогресс-бар), может что-то надо подправить в тексте программы? Тестю FileZilla , и тоже перестал работать индикатор , хотя на Gene6FTP работал Eduard пишет: Где подправить текст, для показа строки выполнения, перестало показывать прогресс-бар % получения после замены сервера oFtp:exGauge := { | done, size| ShowGaugePriem( done, size ) } Ни где так как в случае с Filezilla Server первый параметр всегда заходит -1 как ни странно

Dima: Кстати с Filezilla Server при UploadFile индикатор работает нормально а вот с DownloadFile не работает



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