2015-01-25 2 views
1

Мне нужно получить список файлов на FTP. Я написал следующий код, но он сбой при запуске.Как получить список файлов на FTP с помощью D?

void main() 
{ 
string ftpserver = "myftpserver"; 
string ftplogin = "username"; 
string ftppass = "pass"; 

    auto ftp = FTP(ftpserver); 
    ftp.verbose(1); 
    ftp.setAuthentication(ftplogin, ftppass); 
    ftp.addCommand("LIST"); 
    ftp.perform(); 
} 

Проблема с addCommand, потому что если удалить его, начните приложение, покажите FTP-корневой каталог, а затем выйдите.

Хорошо. Команда поступила, но как ее получить? addCommand имеют тип void.

P.S. И я не могу понять, почему после подключения он сразу же выходит?

+0

Сторона примечания: 'ftp' является остатком от 70-го. Он не предлагает никаких средств безопасности и является кошмаром для всех сетевых администраторов. Если возможно, попробуйте использовать более современную замену: 'sftp',' scp' или 'ftps', где по крайней мере канал связи зашифрован, хотя и не ваши данные. – arkascha

+0

Я знаю, но мне нужно получить данные из старого глупого FTP :( – Suliman

+0

Итак, вы хотите инвестировать _even больше времени, усилий и денег в решение, которое вы считаете устаревшим? Почему бы не сделать шаг и опубликовать контент с лучшим server_in parallel_? Не тратит ничего, позволяет пошаговую миграцию и защищает ваши данные. – arkascha

ответ

1

Попробуйте изменить addCommand() на «LIST» (недействительная FTP-команда) на «LS» или «ls» (они ведут себя по-разному на некоторых сайтах).

Я не уверен, что все D креплений для curl - вы можете нормально получить результаты perform() по телефону curl_getinfo(). Я знаю, что D действительно по крайней мере, имеет привязок для них:

CURLcode curl_easy_perform(CURL *curl); 
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info,...); 

, которые могут быть лучшей альтернативой, так или иначе, в зависимости от ваших потребностей.

0

Проблема с ftp.perform, ОК не с самим методом, потому что, как говорит frasnian, проблема связана с командой LIST. Но если вы посмотрите на documentation на метод perform, вы должны увидеть ThrowOnError throwOnError в качестве первого параметра этого метода. Таким образом, вы можете сделать это nothrow или положить его в блок try catch.

Но это все еще не исправляет вашу проблему с помощью плохой команды.

+0

Я пробовал различные varuants команды списка. Результат такой же: '' '<500 Неизвестная команда. * QUOT строка не принимается: ls''' – Suliman

0

Как и другие, LIST не является действительной командой FTP. Вы можете найти список допустимых команд here.

Кроме того, перед вызовом perform вы должны установить обратный вызов, который принимает входящие данные с onReceive. Этот обратный вызов может накапливать результаты в строку или что-то еще, что вы хотите сделать с ними.

+0

Не могли бы вы показать мне, как использовать делегатов или объяснить, как они работают. Я читал об этом, но не знаю, как они должны работать в реальном коде ... –

+0

ftp.onReceive = (ubyte [] data) {return data;}; Ошибка: функция std.net.curl.FTP.Protocol!(). OnReceive (uint delegate (ubyte []) callback) не может быть вызван с использованием типов аргументов (функция ubyte [] (ubyte [] data) pure nothrow @nogc @safe) Что случилось? –

Смежные вопросы