如何使用D获取FTP上的文件列表?

如何使用D获取FTP上的文件列表?,ftp,d,Ftp,D,我需要获取FTP上的文件列表。我写了下一个代码,但它在启动时崩溃了 void main() { string ftpserver = "myftpserver"; string ftplogin = "username"; string ftppass = "pass"; auto ftp = FTP(ftpserver); ftp.verbose(1); ftp.setAuthentication(ftplogin, ftppass); ftp.addComm

我需要获取FTP上的文件列表。我写了下一个代码,但它在启动时崩溃了

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


另外,我不明白为什么连接后会立即退出?

尝试将
addCommand()
从“LIST”(不是有效的FTP命令)更改为“LS”或“LS”(在某些站点上它们的行为不同)

我不确定
curl
的所有
D
绑定-您通常可以通过调用
curl\u getinfo()
获得
perform()
的结果。我知道
D
至少有以下绑定:

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

无论如何,根据您的需要,哪一种可能是更好的选择。

问题在于
ftp。执行
,确定而不是方法本身,因为正如frasnian所说,问题在于
LIST
命令。但如果您查看方法
perform
,您应该将
ThrowOnError ThrowOnError
作为此方法的第一个参数。因此,您可以将其设为nothrow或放入
try catch
块中


但这仍然不能解决您的错误命令问题。

正如其他人所建议的,
LIST
不是有效的FTP命令。您可以找到有效命令的列表


另外,在调用
perform
之前,您应该设置一个回调函数,该回调函数接收传入的数据。该回调可以将结果累积成字符串或任何您想对其执行的操作。

旁注:
ftp
是第70次调用的剩余内容。它不提供任何安全手段,对所有网络管理员来说都是一场噩梦。如果可能,尝试使用更现代的替代品:
sftp
scp
ftps
,其中至少通信通道是加密的,但不是您的数据。我知道,但我需要从旧的愚蠢的FTP获取数据:(因此,您想在一个您认为已经过时的解决方案上投入更多的时间、精力和金钱?为什么不采取措施,并用一台更好的服务器并行发布内容?成本不高,允许逐步迁移并保护您的数据。@arkascha使用FTP的选择可能不在Suliman手中。他们是否应该使用FTP它,FTP支持在D标准库中,这是一个有效的问题。@MattKline当然这是一个有效的问题,我从来没有提出过其他要求!我只是做了一个旁注,仅此而已。我这样做是因为根据我的经验,跳出框框思考是非常值得的。很多时候,人们忘记了对现有情况提出问题,试图适应新情况改变这种情况更有意义。有时这确实是不可能的。但我发现更多时候是这样,而且通常比预期的要容易得多。你能告诉我如何使用委托或解释委托是如何工作的吗?我读过,但不确定它们在实际代码中应该如何工作…ftp.onReceive=(ubyte[]data){return data;};错误:函数std.net.curl.FTP.Protocol!()。onReceive(uint委托(ubyte[])回调)无法使用参数类型调用(ubyte[]函数(ubyte[]数据)pure nothrow@nogc@safe)怎么了?我尝试了list命令的各种变量。结果相同:
<500未知命令。*未接受QUOT字符串:ls