Форум » [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 и так не работает ?



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