今天上午看了看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(); }
运行后,显示如下图所示: