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

FTP как получить полную дату и время файла ?

MIKHAIL: ::list()[pre] -rw-r--r-- 1 login_1 hosting 17408 Dec 4 09:34 reestr.xls -rw-r--r-- 1 login_1 hosting 24064 Dec 12 2018 rko.xls -rw-r--r-- 1 login_1 hosting 18432 Apr 12 2019 sale.xls -rw-r--r-- 1 login_1 hosting 17408 Apr 19 15:38 schet.xls -rw-r--r-- 1 login_1 hosting 16384 May 11 16:40 sms.xls[/pre] ::listFiles() [pre] reestr.xls 17408 / / 09:34 -rw-r--r-- 1 login_1 hosting rko.xls 24064 12/12/18 -rw-r--r-- 1 login_1 hosting sale.xls 18432 12/04/19 -rw-r--r-- 1 login_1 hosting schet.xls 17408 19/04/21 15:38 -rw-r--r-- 1 login_1 hosting sms.xls 16384 11/05/21 16:40 -rw-r--r-- 1 login_1 hosting [/pre] TotalCommander[pre] reestr.xls 17 408 04.12.2020 09:34 -644 rko.xls 24 064 12.12.2018 17:42 -644 sale.xls 18 432 12.04.2019 21:40 -644 schet.xls 17 408 19.04.2021 15:38 -644 sms.xls 16 384 11.05.2021 16:40 -644[/pre] ftp [pre] -rw-r--r-- 1 login_10 hosting 17408 Dec 4 09:34 reestr.xls -rw-r--r-- 1 login_10 hosting 24064 Dec 12 2018 rko.xls -rw-r--r-- 1 login_10 hosting 18432 Apr 12 2019 sale.xls -rw-r--r-- 1 login_10 hosting 17408 Apr 19 15:38 schet.xls -rw-r--r-- 1 login_10 hosting 16384 May 11 16:40 sms.xls [/pre] Как это делает TotalCommander ?

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

Dima: Чекнул у себя. Действительно , если у файла не текущий год , тогда в LIST теряется время. Если год текущий тогда передаст что то типа Apr 19 15:38 А если нет то Apr 19 2019 и время теряется...... MIKHAIL пишет: Как это делает TotalCommander ? Возможно он дополнительно по каждому файлу делает MDTM Syntax: MDTM remote-filename Возврат в формате "YYYYMMDDhhmmss"

MIKHAIL: Dima пишет: Возможно он дополнительно по каждому файлу делает MDTM Syntax: MDTM remote-filename Возврат в формате "YYYYMMDDhhmmss" Да, тоже нагуглил пока только так наверное нужно ее использовать через METHOD UserCommand( cCommand, lPasv, lReadPort, lGetReply ) CLASS TIPClientFTP ?

Dima: MIKHAIL пишет: Да, тоже нагуглил пока только так Поэтому можно делать укороченный лист NLST + по этому массиву имен MDTM


MIKHAIL: Dima пишет: Поэтому можно делать укороченный лист NLST + по этому массиву имен MDTM через METHOD UserCommand( cCommand, lPasv, lReadPort, lGetReply ) CLASS TIPClientFTP ?

Dima: думаю да если мы про HBTIP , я его не юзаю больше и пересел на HBCURL

MIKHAIL: Dima пишет: пересел на HBCURL а в чем его преимущество,можно вкратце ?

Dima: MIKHAIL пишет: а в чем его преимущество,можно вкратце ? быстрее и надежнее

Dima: Dima пишет: Поэтому можно делать укороченный лист NLST + по этому массиву имен MDTM Был не прав и менее затратный вариант такой. Получаем LISTFILES и затем ходим по этому массиву и где время пустое , там запрашиваем MDTM (вытаскиваем время) и ложим в этот же массив на место пустого времени

Dima: Покопал слегка. Есть еще MLSD. Надо разбираться что живет в modify Пример type=file;size=433;modify=20200213145801; F_4696_36444.ZIP type=file;size=435;modify=20210213145801; F_4764_36446.ZIP

Петр: Dima пишет: Надо разбираться что живет в modify Синхронизация каталогов и FTP-серверов с MLSD

MIKHAIL: Dima пишет: Есть еще MLSD чет в обычном ftp не работает ни MLSD ни MDTM и ::usercommand() не удается заставить работать а в curl как это работает ? есть примеры посмотреть ?

Dima: MIKHAIL пишет: ::usercommand() не удается заставить работать Та же фигня....... Пример сейчас дам [pre2] #include "hbcurl.ch" proc main Local aftpPar curl_global_init() aftpPar:=LoadNastrFtp() // загружаем настройки FTP из базы ? TestMLSD(aftpPar[6],aftpPar[4],aftpPar[5],aftpPar[14]) curl_global_cleanup() return ************ FUNCTION TestMLSD( cserver,cuser,cpassword,nport,rdir) LOCAL cUrl LOCAL lRet := .f. Local Cftp:="ftp://"+cserver+":"+hb_ntos(nport) local nerr curl := curl_easy_init() if empty(curl) ? "Bad curl_easy_init" return lRet endif do while .t. curl_easy_setopt( curl, HB_CURLOPT_DOWNLOAD ) curl_easy_setopt( curl, HB_CURLOPT_URL, cftp ) curl_easy_setopt( curl, HB_CURLOPT_USERPWD,cuser+":"+cpassword) curl_easy_setopt( curl, HB_CURLOPT_FTP_USE_EPSV,0) // 0 PASV 1 EPASV curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) if !empty(rdir) curl_easy_setopt( curl, HB_CURLOPT_QUOTE, { "CWD "+rdir} ) endif curl_easy_setopt( curl, HB_CURLOPT_CUSTOMREQUEST,"MLSD") nerr:=curl_easy_perform( curl ) if nerr#0 ? "CurlError "+hb_ntos(nerr) exit endif strfile(curl_easy_dl_buff_get( curl ),"lst.log") exit enddo curl_easy_cleanup( curl ) RETURN lRet [/pre2] PS У меня Gene6 FTP Server и он понимает MLSD

MIKHAIL: Dima а что нужно подключить что бы собралось ? Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_curl_global_init_mem' referenced from D:\HB\LIB\WIN \BCC\HBCURL.LIB|core Error: Unresolved external '_curl_global_cleanup' referenced from D:\HB\LIB\WIN\ BCC\HBCURL.LIB|core .......

Петр: MIKHAIL пишет: а что нужно подключить что бы собралось ? libcurl.lib

Dima: MIKHAIL Фиг знает не скажу , у меня MINGW. Это я про сборку либы. Собираю таким батником (который поселил в папку с сырцом HBCURL) set PATH=%PATH%;C:\MinGW12\bin;c:\hb32mingw19\bin\ set HB_WITH_CURL=c:\curl\7761\include set HB_STATIC_CURL=yes c:\hb32mingw19\bin\hbmk2 hbcurl Петр пишет: libcurl.lib Скорее всего так и есть !

Петр: Нужно подключать библиотеку импорта Для MINGW это делается примерно так: @echo off setlocal set PATH=c:\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin rem -v --verbose rem -d --input-def rem -l --output-lib rem -y --output-delaylib dlltool -v -d libcurl-x64.def -l liblibcurl-x64.a dlltool -v -d libcurl-x64.def -y liblibcurld-x64.a endlocal libcurl-x64.def берем из curl-7.76.1-win64-mingw\bin\libcurl-x64.def (ну это у меня так) имя liblibcurl-x64 можем задать любое (здесь лучше без фанатизма). Для bcc используется implib

Петр: И еще. Поскольку libcurl-x64.def содержит только секцию EXPORTS, его нужно отредактировать добавив секцию LIBRARY [pre2]LIBRARY libcurl-x64 EXPORTS curl_easy_cleanup @1[/pre2]

Петр: Dima пишет: Та же фигня....... А вот здесь (ftp.funet.fi/pub/) работает [pre2] #include "hbcurl.ch" #define CURL_HTTP_VERSION_2TLS 4 PROCEDURE Main() LOCAL curl, aTmp, a, rDir := "" LOCAL nCURLCode curl_global_init() IF ! Empty( curl := curl_easy_init() ) curl_easy_setopt( curl, HB_CURLOPT_BUFFERSIZE, 102400 ) curl_easy_setopt( curl, HB_CURLOPT_URL, "ftp.funet.fi/pub/" ) curl_easy_setopt( curl, HB_CURLOPT_NOPROGRESS, .T. ) curl_easy_setopt( curl, HB_CURLOPT_USERAGENT, "curl/7.75.0" ) curl_easy_setopt( curl, HB_CURLOPT_MAXREDIRS, 50 ) curl_easy_setopt( curl, HB_CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS ) curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, .F. ) curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYHOST, .F. ) curl_easy_setopt( curl, HB_CURLOPT_FTP_USE_EPSV, .F. ) /* please ignore the IP in the PASV response */ curl_easy_setopt( curl, HB_CURLOPT_FTP_SKIP_PASV_IP, .T. ) curl_easy_setopt( curl, HB_CURLOPT_FTP_FILEMETHOD, 3 ) curl_easy_setopt( curl, HB_CURLOPT_TCP_KEEPALIVE, .T. ) curl_easy_setopt( curl, HB_CURLOPT_CUSTOMREQUEST, "MLSD" ) IF ! Empty( rDir ) curl_easy_setopt( curl, HB_CURLOPT_QUOTE, { "CWD " + rDir } ) ENDIF curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) nCURLCode := curl_easy_perform( curl ) IF nCURLCode == HB_CURLE_OK ? "EFFECTIVE URL:", curl_easy_getinfo( curl, HB_CURLINFO_EFFECTIVE_URL ) cTmp := curl_easy_dl_buff_get( curl ) aTmp := hb_ATokens( cTmp, hb_eol() ) FOR EACH a IN aTmp IF hb_LeftEq( a, "type=dir" ) ? a ENDIF NEXT ELSE ? nCURLCode, ":", curl_easy_strerror( nCURLCode ) ENDIF /* Cleanup session */ curl_easy_cleanup( curl ) ENDIF curl_global_cleanup() RETURN [/pre2]

Dima: Петр пишет: А вот здесь (ftp.funet.fi/pub/) работает так это я про hbtip писал и usercommand

Петр: Dima пишет: так это я про hbtip писал и usercommand Понял, lReadPort := .t. lGetReply := .t. if ftp:UserCommand( "MLSD", lPasv, @lReadPort, @lGetReply ) ? lReadPort ? lGetReply ... endif и так не работает ?

Dima: Петр пишет: и так не работает ? Нет. Сервер выдал 500 Unknown command Программа "долго" висела на UserCommand и после получил ftp:UserCommand( "MLSD", lPasv, @lReadPort, @lGetReply ) // .T. lReadPort // NIL lGetReply // .F. Под HBCURL все работает нормально

Dima: Петр пишет: curl_easy_setopt( curl, HB_CURLOPT_FTP_FILEMETHOD, 3 ) я что то разницы не заметил между CURLFTPMETHOD_SINGLECWD и CURLFTPMETHOD_MULTICWD (по умолчанию) в плане скорости Петр пишет: curl_easy_setopt( curl, HB_CURLOPT_USERAGENT, "curl/7.75.0" ) для FTP не работает и не должно Петр пишет: curl_easy_setopt( curl, HB_CURLOPT_FTP_SKIP_PASV_IP, .T. ) с этой штукой на мобильном киевстаре , глюков еще больше , кроме 28 ошибки , еще и ошибка передачи , при PASV естественно

Dima: Dima пишет: Нет. Сервер выдал 500 Unknown command Программа "долго" висела на UserCommand и после получил ftp:UserCommand( "MLSD", lPasv, @lReadPort, @lGetReply ) // .T. Вот так заработало oftp:UserCommand("MLSD"+CRLF ................ Но думает очень долго (пробовал и с другими командами)

Петр: Dima пишет: oftp:UserCommand("MLSD"+CRLF в UserCommand забыли добавить ::inetSendAll( ::SocketCon, hb_defaultValue( cCommand, "" ) + ::cCRLF ) А может и специально так.

Dima: Петр Петр пишет: Метод UserCommand автоматом не добавляет перевод строки ( + ::cCRLF ). Оказывается это мы еще поняли в 2016 году в теме http://clipper.borda.ru/?1-4-0-00001145-000-0-0-1471685166

Dima: MIKHAIL Разобрался с HBCURL и MLSD ?

Dima: Dima пишет: ftp:UserCommand( "MLSD", lPasv, @lReadPort, @lGetReply ) Вот так надо что бы не "висела" команда и тогда всё работает шустро lGetReply :=.F. oftp:UserCommand( "MLSD"+CRLF, lPasv, @lReadPort, @lGetReply )

MIKHAIL: Dima пишет: Разобрался с HBCURL и MLSD ? нет пока HBCURL пока не брался, не понял как импортировать библиотеку, да и переделывать много не хочется, только timestamp файла и нужно получать... пробовал по разному usercommand, начала работать, но в переменные по ссылке всегда возвращает либо ничего либо логическое значение, но как то странно что в ::cReply иногда выскакивает timestamp иногда что то другое, нет стабильности и долго обрабатывает MDTM, в общем еще разбираюсь...

Dima: MIKHAIL пишет: начала работать, но в переменные по ссылке всегда возвращает либо ничего либо логическое значение Какой FTP сервер ? PS Могу проверить от себя если надо под HBTIP и HBCURL Если что данные для входа в личку кидай Обещаю ни чего не ломать и не строить

MIKHAIL: Dima пишет: Какой FTP сервер ? в логах Server (Sun Solaris 9i), написал в их техподдержку , что то у них там случилось, целый день ковыряют, как сделают проверю, если не получиться скину учетку на тест в личку

Dima: MIKHAIL ok

MIKHAIL: Dima MDTM заработало все норм, я не знал что смотреть ответ в ::cReply нужно ... MLSD так и не заработала через ::usercommand(), что то там не то, скопировал класс, написал свой метод, тогда заработал. Но как я понял, он работает по входящему порту в активном режиме, а за NAT работать скорее всего не будет, так что только MDTM можно использовать А как можно добавить метод к существующему классу что бы не копировать его полностью ? __objAddMethod можно добавить функцию, но в ней не доступны переменные класса

Dima: MIKHAIL Попробуй посмотреть https://www.kresin.ru/hrbfaq_3.html На странице ищи __objAddMethod

MIKHAIL: Dima пишет: На странице ищи __objAddMethod так я об этом и писал, там можно добавить функцию, но в самой функции переменных класса не видно, либо я что то не так делаю....

Dima: а пробни через CURL.EXE curl.exe -u LOGIN:PASS -s ftp://твойFTP -X MLSD PS Curl тут https://curl.se/download.html

SergKis: MIKHAIL Local o := QSelf() должно помочь или просто сделайте свой класс наследуя от TIPClientFTP, т.е. CLASS myFTP TIPClientFTP INHERIT TIPClientFTP DATA ... METHOD New( oUrl, xTrace, oCredentials ) INLINE ( ::Super:New( oUrl, xTrace, oCredentials ), Self ) METHOD myMethod() CLASS myFTP END CLASS METHOD myMethod() CLASS myFTP ... RETURN Self

SergKis: CLASS myFTP TIPClientFTP INHERIT TIPClientFTP это лишнее, не убрал Дима, что то у меня опять пропала возможность править пост

Dima: SergKis пишет: Дима, что то у меня опять пропала возможность править пост я ни чего не трогал в твоей учётке. Могу модераторские полномочия предложить только :)

SergKis: Dima пишет Могу модераторские полномочия предложить только :) Может и не надо, со временем стало туговато, захожу не так часто. Как говориться "и так сойдет"

Dima: SergKis пишет: Как говориться "и так сойдет" Глянул учетку , у тебя пол не определён , выбрано нет , может в этом дело ?

SergKis: Dima пишет Глянул учетку , у тебя пол не определён , выбрано нет , может в этом дело ? Так у нас тут все автоматом "среднего рода" особенно министры ... Так что это влиять не должно, иначе программа неправильная

MIKHAIL: Dima пишет: а пробни через CURL.EXE curl.exe -u LOGIN:PASS -s ftp://твойFTP -X MLSD работает, но как я уже писал, я метод MLSD написал рабочий, но буду MDTM использовать SergKis пишет: Local o := QSelf() точно!

SergKis: Дима, точно, программа неправильная (тут ЕвроЖопа, учитывать надо), поставил пол и все кнопки вернулись.

Dima: SergKis Жесть , написал смеха ради а оно вон как вышло то

Dima: MIKHAIL пишет: работает, но как я уже писал, я метод MLSD написал рабочий, но буду MDTM использовать я тебя понял а писал к тому что может есть смысл разобраться как собрать HBCURL под BCC и юзать его , но тебе виднее.



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