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