qtftp 客户端

时间:2023-03-09 22:35:54
qtftp 客户端

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

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

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

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

qtftp 客户端

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

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

qtftp 客户端

然后编译运行显示如下

qtftp 客户端

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

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

qtftp 客户端

然后将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();
}

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

qtftp 客户端