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

運行后,顯示如下圖所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM