今天上午看了看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( != args.count()){
std::cout<<"Usage ftp url"<<std::endl
<<"Example:"<<std::endl
<<"ftpget ftp://ftp.trolltech.com/mirrrors"
<<std::endl;
return ;
}
FtpGet getter;//ftp类
if(!getter.getFile(QUrl(args[])))//获取url地址
return ;
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 = );
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()); 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();
}
运行后,显示如下图所示: