QT5.14中使用QNetworkAccessManager调用FTP LIST命令失败求助
问题原因与解决方法
你的问题出在两个关键地方:
- 错误使用
get()方法获取FTP目录列表,QT中get()仅用于下载文件,访问目录会触发"is a directory"错误 - 手动设置
Command请求头属于画蛇添足,QT会根据调用的方法自动处理FTP命令
修正后的代码
QUrl url; url.setScheme("ftp"); url.setPort(21); url.setUserName(ui->userName->text()); url.setPassword(ui->password->text()); url.setHost(ui->FtpAdd->text()); url.setPath("/hdd/"); // 补全字符串引号,原代码存在语法错误 url.setQuery("type=i"); QNetworkRequest request(url); // 移除手动设置Command头的代码 QNetworkReply *reply = networkAM->list(request); // 用list()替代get() connect(reply, &QNetworkReply::finished, this, [=]() { if (reply->error() == QNetworkReply::NoError) { qDebug() << "Connected to FTP server successfully!"; QByteArray data = reply->readAll(); qDebug() << data; } else { qDebug() << "Failed to connect to FTP server. Error:" << reply->errorString(); } reply->deleteLater(); qDebug() << url; });
关键说明
- 使用
list()方法:QT的QNetworkAccessManager针对FTP协议提供了list()接口,专门用于获取目录内容,它会自动发送LIST命令,无需手动设置请求头。 - 移除多余请求头:手动设置
Command头会干扰QT内部的FTP命令处理逻辑,直接删除即可。 - 修正路径语法:原代码中
url.setPath(/hdd/);缺少字符串引号,属于语法错误,必须改为带引号的字符串格式。
内容的提问来源于stack exchange,提问作者overover
相关产品推荐
相关产品推荐

