FTP (RadStudio 2007->IndyClients->TIdFTP)
От: Feador  
Дата: 28.05.10 13:43
Оценка:
Здравствуйте. Пишу программу для работы с FTP на языке C++ в среде RadStudio 2007. Программа должна выполнять копию данных с FTP-сервера. В процессе кодирования наткнулся на кучу вопросов, многие связаны они с компонентой TIdFTP из набора IndyClients. В классе есть возможность получать имена и атрибуты несколькими разными способами. Самый простой, насколько я понял, — это через параметр ListResult, представляющий TStrings* . Но неудобство такого способа в том, что строки возвращаются в таком же формате, как и в cmd.exe, вида
-rw-r--r-- 1 2143 600 6590 May 26 19:59 .htaccess

Другими словами, надо ещё и анализировать строку, что в восторг не приводит. Что же, есть и другой способ — использовать DirectoryListing. Однако, отладчик показывает, что этот массив не заполняется. ListResult заполняется, а DirectoryListing — нет. В хелпе указано, что:
DirectoryListing is a read-only TIdFTPListItems property that implements a container for TIdFTPListItem instances created from the result values for the List or Status methods. Авторский перевод — пока не используете List() или Status(), DirectoryList не заполнится. Но дело в том, что функция List() вызывается, а от этого список все равно не заполняется. Тогда возвращаемся к ListResult, просто надо написать обработчик строки.

Однако, не все так просто. Как видно выше, на каком-то сервере файл характеризуется строкой вида
-rw-r--r-- 1 2143 600 6590 May 26 19:59 .htaccess
, а вот на другом сервере зато строка немного отличается:
-rw-r--r-- 1 1595 600 13550 Nov 15 2009 .htaccess

То есть форматы дат разные, на одном время, на другом — год((.

Вопросы следующие :
1) что сделать, чтобы работал DirectoryListing компоненты TIdFTP?
2) почему с разных (да даже и с одного) серверов разные файлы характеризуются разным форматом веремени? (в документации объяснения не нашел, может, плохо искал)? есть ли ещё какие-нибудь подводные камни при работе с серверами FTP?
3) если знаете, порекомендуйте нормальную проверенную компоненту для работы с FTP.
radstudio c++ builder c++ ftp tidftp
Re: FTP (RadStudio 2007->IndyClients->TIdFTP)
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 28.05.10 14:35
Оценка:
Здравствуйте, Feador, Вы писали:

F>Вопросы следующие :

F>1) что сделать, чтобы работал DirectoryListing компоненты TIdFTP?

Подключить модули для парсинга строк (имен файлов + атрибуты + размер), которые возвращает FTP.
Это: IdFTPListParseBase,IdFTPListParseAS400,IdFTPListParseBullGCOS7,IdFTPListParseBullGCOS8 и так далее. Затем — стандартно:

FTP.List;
for i:=0 to Pred(FTP.DirectoryListing.Count) do
   begin
       ListBox1.Items.Add(FTP.DirectoryListing.Items[i].FileName);
   end;


F>2) почему с разных (да даже и с одного) серверов разные файлы характеризуются разным форматом веремени? (в документации объяснения не нашел, может, плохо искал)? есть ли ещё какие-нибудь подводные камни при работе с серверами FTP?


Разные сервера ФТП по разному отдают клиенту информацию о файлах. Так уж повелось.

F>3) если знаете, порекомендуйте нормальную проверенную компоненту для работы с FTP.


ICS попробуй, хотя с Indy тоже вроде как нормально обстоит.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re: FTP (RadStudio 2007->IndyClients->TIdFTP)
От: Centaur Россия  
Дата: 28.05.10 17:19
Оценка:
Здравствуйте, Feador, Вы писали:

F>Однако, не все так просто. Как видно выше, на каком-то сервере файл характеризуется строкой вида

F>-rw-r--r-- 1 2143 600 6590 May 26 19:59 .htaccess
F>, а вот на другом сервере зато строка немного отличается:
F>-rw-r--r-- 1 1595 600 13550 Nov 15 2009 .htaccess

Один и тот же сервер будет выдавать оба эти формата. Если дата за последний год — выдаст время, если раньше — год.

F>2) почему с разных (да даже и с одного) серверов разные файлы характеризуются разным форматом веремени? (в документации объяснения не нашел, может, плохо искал)? есть ли ещё какие-нибудь подводные камни при работе с серверами FTP?


Есть, и премного.

Надо использовать для получения листинга команды MLST и MLSD вместо LIST. И пинать разработчиков всех серверов, которые их не поддерживают.

Ещё много добрых слов скажете, когда наткнётесь на полный бардак в части кодировок. Дело в том, что ранний стандарт официально умел только us-ascii, а UTF-8 специфицировали только относительно недавно, и многие виндовые серверы отдают листинги в своих местных ANSI-кодировках без какого-либо указания, какой именно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.