Здравствуйте. Пишу программу для работы с 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.
Здравствуйте, 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 тоже вроде как нормально обстоит.
Здравствуйте, 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-кодировках без какого-либо указания, какой именно.