zoukankan      html  css  js  c++  java
  • 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
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    struts2的结果类型
    struts2的基本配置
    struts2拦截器
    struts2入门程序
    struts2工作原理
    Mysql处理字符串函数(转)
    oracle调用java方法的例子(下面所有代码都是在sql/plus中写)
    Oracle数据库中调用Java类开发存储过程、函数的方法
    Oracle触发器反向调用Java程序
    javaweb项目打包成war包
  • 原文地址:https://www.cnblogs.com/first-semon/p/7054150.html
Copyright © 2011-2022 走看看