QFtp学习

现在通过C++ GUI Programming with Qt4书中QFtp的例子, 来回顾一下以前学习的知识。

先回顾下书中的分析,添加一些自己不熟悉的知识点,最后了列出完整程序代码。

 

 

1. The QUrl class provides a high-level interface for extracting the different parts of a URL, such as the file name, path, protocol, and port.

     QUrl类提供了一个高级接口,用来提取URL的不同部分,如文件名称、路径、协议和端口。

 

1.1 bool QUrl::isValid () const       //    Returns true if the URL is valid; otherwise returns false.

1.2 QString QUrl::path () const      //  Returns the path of the URL.

       path().isEmpty()                        //  QString.isEmpty(); 检查字符串是否为空

1.3 QString QUrl::scheme () const    //  Returns the scheme of the URL. If an empty string is returned, this means the scheme is undefined and the URL is then relative.
See also setScheme() and isRelative().

 

2. QFileInfo class  //想起刚开始学习网络编程的时候对文件处理还不熟悉,饶弯子了

The QFileInfo class provides system-independent file information.
QFileInfo provides information about a file's name and position (path) in the file system, its access rights and whether it is a directory or symbolic link, QFileInfo can also be used to obtain information about a Qt resource.

2.1   5种构造函数,此处为QFileInfo::QFileInfo ( const QDir & dir, const QString & file )。

2.2   QString QFileInfo::fileName () const
 Returns the name of the file, excluding the path.
 Example:
 QFileInfo fi("/tmp/archive.tar.gz");
 QString name = fi.fileName();                // name = "archive.tar.gz"

 

3  QFtp class
The QFtp class provides an implementation of the client side of FTP protocol.

This class provides a direct interface to FTP that allows you to have more control over the requests. However, for new applications, it is recommended to use QNetworkAccessManager and QNetworkReply, as those classes possess a simpler, yet more powerful API.

这里有个奇怪的问题,文档中怎么说对于新的应用程序建议使用QNetworkAccessManager and QNetworkReply。

 

QFtp provides several FTP commands, including connectToHost(), login(), close(), list(), cd(), get(), put(), remove(), mkdir(), rmdir(), and rename(). All of these functions schedule an FTP command and return an ID number that identifies the command. It is also possible to control the transfer mode (the default is passive) and the transfer type (the default is binary).


 

 

 未完

 

 

 

 

 

ftpget.pro 文件

TEMPLATE      = app
QT            = core network
CONFIG       += console
CONFIG       -= app_bundle
HEADERS       = ftpget.h
SOURCES       = ftpget.cpp \
                main.cpp


ftpget.h 头文件

#ifndef FTPGET_H
#define FTPGET_H

#include <QFile>
#include <QFtp>

class QUrl;

class FtpGet : public QObject
{
    Q_OBJECT

public:
    FtpGet(QObject *parent = 0);

    bool getFile(const QUrl &url);

signals:
    void done();

private slots:
    void ftpDone(bool error);

private:
    QFtp ftp;
    QFile file;
};

#endif


 

ftpget.cpp 文件

#include <QtCore>
#include <QtNetwork>
#include <iostream>

#include "ftpget.h"

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 (url.scheme() != "ftp") {
        std::cerr << "Error: URL must start with 'ftp:'" << std::endl;
        return false;
    }

    if (url.path().isEmpty()) {
        std::cerr << "Error: URL has 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: Cannot 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();
}


 

main.cpp 文件

 

#include <QtCore>
#include <iostream>

#include "ftpget.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QStringList args = QCoreApplication::arguments();

    if (args.count() != 2) {
        std::cerr << "Usage: ftpget url" << std::endl
                  << "Example:" << std::endl
                  << "    ftpget ftp://ftp.trolltech.com/mirrors"
                  << std::endl;
        return 1;
    }

    FtpGet getter;
    if (!getter.getFile(QUrl(args[1])))
        return 1;

    QObject::connect(&getter, SIGNAL(done()), &app, SLOT(quit()));

    return app.exec();
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值