Форум » [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 на более новую версию



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