QT----关于使用Qftp类使用的踩坑处

最近工作中需要用qftp循环去连接不同的ip,自动进行下载不同设备的文件,使用过程中踩了很多坑,现在记录一下:

     1.qftp这个类是异步工作方式,简单来说它就是通过信号和槽的方式进行工作的。它自身带有

connect(m_ftp, &QFtp::commandStarted, this, &DownThread::ftpCommandStarted); connect(m_ftp, &QFtp::commandFinished, this, &DownThread::ftpCommandFinished); connect(m_ftp, &QFtp::listInfo, this, &DownThread::addToList);这三对信号和槽。

当使用 m_ftp->connectToHost(),发出commandStarted信号,设备连接成功后会发出commandFinished信号,我们可以在它对应的槽函数里进行一系列操作。

void DownThread::ftpCommandStarted(int)
{
    int id = m_ftp->currentCommand();
    switch (id)
    {
    case QFtp::ConnectToHost :
        qDebug() <<"正在连接到服务器…";
        break;
    case QFtp::Login :
        qDebug() <<"正在登录…";
        break;
    case QFtp::Get :
        qDebug() <<"正在下载…";
        break;
    case QFtp::Close :
        qDebug() <<"正在关闭连接…";
    case QFtp::Cd :
        qDebug() <<"正在进入目录…";

    }

}
void DownThread::ftpCommandFinished(int, bool error)
{
    if(m_ftp->currentCommand() == QFtp::ConnectToHost) {
        if (error)
            qDebug() <<tr("连接服务器出现错误");
        else qDebug() <<tr("连接到服务器成功");
    } else if (m_ftp->currentCommand() == QFtp::Login) {
        if (error)
            qDebug() <<tr("登录出现错误");
        else {
            qDebug() <<"登录成功";
        }
    } else if (m_ftp->currentCommand() == QFtp::Get) {
        if(error)
            qDebug() <<tr("下载出现错误:%1").arg(m_ftp->errorString());
        else {
            qDebug() <<"已经完成下载";
        }
    } else if (m_ftp->currentCommand() == QFtp::List) {
            qDebug()<<"进入列表";

    } else if (m_ftp->currentCommand() == QFtp::Close) {
    }else if(m_ftp->currentCommand()==QFtp::Cd )
    {
        if(error)
            qDebug() <<tr("进入目录出现错误:%1").arg(m_ftp->errorString());
        else {
            qDebug() <<"进入目录成功";
        }

    }

}

        如果只是对一个设备进行连接,那一般不需要有特殊的地方,但如果你需要不断地去循环创建连接和下载,一定要缕清顺序,例如等连接成功再执行登录命令,等登录成功再进行进入目录等等。

 2.关于编码不一致问题:

qftp类它有一个问题所在之处就是因为编码不一致会导致下载文件错误或者无法下载,下面写出如何避免因编码不一致导致下载出错的问题:

 (1)进入目录时字符转换
 QString name=QLatin1String(Infor::sg_workList.dequeue().toUtf8()); 
 QString path="/";
 path+=name;
 m_ftp->cd(name);

  (2)通过list()去获取文件目录时,获取回来的文件名称转换

void DownThread::addToList(const QUrlInfo &urlInfo)
{
    QString name= QString::fromLocal8Bit(urlInfo.name().toLatin1());

   m_fileNameList.append(name);

}

(3)开始要下载时,文件名字转成ftp的编码


   for (int i = 0; i < m_fileNameList.length(); i++) {
        QString fileName=  nameList[0];
        QString name = fileName.toLocal8Bit();
        QString remoteName =QString("E:/FileServer")+ "/" + name;
        m_file =new QFile(remoteName);
        if(m_file->exists())
        {
            int nId = QMessageBox::question(nullptr, "提示信息", "文件已存在,是否替换", "是", "否");
          if(nId != 0) {
               delete m_file;
              return;
           }
        }
        if (!m_file->open(QIODevice::Truncate | QIODevice::WriteOnly)) {
            delete m_file;
            return;
        }
        m_ftp->get(QString::fromLatin1(fileName.toLocal8Bit()), m_file);
   }
 

 2.文件下载后空白的原因:

ftp在get()成功后,一定要在ftpCommandFinished()这个槽函数中将文件关闭,否则下载后一定是空文件。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值