Форум » [x]Harbour » Проверка файлов на crc/md5 на FTP-сервере? » Ответить

Проверка файлов на crc/md5 на FTP-сервере?

Eduard: Если в библиотеке hbtip функции проверки файлов на фтп? Если нету, то как можно средствами харбора организовать такую проверку? В харборе есть две функции для вычисления контрольных чисел (hb_md5file, hb_crc32) с помощью них я получаю контрольное число файла до передачи на фтп-сервер, как организовать такую же проверку, но только на фтп-сервере? Сервер поддерживает команды XCRC, XMD5

Ответов - 11

Dima: MD5 врядли получишь , но вот размер можно. Посему имея размер исходного файла и его размер после заливки на FTP , их можно сравнить. Впрочем можно самостоятельно дописать нужный класс в Harbour если что. ЗЫ Это я про HBTIP писал Но есть HBCURL и там возможностей больше , может там и есть такое ....

Петр: Dima пишет: Это я про HBTIP писал У класса TIPClientFTP есть метод UserCommand( cCommand, lPasv, lReadPort, lGetReply ) Eduard пишет: Сервер поддерживает команды XCRC, XMD5 Можно попробовать

Петр: [pre2]XCRC "filename" SP EP Вычисляет контрольную сумму CRC32 файла filename от SP до EP. SP - Начальная точка в байтах EP - Конечная точка в байтах Ответы сервера : 250 501 Bad or missing parameters. 504 Command not implemented for the specified argument. XMD5 "filename" SP EP Вычисляет контрольную сумму MD5 файла filename от SP до EP. SP - Начальная точка в байтах EP - Конечная точка в байтах Ответы сервера : 250 501 Bad or missing parameters. 504 Command not implemented for the specified argument.[/pre2] Это для Gene 6. 250 скорее всего [pre2] The response is 250 - XCRC XXXXXXXX Where XXXXXXXX is the computed checksum.[/pre2]


Eduard: Что означают данные параметры в этой функции, что туда надо писать или их можно пропустить (последние 3)? UserCommand( XCRC File 1 100, lPasv, lReadPort, lGetReply ) Еще по ходу, скажите правильно ли я написал данную функцию ? METHOD XCRC(cFile, cStart, cEnd) CLASS TIPClientFTP ::inetSendAll( ::SocketCon, "XCRC " + cFile + cStart + cEnd + ::cCRLF ) RETURN ::GetReply()

Петр: Eduard пишет: Что означают данные параметры в этой функции, что туда надо писать или их можно пропустить (последние 3)? UserCommand( XCRC File 1 100, lPasv, lReadPort, lGetReply ) XCRC File 1 100 - а, что это такое? Смотрите исходники, в вашем случае if (ftp1:UserCommand( 'XCRC "Filename" 0 -1', .f. /* или .t. - х-з что у вас за ftp сервер*/, .f., .t. ) == .t. ) и проверка :cReply сильно упростила бы жизнь. Зачем вам город городить с добавлением метода XCRC.

Eduard: Получаю ошибку на выходе, 504 Command not implemented for the specified argument. Если имя файла передаю без ссылки то все ок., я если вот так oFTP:UserCommand( 'XMD5 (cFile[ F_NAME ]) 0 -1', .f. , .f., .t. ) - то получаю на выходе ошибку 504. Как передать в параметрах имя файла из переменной? Как результат задачи (код МД5) записать в переменную?

Петр: Eduard пишет: Если имя файла передаю без ссылки Какая ссылка? Куда? Команда на сервер передается в виде строки cCommand. Строку можно сформировать разными способами, хотя бы так cCommand := hb_strFormat( 'XMD5 "%s" 0 -1', cFile) или cCommand := hb_strFormat( 'XMD5 "%1$s" %2$d %3$d ', cFile, nStart, nEnd) или cCommand := a + b + c Поскольку XMD5 - не стандартная команда, реализация ее зависит от сервера. Т.е. брать имя файла в кавычки или нет, понимает ли сервер, что значит EP = -1 я вам сказать не могу. Потратитьте 5 мин. на тестирование или документацию на сервер почитайте. Eduard пишет: Как результат задачи (код МД5) записать в переменную? Если все отработает нормально, вы в :cReply получите строку что-то вроде "250 - XCRC XXXXXXXX" или "250 - XMD5 XXXXXXXX". Как из строки вытащить подстроку XXXXXXXX ? - воспользуйтесь hb_regexSplit( ' ', :cReply )[4] или любым другим доступным вам методом.

Dima: Петр пишет: Это для Gene 6. 250 скорее всего Eduard Так ГЕНА 6.XXX стоит или что другое в качестве FTP сервера ?

Eduard: Да, G6 FTP Server Тестовый дома. И на работе тоже.

Петр: [pre2] FOR EACH aFile IN oFTP:ListFiles() IF aFile:__enumIndex() > 10 ? "Skipping the rest..." EXIT ENDIF cCommand := hb_strFormat( 'XMD5 "%1$s" 0 -1 %2$s', aFile[ F_NAME ], tip_CRLF() ) oFTP:UserCommand( cCommand, .t., .f., .t. ) IF "250" $ oFTP:cReply cMD5 := hb_regexSplit( ' ', oFTP:cReply )[ 2 ] ? aFile[ F_NAME ], "-", cMD5 ENDIF NEXT[/pre2] Метод UserCommand автоматом не добавляет перевод строки ( + ::cCRLF ). Поэтому и сервер результаты возвращает своеобразно (рекомендую посмотреть логи сервера с и без tip_CRLF() ).

Dima: Петр



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