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

Как проверить существование файла на FTP ?

Dima: Вот и весь вопрос.

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

Dima: Собственно разобрался;) Одно но , если я точно не знаю какова длина имен файлов на ftp , то вместе с именем (после имени) лезет куча хлама.......то ли у меня руки кривые то ли what32 такой. ps Юзал what32

Dima: Юзаю для доступа на Ftp , библиотечку What32 , впрочем уже писал про это ;) Такие функции как FtpGetFile FtpSetCurrentDirectory InternetOpen InternetConnect FtpPutFile FtpDeleteFile работают достаточно быстро и нареканий нет. А вот такая нужная вещь как FtpDirectory в которой отрабатывают функции FtpFindFirstFile и InternetFindNextFile то работают быстро то тормозят на равном месте. Как это дело ускорить или возможно у кого есть нормальная библиотека (иль сырцы) для доступа к FTP на Xharbour ? Спасибо !

Петр: Мне тоже одна задачка нарисовалась для работы с FTP. Думаю использовать contrib\hbcurl. Вот, что это "чудо" позволяет tool for transferring files with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks. Если не все, то очень много.


Dima: Петр Спасибо ! Сам пробовал ?

Петр: Тестирую, вроде работает хорошо К тому же я обнаружил, что если скачать libcurl.dll с поддержкой SSL, то путем нехитрых манипуляций можно получить как бонус crypto возможности - aes, blowfish, idea. Иногда бывает полезно.

Dima: Петр Если не сложно , бо я не совсем въехал , покажи с нуля как получить список файлов текущей директории на Ftp с помощью hbcurl. Спасибо !

Петр: Чуть не написал, см. contrib\curl\test Но потом вспомнил, что ты же xHarbour юзаешь. Посмотрел xHarbour - там порт очень обрезанный и пример такой же куцый.. Даже не понятно, как юзеры библиотеку собирать будут. Пример (может и не заработать). [pre2]#include "hbcurl.ch" #include "common.ch" #include "fileio.ch" FUNCTION Main( cDL ) LOCAL curl LOCAL info LOCAL tmp LOCAL tmp1 LOCAL f LOCAL lVerbose := .F. ? curl_version() ? "INIT:", curl_global_init() IF ! Empty( curl := curl_easy_init() ) DEFAULT cDL TO "ftp://ftp.cisco.com/" /* Now let's download a dirlist to memory */ ? curl_easy_setopt( curl, HB_CURLOPT_DOWNLOAD ) ? curl_easy_setopt( curl, HB_CURLOPT_DIRLISTONLY ) ? curl_easy_setopt( curl, HB_CURLOPT_URL, cDL ) ? curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, .F. ) ? curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYHOST, .F. ) ? curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) ? curl_easy_setopt( curl, HB_CURLOPT_PROGRESSBLOCK, {| nPos, nLen | a := CurGet(), DispOutAt( 11, 10, Str( ( nPos / nLen ) * 100, 6, 2 ) + "%" ), CurSet( a ) } ) ? curl_easy_setopt( curl, HB_CURLOPT_NOPROGRESS, .F. ) ? curl_easy_setopt( curl, HB_CURLOPT_VERBOSE, lVerbose ) ? "DOWNLOAD DIRLIST TO STRING:", curl_easy_perform( curl ) ? "RESULT 1: " + curl_easy_dl_buff_get( curl ) ? curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_GET, @tmp ) ? "RESULT 2: " + tmp /* Cleanup session */ curl_easy_cleanup( curl ) ENDIF curl_global_cleanup() RETURN NIL STATIC FUNCTION CurGet() RETURN { Row(), Col() } STATIC PROCEDURE CurSet( a ) SetPos( a[ 1 ], a[ 2 ] ) RETURN [/pre2] P.S. HbCurl был изначально портирован в xHarbour и лишь потом в Harbour. Но был существенно переработан. Я думаю не составит труда портировать его обратно. Бегло просмотрев исходник заметил, что hb_storclen_buffer нужно заменить на hb_storclenAdopt, а так вроде бы все должно быть нормально.

Петр: Все оказалось очень просто Нужно скачать исходники Harbour Если не хочется качать все и есть под рукой такая программа, как Download Master, то сначала выбираем функцию просмотра zip архива, выбираем нужные файлы: hbcurl.c hbcurl.ch и пример ftp_uldl.prg и затем скачиваем. Бросаем это в xHarbour\contrib\hbcurl (предварительно удалив все оттуда). В hbcurl.c где-то после #include "hbcurl.ch" добавляем [pre2]#if defined( __XHARBOUR__ ) # define HB_FHANDLE FHANDLE # define hb_retc_null() hb_retc( (char*) NULL ) # define hb_storclen_buffer hb_storclenAdopt #endif [/pre2] Компилируем библиотеку с помощью make_b32.bat [pre2]@echo off set CURL_DIR=e:\extlib\curl if not exist %CURL_DIR%\bin\libcurl.dll goto NODLL if not exist .\lib md .\lib if not exist .\obj md .\obj if "%1" == "clean" goto CLEAN if "%1" == "CLEAN" goto CLEAN make -fmakefile.bc %1 %2 %3 >make_b32.log if errorlevel 1 goto error goto copy_files :error echo there is an error on make files notepad make_b32.log goto end :clean if exist lib\*.bak del .\lib\*.bak if exist lib\*.def del .\lib\*.def if exist lib\*.lib del .\lib\*.lib if exist obj\*.obj del .\obj\*.obj if exist *.log del *.log goto End :copy_files impdef -a lib\libcurl.def %CURL_DIR%\bin\libcurl.dll implib -a lib\libcurl.lib lib\libcurl.def copy lib\*.lib ..\..\lib copy *.ch ..\..\include goto end :NODLL echo. echo.Missing libcurl.dll, please download it echo.Make aborted. echo. :end if exist *.tds del *.tds if exist *.map del *.map [/pre2] makefile.bc [pre2] # makefile for Borland C/C++ 32 bits # Building of hbcurl.lib INCLUDE_DIR = ..\..\include;$(CURL_DIR)\include OBJ_DIR = obj LIB_DIR = lib $(LIB_DIR)\hbcurl.lib : \ $(OBJ_DIR)\hbcurl.obj $(OBJ_DIR)\hbcurl.obj : hbcurl.c .c.obj: bcc32 $(CLIBFLAGS) -c -O2 -I$(INCLUDE_DIR) -o$@ $< tlib $(LIB_DIR)\hbcurl.lib -+$@,, [/pre2]

Dima: Петр пишет: Бросаем это в xHarbour\contrib\hbcurl (предварительно удалив все оттуда). В hbcurl.c где-то после #include "hbcurl.ch" добавляем #if defined( __XHARBOUR__ ) # define HB_FHANDLE FHANDLE # define hb_retc_null() hb_retc( (char*) NULL ) # define hb_storclen_buffer hb_storclenAdopt #endif Все сделал , во время сборки получаем MAKE Version 5.2 Copyright (c) 1987, 2000 Borland Error makefile.bc 11: Command syntax error Error makefile.bc 13: Command syntax error Error makefile.bc 15: Command syntax error Error makefile.bc 16: Command syntax error Error makefile.bc 16: Command syntax error *** 5 errors during make ***

Dima: С этим разобрался. Теперича получаем Error E2209 hbcurl.c 55: Unable to open include file 'curl/curl.h' Error E2209 hbcurl.c 56: Unable to open include file 'curl/types.h' Error E2209 hbcurl.c 57: Unable to open include file 'curl/easy.h' Error E2209 hbcurl.c 58: Unable to open include file 'curl/multi.h' Где их брать эти .H ?

Петр: Ты curl скачал и установил set CURL_DIR=e:\extlib\curl

Dima: Петр пишет: Ты curl скачал и установил я скачал сырцы harbour , где качать curl ? :)

Петр: Здесь

Dima: Петр Спасибо , правда я и сам уже нашел. Все собралось ! ;) PS Век живи , век учись ;)

Dima: Твой примерчик собрался ;) Однако получение списка файлов так же медленновато работает.......

Петр: Dima пишет: Однако получение списка файлов так же медленновато работает....... Многое зависит от сервера..

Dima: Петр пишет: Многое зависит от сервера.. Таки да ;) Проверил на своем FTP , получил список моментально. А как проверить наличие файла по маске , ну скажем Z_*.zip. Разумеется что я могу проанализировать полученный DIR , но все же интерестно , есть ли такое... PS И все же минус есть у curl , вместе с приложением нужно не забывать давать 5 dll файлов

Петр: Наверное есть такая возможность, я еще просто не докопался Это очень маленький минус. Во первых можно пользоваться инсталяторами и оно будет автоматически все упаковываться. Во-вторых если не нужно к примеру SSL или ZIP, можно скачав сырцы перекомпилировать libcurl под свои нужды и использовать одну лишь libcurl.dll (около 400 kb). Но вдруг завтра тебе захочется узнать не только есть ли такой zip архив на сервере, но и узнать его содержимое и скачать определенный файл из архива - вот тут тебе zlib1.dll пригодится и т.д. В-третьих ты можешь попробовать скомпилировать приложение с статической библиотекой libcurl.lib (нужны исходники). Я статическую линковку не пробовал, но библиотеку перекомпилировал с помощью MinGW, Borland 5.8.2 и MSVC 8.0 без всяких проблем.

Петр: Ну и совсем забыл, если завтра тебе будет нужно перенести приложение на Linux или HPUX - тебе не придется ничего менять, абсолютно.

Dima: Петр Убедил !!! Придется привыкать к DLL .

Dima: Harbour 3.2 / Mingw Пытаюсь собрать hbcurl вот таким батником [pre2] set PATH=C:\MinGW\bin set HB_INSTALL_PREFIX=c:\hb32mingw set HB_DIR_CURL=c:\curl c:\hb32mingw\bin\hbmk2 hbcurl.hbp [/pre2] Получаю C:\svn\harbour-trunk\harbour\contrib\hbcurl>c:\hb32mingw\bin\hbmk2 hbcurl.hbp hbmk2: Building sub-project (level 2): hbcurls.hbp hbmk2: Warning: Missing dependency: curl что ему надо ? ;)

AlexMyr: Dima пишет: set HB_DIR_CURL=c:\curl знаю, что надо вот так SET HB_WITH_CURL=C:\curl\include

Dima: AlexMyr Та же ошибка

AlexMyr: В папке hbcurl создал батник SET HB_WITH_CURL=C:\curl\include hbmk2 hbcurl.hbp запустил, все норм (есть варнинг). C:\dev\_git\core\contrib\hbcurl>hbmk2 hbcurl.hbp hbmk2: Building sub-project (level 2): hbcurls.hbp hbmk2: Dependency 'curl' found: C:\curl\include hbmk2: Compiling... hbmk2: Creating static library... libhbcurls.a hbmk2: Dependency 'curl' found: C:\curl\include hbmk2[hbcurl]: Warning: No import library sources were found. hbmk2: Compiling Harbour sources... Harbour 3.2.0dev (r1304222205) Copyright (c) 1999-2013, http://harbour-project.org/ Compiling 'hbcurl.hbx'... Lines 50, Functions/Procedures 1 Generating C source output to '.hbmk\win\mingw\hbcurl\hbcurl.c'... Done. hbmk2: Compiling... hbmk2: Creating static library... libhbcurl.a

AlexMyr: Да, и cUrl брал тут <http://curl.haxx.se/>

Dima: Начнем с начала. Как собрать CURL из исходников под MINGW ? Сырцы брал тут http://curl.haxx.se/snapshots/curl-7.30.1-20130425.zip

AlexMyr: Зайти в папку curl и дать команду "mingw32-make mingw32"

Dima: AlexMyr пишет: Зайти в папку curl и дать команду "mingw32-make mingw32" mingw32-make не нашел такого Сделал так c:\mingw\bin\make mingw32 Получил C:\curl>c:\mingw\bin\make mingw32 c:/mingw/bin/make.EXE -C lib -f Makefile.m32 make.EXE[1]: Entering directory `C:/curl/lib' gcc -I. -I../include -g -O2 -Wall -fno-strict-aliasing -DBUILDING_LIBCURL -c file.c gcc: error: CreateProcess: No such file or directory make.EXE[1]: *** [file.o] Error 1 make.EXE[1]: Leaving directory `C:/curl/lib' make.EXE: *** [mingw32] Error 2

Dima: вот так заработало из батника set path=C:\MinGW\bin\ c:\mingw\bin\make mingw32

AlexMyr: Я использую C:\>gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1- with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.7.2 (GCC) и там есть стандартная make утилита mingw32-make Dima пишет: Сделал так c:\mingw\bin\make mingw32 Вот что напмсано в curl/docs/INSTALL MingW32 ------- Make sure that MinGW32's bin dir is in the search path, for example: set PATH=c:\mingw32\bin;%PATH% then run 'mingw32-make mingw32' in the root dir.

AlexMyr: Dima пишет: вот так заработало из батника правильно, молодец.

Dima: AlexMyr Cобралось вроде , но hbcurl собрать не могу ))) Что за на фиг...... C:\svn\harbour-trunk\harbour\contrib\hbcurl>c:\hb32mingw\bin\hbmk2 hbcurl.hbp hbmk2: Building sub-project (level 2): hbcurls.hbp hbmk2: Warning: Missing dependency: curl Батник set PATH=C:\MinGW\bin set HB_INSTALL_PREFIX=c:\hb32mingw set HB_DIR_CURL=c:\curl\include c:\hb32mingw\bin\hbmk2 hbcurl.hbp

Dima: ага ей строки не хватало set HB_WITH_CURL=c:\curl\include

AlexMyr: set PATH=%PATH%;C:\MinGW\bin;c:\hb32mingw\bin\ set HB_WITH_CURL=c:\curl\include hbmk2 hbcurl.hbp запускать из C:\svn\harbour-trunk\harbour\contrib\hbcurl

Dima: Да заработало , спасибо за помощь ! А как бы так обойтись без libcurl.dll , ну что бы она как бы встроена была в мой EXE ? Я готов мириться с DLL от закрытых продуктов где исходники не предоставляются , таких как Abee PagesScirpt , Advantage DataBase Server. Но тут ведь и исходники есть и вероятно что то можно с этим придумать ;) Пробовал собирать приложение с библой HBCURLS , но все равно после запуска требует DLL

Dima: AlexMyr пишет: и там есть стандартная make утилита mingw32-make Не понял где ;) C:\MinGW\bin>gcc.exe -v Using built-in specs. COLLECT_GCC=C:\MinGW\bin\gcc.exe COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/i686-pc-mingw32/4.7.2/lto-wrapper.exe Target: i686-pc-mingw32 Configured with: ../src/configure --prefix=/c/temp/gcc/dest --with-gmp=/c/temp/gcc/gmp --with-mpfr=/c/temp/gcc/mpfr --wi th-mpc=/c/temp/gcc/mpc --enable-languages=c,c++ --with-arch=i686 --with-tune=generic --disable-libstdcxx-pch --disable-n ls --disable-shared --disable-sjlj-exceptions --disable-win32-registry --enable-checking=release --enable-lto Thread model: win32 gcc version 4.7.2 (GCC) MINGW я брал уже готовый тут

AlexMyr: Dima пишет: Не понял где ;) Вот вывод dir c:\mingw\bin\min*.exe Содержимое папки c:\mingw\bin 26.04.2012 03:31 45 568 mingw-get.exe 16.10.2012 16:45 11 776 mingw32-cc.exe 16.10.2012 16:45 11 776 mingw32-gcc-4.7.2.exe 16.10.2012 16:45 11 776 mingw32-gcc.exe 02.09.2012 04:42 219 662 mingw32-make.exe 5 файлов 300 558 байт Dima пишет: Сырцы брал тут http://curl.haxx.se/snapshots/curl-7.30.1-20130425.zip Снова читал readme.md и вычитал, что нужно curl-devel, скачал http://curl.haxx.se/gknw.net/7.30.0/dist-w32/curl-7.30.0-devel-mingw32.zip пересобрал harbour, в логе такая штука hbmk2: Created import library: ..\lib\win\mingw\liblibcurl.a <= C:\curl\bin\libcurl.dll т.е. заганяем все из .dll в .а пример в hbcurl\tests\ собрался, но дома на висте падает, завтра на работе проверю на xp. Dima пишет: MINGW я брал уже готовый тут я тут http://sourceforge.net/projects/mingw/files/latest/download?source=files

Dima: AlexMyr пишет: пример в hbcurl\tests\ собрался И у меня , вот только снова хочет DLL зы Hbcurl пересобрал с curl-devel

AlexMyr: Пересобрал заново harbour с curl-devel, собрал пример func main() ? "curl_version()" ? curl_version() return nil запустил, черный экран, выход. Надо дальше разбираться. Dima пишет: вот только снова хочет DLL а что конкретно хочет, что выводит на экран?

Dima: AlexMyr пишет: а что конкретно хочет, что выводит на экран? Виндовое окошко в нем "Приложению не удалось запуститься , поскольку libcurl.dll не был найден"

Dima: Где бы почитать о функциях CURL да на русском языке ? Поиск в гугле нормального результата не дал. Собственно не так много и надо. Подключится к FTP Установить активный или пассивный режим передачи Получить LIST Сменить директорию Скачать файл Закачать файл Удалить файл Переименовать файл Отключиться от FTP

AlexMyr: На win98 тоже сказал что нет dll, положил след. libcurl dll libeay32 dll libidn-11 dll ssleay32 dll zlib1 dll начало работать. На winxp черный экран и завершается, тоже положил dll-ки в папку с прогой, заработало. Или в системе уже должен стоять дистр cUrl, или тягать за собой эти dll-ки. Или еще копать глубже.

Dima: AlexMyr пишет: Или еще копать глубже Достаточно. Бум тягать с собой libcurl.dll Спасибо за тесты !

Dima: Дошли рученки снова до HBCURL. С получением LIST , вроде все понятно. Получаю так (как по маске получить так и не понял) [pre2] #include "hbcurl.ch" #include "common.ch" FUNCTION Main( cDL ) LOCAL curl LOCAL a curl_global_init() IF ! Empty( curl := curl_easy_init() ) DEFAULT cDL TO "ftp://194.77.77.77/" *W_99^[sklad]#E3EA33012.zip curl_easy_setopt( curl, HB_CURLOPT_DOWNLOAD ) curl_easy_setopt( curl, HB_CURLOPT_DIRLISTONLY) curl_easy_setopt( curl, HB_CURLOPT_USERPWD, "userok:parolik" ) curl_easy_setopt( curl, HB_CURLOPT_URL, cDL ) curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) curl_easy_setopt( curl, HB_CURLOPT_PROGRESSBLOCK, {| nPos, nLen | a := CurGet(), DispOutAt( 11, 10, Str( ( nPos / nLen ) * 100, 6, 2 ) + "%" ), CurSet( a ) } ) curl_easy_setopt( curl, HB_CURLOPT_NOPROGRESS, .f. ) curl_easy_perform( curl ) //DOWNLOAD DIRLIST TO STRING ? curl_easy_dl_buff_get( curl ) curl_easy_cleanup( curl ) ENDIF curl_global_cleanup() RETURN NIL STATIC FUNCTION CurGet() RETURN { Row(), Col() } STATIC PROCEDURE CurSet( a ) SetPos( a[ 1 ], a[ 2 ] ) RETURN [/pre2] Не могу разобраться как скачать файл с FTP. Может кто то показать ?

Dima: Методом тыка разобрался. Стал разбираться с заливкой на FTP. Файл наливается но по размеру становится ровно в 2 раза больше . Вот код для заливки (только часть что касается заливки) Что не так делаю ? Проверял на текстовых файлах , там все нормально. [pre2] ? curl_easy_setopt( curl, HB_CURLOPT_UPLOAD ) curl_easy_setopt( curl, HB_CURLOPT_USERPWD, "login:passik" ) ? curl_easy_setopt( curl, HB_CURLOPT_URL, cdl+"/w.zip" ) ? curl_easy_setopt( curl, HB_CURLOPT_UL_FILE_SETUP,hb_CurDrive()+":\"+CurDir()+"\"+"w.zip" ) ? curl_easy_setopt( curl, HB_CURLOPT_INFILESIZE, hb_FSize( hb_CurDrive()+":\"+CurDir()+"\"+"w.zip" ) ), hb_FSize( hb_CurDrive()+":\"+CurDir()+"\"+"w.zip" ) ? curl_easy_setopt( curl, HB_CURLOPT_PROGRESSBLOCK, {| nPos, nLen | a := CurGet(), hb_DispOutAt( 10, 10, Str( ( nPos / nLen ) * 100, 6, 2 ) + "%" ), CurSet( a ) } ) ? curl_easy_setopt( curl, HB_CURLOPT_NOPROGRESS, 0 ) ? curl_easy_setopt( curl, HB_CURLOPT_POSTQUOTE, { "RNFR " + "w.zip", "RNTO " + "w2.zip" } ) ? "UPLOAD FILE:", curl_easy_perform( curl ) [/pre2]

Dima: Dima пишет: Стал разбираться с заливкой на FTP. Проехали , мой глюк.

Dima: При загрузке файла с ФТП если в имени есть символы # или ^ или [ или ] или все вместе то выдается ошибка 78 Какой опцией LIBCURL это можно починить ?

Dima: А есть ли в LIBCURL аналог опции --globoff из CURL.EXE ? Гугл на запрос +libcurl +globoff молчит как партизан........

Softlog86: Подскажите последовательность действий чтоб сгенерировать LIBCURL на машине с WIN_XP . Borland C 5.5 , MiniGui . Чёт я запутался при установке всех пакетов и т д .... У меня всё выглядит так : C:\Borland\BCC55 C:\MiniGUI\.... Тут MiniGui C:\MiniGUI\HARBOUR Тут Harbour



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