Qt之FTP实现-QFtp实例操作

前言

前面写了三篇关于FTP的blog,关于QFtp相关介绍,FTP本地环境搭建。
地址如下:
Qt三种方式实现FTP上传功能
Qt之FTP实现–QFtp篇
win11系统搭建FTP服务器超详细流程

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

在这里插入图片描述


本文Demo下载


正文

以上示例包含了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 源码。

相关接口的介绍及使用在 Qt之FTP实现–QFtp篇 中已经详细说明。

需要注意的是,做这种批量上传,由于上传过程是异步的,我们要让文件一个个的依次上传,就得等前一个文件执行完后再执行下一个文件,所以需要做成同步执行,所以这里就要用到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);

所以我们可以通过连接此信号,然后判断当前command,来区分当前操作内容,从而执行相关内容,比如执行 “获取文件列表”,**“删除文件”**等操作,可以在commandFinished信号后执行下一步操作。

操作命令包括:

enum Command {
        None,
        SetTransferMode,
        SetProxy,
        ConnectToHost,
        Login,
        Close,
        List,
        Cd,
        Get,
        Put,
        Remove,
        Mkdir,
        Rmdir,
        Rename,
        RawCommand
    };

比如获取文件列表,commandFinished后就可以去更新UI:

	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();
        }
    });

其他功能可以以此类推。

最后 附上演示Demo下载。

若有其他使用上的疑问可以私信或评论进行咨询。


本文Demo下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值