Форум » [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 пишет: oFTP:CDUP() // новая команда, добавлена в ftpcli.prg, так как там нет такого метода //перемещается на предыдущий каталог oFTP:CDUP() /- oFTP:CDUP() // корневой каталог Вероятно перед этим нужно проверить а был ли осуществлен прием файлов из предыдущего каталога и только после этого если он был и давать ряд команд oFTP:CDUP() Я хочу сказать что ты не оказываешься в нужном каталоге вот LIST ни чего и не находит.

Eduard: Dima пишет: Вероятно перед этим нужно проверить а был ли осуществлен прием файлов из предыдущего каталога и только после этого если он был и давать ряд команд oFTP:CDUP() Я хочу сказать что ты не оказываешься в нужном каталоге вот LIST ни чего и не находит. согласно лога, файлы были успешно получены, после перешли командой oFTP:CDUP() Может еще какую ту команду надо добавить? в приложении лог 20130421-22:22:53 :INETCONNECT( 10.215.16.100, 21 ) >> <pointer> << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 220 FTP Server GERC << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 9, USER 11<cr><lf> ) >> 9 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 331 Password required for 11. << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 9, PASS 11<cr><lf> ) >> 9 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 230 User OS logged in. << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 8, TYPE I<cr><lf> ) >> 8 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 200 Type set to I. << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 11, CWD /GERC<cr><lf> ) >> 11 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC" is current directory. << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 11, CWD 67701<cr><lf> ) >> 11 << 20130421-22:22:53 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67701" is current directory. << 20130421-22:22:53 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:53 :INETSENDALL( <pointer>, 16, CWD 20.04.2013<cr><lf> ) >> 16 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67701/20.04.2013" is current directory. << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (10,215,16,100,45,47). << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 12, LIST *.PSB<cr><lf> ) >> 12 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from 10.215.1.92:57046; transfer starting. << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVALL( <pointer>, , 512 ) >> -rw-r--r-- 1 ftp ftp 9984 Apr 20 08:09 r10101ed.PSB -rw-r--r-- 1 ftp ftp 10038 Apr 20 17:05 r10101ee.PSB << 20130421-22:22:54 :INETCOUNT( <pointer> ) >> 138 << 20130421-22:22:54 :INETRECVALL( <pointer>, , 512 ) >> << 20130421-22:22:54 :INETCOUNT( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (10,215,16,100,199,28). << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 19, RETR r10101ed.PSB<cr><lf> ) >> 19 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from 10.215.1.92:57047; transfer starting for r10101ed.PSB (9984 bytes). << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVALL( <pointer>, , 9984 ) >> Rar! o—s@ 20130421-22:22:54 :INETCOUNT( <pointer> ) >> 9984 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20130421-22:22:54 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (10,215,16,100,128,46). << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:54 :INETSENDALL( <pointer>, 19, RETR r10101ee.PSB<cr><lf> ) >> 19 << 20130421-22:22:54 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from 10.215.1.92:57048; transfer starting for r10101ee.PSB (10038 bytes). << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETRECVALL( <pointer>, , 10038 ) >> Rar! o—s@ 20130421-22:22:55 :INETCOUNT( <pointer> ) >> 10038 << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 6, PASV<cr><lf> ) >> 6 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 227 Entering Passive Mode (10,215,16,100,39,208). << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 7, LIST <cr><lf> ) >> 7 << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 150 Data connection accepted from 10.215.1.92:57049; transfer starting. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 226 Transfer ok << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67701" is current directory. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC" is current directory. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/" is current directory. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 11, CWD /GERC<cr><lf> ) >> 11 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC" is current directory. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 11, CWD 67703<cr><lf> ) >> 11 << 20130421-22:22:55 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67703" is current directory. << 20130421-22:22:55 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:55 :INETSENDALL( <pointer>, 16, CWD 20.04.2013<cr><lf> ) >> 16 << 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 << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC/67703" is current directory. << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/GERC" is current directory. << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 6, CDUP<cr><lf> ) >> 6 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 250 CWD command successful. "/" is current directory. << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 << 20130421-22:22:56 :INETSENDALL( <pointer>, 6, QUIT<cr><lf> ) >> 6 << 20130421-22:22:56 :INETRECVLINE( <pointer>, , 128 ) >> 221 Bye bye ... << 20130421-22:22:56 :INETERRORCODE( <pointer> ) >> 0 <<

Dima: Eduard пишет: FOR EACH cFile IN oFTP:listfiles(cFile) А если немного переделать FOR EACH XFile IN oFTP:listfiles(cFile) После первого FOR EACH интересно чему будет равняться cFile ? Вероятно уже не *.PSB а что то типа blabla.PSB


Eduard: Текст то я подправил, еще варианты есть почему не хочет закачивать вторую дальше по тексту ...

Dima: Eduard Eduard пишет: FOR EACH cFile IN oFTP:listfiles(cFile) Чему равна переменная cFile перед вторым FOR EACH если учесть что первый FOR EACH тоже отработал ?

Eduard: Тоже самое, все файлы имеют расширение одно и тоже, только первая часть меняется (типа того r10101ef.PSB, r101028u.PSB) и в заданой папке их может лежать от одного до несколько шт. меняется только имя папки на сервере (типа 67703\...\)

Dima: Dima пишет: Чему равна переменная cFile Похоже не в этом дело.

Eduard: пробовал во второй части менять переменную (cFile) на другую, там же менял переменную в конце команды FOR EACH, закачивает только первую часть

Dima: я полагал что после первого FOR EACH переменная cFile примет значение что то типа r10101ef.PSB и тогда второй oftp:Listfiles будет уже срабатывать не по *.PSB а по r10101ef.PSB Но накидал примерчик и понял что cFile остается прежним *.PSB oFTP:CDUP() точно правильно работает ? Да и проверки перехода в папку тоже не помешают if oFtp:CWD( cPathFTP ) //переходим в каталог if oFtp:CWD( "67701" ) // -/- if oFTP:CWD(dt2) -//- endif endif endif Пробни вместо CDUP() -> CWD() в корень

Eduard: вот оригинал команды, вставленый в листинг модуля ftpcli.prg, так как сама команда отсутствует в hbtip по логам фтп вроде нормально отрабатывает... METHOD Cdup() CLASS tIPClientFTP ::InetSendall( ::SocketCon, "CDUP" + ::cCRLF ) RETURN ::GetReply()

Eduard: как указать корень в команде CWD? CWD("/") ?

Eduard: Dima пишет: if oFtp:CWD( cPathFTP ) //переходим в каталог if oFtp:CWD( "67701" ) // -/- if oFTP:CWD(dt2) -//- endif endif endif Пробни вместо CDUP() -> CWD() в корень поставил CWD() в корень, добавил условие проверки перед каталогом... получил тот же самый вариант. ничего не понимаю

Dima: CDUP это cwd ../ ?

Dima: Eduard пишет: как указать корень в команде CWD? как то так cwd ../../ , смотря как глубоко ты залез ранее в папки в твоем случае cwd ../../../ ЗЫ А может в папке "67703" и далее нет файлов ?

petr707: Можно проверить - допустима ли команда CDUP на этом экземпляре FTP сервера. из командной строки интерактивно ftp.exe имя_узла Пользователь: имя_пользователя Пароль: xxxxxx ftp > help Допускается сокращение команд при вводе. Набор команд: ! delete literal prompt send ? debug ls put status append dir mdelete pwd trace ascii disconnect mdir quit type bell get mget quote user binary glob mkdir recv verbose bye hash mls remotehelp cd help mput rename close lcd open rmdir ftp>by

Eduard: CDUP как показала проверка моего ftp-сервера не поддерживается. В корень хожу с помощью команды cwd... и тем не менее обработка заканчивается на первом условии FOR EACH cFile IN oFTP:listfiles(cFile) и дальше не идет...

Dima: Eduard пишет: CDUP как показала проверка моего ftp-сервера Тогда вместо одного CDUP , делай один CWD(../)

Dima: А что за FTP сервер ? Не Golden FTP PRO случайно ?

Dima: petr707 пишет: Можно проверить - допустима ли команда CDUP на этом экземпляре FTP сервера. из командной строки интерактивно Кстати да эффективно и просто (или можно юзануть FlashFXP) Проделай все тоже самое что делаешь из программы. Сменил каталог и тд , получил лист .....пошел в корень ,cменил каталог и тд , получил лист. Идея ясна ?

Eduard: BulletProof FTP Server используется, попробую еще обновить серверную часть FTP на более новую версию

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()

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 не работает

petr707: Возможно вся работа прогрессбара - укладывается в одну (последнюю) секунду. Аналогично происходит с HTTP_get HTTP_UPload - прогрессбар отражает ,видимо, реальную картину, HTTP_get - Градусник прогрессбара меняется в самом конце процесса, когда уже не нужен(неинтересно) Видимо, действует какое-то внутреннее кэширование.

Dima: petr707 да нет не в этом дело , я же выше писал. С сервером Gene6 прогресс бар работает нормально но с тем же файлом и сервером Filezilla он не работает потому что функция прописанная для exGauge в качестве принятых байт получает -1 (это я проверил)

petr707: -1 это еще неплохо, по крайней мере - это число В некоторых случаях valtype(..)#"N" Или разбираться в исходниках , или - забить...на градусник..



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