qtftp 客户端

今天上午看了看FTP网络,但是当添加头文件时发现qt creater并不包括此头文件,于是找了一下资料发现:在QT5上将QFtp去掉了,建议使用QNetworkAccessManager,但是后者并没有完全继承前者的所有方法,如果要想使用FTP怎么办?下面看一下我的解决方案:

首先到网站上下载QFtp的源码,我把它放在了我的博客里面-->点击这里

说明一下:我的环境是vs2012+qt

打开下载好的源码。可以看到如下结构树:

下载的文件包括例子,源码和测试

双击qftp.pro文件,将CONFIG两个选项更改如下:

然后编译运行显示如下

放心,这并不是错误,因为生成的是链接库,并不是可执行程序,所以不会运行,能运行就坏了。

这时候在编译路径下面会看到产生的链接库文件吐下所示:

然后将Qt5Ftpd.lib、Qt5Ftp.lib、Qt5Ftpd.prl、Qt5Ftp.prl拷贝到qt路径下msvc的lib文件夹下

Qt5Ftpd.dll、Qt5Ftp.dll拷贝到qt路径下msvc的bin文件夹下

qftp.h、qurlinfo.h拷贝到qt路径下msvc的include下的QTnetwork文件夹下,最后新建一个没有后缀名上午文件,写入#include“qftp.h”.

此时,qt项目中就可以使用qftp了。

下面看一下qt c++高级编程中的一个使用命令行下载ftp文件的一个客户端例子。

首先新建一个控制台应用程序。

main函数如下书写

#include <QCoreApplication>
#include "ftpget.h"
#include <QStringList>
#include <iostream>
/*
 * 新建一个控制台应用程序,避免连接到Gui界面库
 * time:2017.6.20
*/
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QStringList args=QCoreApplication::arguments();//获取命令行参数作为一个qstringList列表
    if(2 != args.count()){
        std::cout<<"Usage ftp url"<<std::endl
                <<"Example:"<<std::endl
               <<"ftpget ftp://ftp.trolltech.com/mirrrors"
              <<std::endl;
        return 1;
    }
    FtpGet getter;//ftp类
    if(!getter.getFile(QUrl(args[1])))//获取url地址
        return 1;
    QObject::connect(&getter,SIGNAL(done()),&app,SLOT(quit()));

    return app.exec();
}

另外新建一个FtpGet类,继承于QObject头文件如下:

#ifndef FTPGET_H
#define FTPGET_H

#include <QObject>
#include <QFtp>
#include <QFile>
#include <QUrl>


class FtpGet : public QObject
{
    Q_OBJECT
public:
    explicit FtpGet(QObject *parent = 0);
    bool getFile(const QUrl &url);

signals:
    void done();

public slots:
    void ftpDone(bool error);
private:
    QFtp ftp;
    QFile file;
};

#endif // FTPGET_H

源文件如下:

#include <iostream>
FtpGet::FtpGet(QObject *parent) : QObject(parent)
{
    connect(&ftp,SIGNAL(done(bool)),this,SLOT(ftpDone(bool)));
}
bool FtpGet::getFile(const QUrl &url){
    if(!url.isValid()){
        std::cerr<<"Error:Invalid URL"<<std::endl;
        return false;
    }
    if("ftp" != url.scheme()){
        std::cerr<<"Error:URL must start with 'ftp:'"<<std::endl;
        return false;
    }
    if(url.path().isEmpty()){
        std::cerr<<"Error:URLhas no path"<<std::endl;
        return false;
    }
    QString localFileName= QFileInfo(url.path()).fileName();
    if(localFileName.isEmpty())localFileName="ftpget.out";
    file.setFileName(localFileName);
    if(!file.open(QIODevice::WriteOnly)){
        std::cerr<<"Error:cont`t write file"
                <<qPrintable(file.fileName())
               <<":"<<qPrintable(file.errorString())<<std::endl;
        return false;
    }
    ftp.connectToHost(url.host(),url.port(21));

    ftp.login();
    ftp.get(url.path(),&file);
    ftp.close();

    return true;
}
void FtpGet::ftpDone(bool error){
    if(error){
        std::cerr<<"error:"<<qPrintable(ftp.errorString())<<std::endl;
    }else{
        std::cerr<<"File downloaded as:"<<qPrintable(file.fileName())<<std::endl;
    }
    file.close();
    emit done();
}

运行后,显示如下图所示:

作者:first_semon
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
原文地址:https://www.cnblogs.com/first-semon/p/7054150.html