前言
今天具体来根据QFtp写个实例介绍如何在实际项目中使用其相关接口。
主要为了演示接口使用,所以做了个简单的UI,没那么精致,凑合着看。

正文
以上示例包含了FTP登录,为方便演示,本次连接的FTP服务器就是上篇文章中介绍的在windows本机搭建的FTP服务器。Demo功能包括:选择文件夹进行批量上传文件,列举FTP服务器上的所有文件,以及文件实时上传进度 这几个重要功能。其实QFTP还提供了很多其他接口,用法都是差不多的,可以举一反三。
具体接口如下,前面的文章也有介绍过:
int setProxy(const QString &host, quint16 port);
int connectToHost(const QString &host, quint16 port=21);
int login(const QString &user = QString(), const QString &password = QString());
int close();
int setTransferMode(TransferMode mode);
int list(const QString &dir = QString());
int cd(const QString &dir);
int get(const QString &file, QIODevice *dev=0, TransferType type = Binary);
int put(const QByteArray &data, const QString &file, TransferType type = Binary);
int put(QIODevice *dev, const QString &file, TransferType type = Binary);
int remove(const QString &file);
int mkdir(const QString &dir);
int rmdir(const QString &dir);
int rename(const QString &oldname, const QString &newname);
int rawCommand(const QString &command);
包含的信号:
Q_SIGNALS:
void stateChanged(int);
void listInfo(const QUrlInfo&);
void readyRead();
void dataTransferProgress(qint64, qint64);
void rawCommandReply(int, const QString&);
void commandStarted(int);
void commandFinished(int, bool);
void done(bool);
其他详细接口可以查看qftp.h 源码。
需要注意的是,做这种批量上传,由于上传过程是异步的,我们要让文件一个个的依次上传,就得等前一个文件执行完后再执行下一个文件,所以需要做成同步执行,所以这里就要用到QEventLoop来实现。
然后考虑到文件大小以及内存占用问题,不能直接将文件readAll() 后进行传输。
上传部分代码:
void Widget::on_uploadBtn_clicked()
{
auto path = ui->folderEdit->text();
QDir dir(path);
if(dir.exists()){
ui->progressBar->setVisible(true);
auto fileLst = dir.entryInfoList(QDir::Files);
for(const auto& it : fileLst){
QFile *file = new QFile(it.filePath(),this);
if(!file->open(QIODevice::ReadOnly)){
qDebug() << __FUNCTION__ <<"file open failed.";
if(m_loop.isRunning())
m_loop.exit();
continue;
}
ui->tips->setText(QString::fromLocal8Bit("当前正在上传:") + it.fileName());
m_ftp.put(file,it.fileName());
m_loop.exec();
}
ui->tips->setText(QString::fromLocal8Bit("已完成所有文件上传"));
}
}
另外,所有的操作都会有以下两个信号发出
void commandStarted(int);
void commandFinished(int, bool);
操作命令包括:
enum Command {
None,
SetTransferMode,
SetProxy,
ConnectToHost,
Login,
Close,
List,
Cd,
Get,
Put,
Remove,
Mkdir,
Rmdir,
Rename,
RawCommand
};
比如获取文件列表,commandFinished后就可以去更新UI:文章来源:https://www.toymoban.com/news/detail-758137.html
connect(&m_ftp, &QFtp::listInfo, this, [&](QUrlInfo info){
m_fileList.append(info.name());
});
connect(&m_ftp,&QFtp::commandFinished,this,[&](){
if(m_ftp.currentCommand() == QFtp::List){
qDebug() << "commandFinished. QFtp::List " << m_fileList ;
ui->listWidget->addItems(m_fileList);
if(m_loop.isRunning())
m_loop.exit();
}
});
其他功能可以以此类推。文章来源地址https://www.toymoban.com/news/detail-758137.html
到了这里,关于Qt之FTP实现-QFtp实例操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!