Qt编程10:QFtp断点续传(文件夹以及文件)

说明:在“Qt编程9:QFtp实现普通文件的上传以及续传”的基础上完善了,普通文件上传以及下载的断点续传。

说明:只做编程工程中的思路说明,只贴头文件,实现的代码量太大。

第三方ftp源代码:QFtp(更改了很多地方),原有的QFtp代码,不支持普通文件的、文件夹的断点续传;对于字符集处理进行了修改。

思路为:

一、以上传为例

     1、判断ftp服务器下是否存在,相同名称的文件夹、文件。

            1)因为上传的是文件夹,如果存在同名文件,则提示:“请选择其它ftp文件夹”。

             2)如果存在同名,则提示是否覆盖ftp同名文件夹,还是续传。

                      1>如果覆盖,则会检测Ftp目录以及子目录下是否存与本地在同名文件、文件夹。存在,则删除(覆盖嘛!要保证本地上传的数据的完整性)

                      2>如果是续传,还是检测Ftp目录以及子目录下是否存与本地在同名文件。同名文件,判断大小(比本地小:文件续传),(一般大:跳过),(不存在:上传)

             3)不存在同名,则直接上传,上传的方式:跟“Qt编程9”雷同。

   
#ifndef FTPMANAGER_H
#define FTPMANAGER_H

#include <QObject>
#include <QDebug>
#include <QThread>
#include <QFile>
#include <QDir>
#include <QTcpSocket>
#include "qftp.h"
#include "ctrldlg.h"
#include <QtSql/QSqlDatabase>


class FileInfor
{
public:
    enum
    {
        isFile,
        isDir
    };

    QString filePath;
    int     fileType;
    qint64  fileSize;
};

typedef QList<FileInfor> Flist;


class FtpManager : public QObject
{
    Q_OBJECT
public:
    explicit FtpManager(QString _host, QString userName = "", QString passWd = "",qint16 _port = 21,QObject *parent = 0);
    ~FtpManager();

    enum csMsg
    {
        isRemote,
        islocal
    };

    enum fType
    {
        isFile,
        isFolder
    };

    /*
     * ftp动作
     */
    enum
    {
        DownLoadFile,
        UploadFile,
        DownLoadDir,
        UpLoadDir,
        None
    };

signals:
    /*
     *发送进度条值的信号
     */
    void G_getProgressVal(int);

    /*
     *发送文件重名信号
     */
    void G_sndHasFile(QString);

    /*
     * 发送错误(文件与文件夹 或 文件夹与文件重名)信号
     */
    void G_sndExceMsg(FtpManager::csMsg,FtpManager::fType);

    /*
     * 发送连接状态信号
     */
    void G_sndConnMsg(bool);

    /*
     * 发送登录状态信号
     */
    void G_sndLoginMsg(bool);

    /*
     * 发送传输完毕信号
     */
    void G_sndSucess();

public slots:

    /*
     * 命令执行结束状态
     */
    void S_commandFinish(int,bool);

    /*
     * 进度条值处理
     */
    void S_upDateProgress(qint64,qint64);

    /*
     * ftp命令终止
     */
    void S_abort();

    /*
     * 现在普通文件(文件与本地路径必须为绝对路径)
     */
    void S_dloadFile(QString _remoteFile,QString _localPath);

    /*
     * 现在普通文件(文件与本地路径必须为绝对路径)
     */
    void S_uloadFile(QString _localFile,QString _remotePath);

    /*
     * 文件夹上传(必须为绝对路径)
     */
    void S_uLoadDir(QString _localDir,QString _remoteDir);

    /*
     * 文件夹下载(必须为绝对路径)
     */
    void S_dloadDir(QString _remoteDir,QString _localPath);

    //后期添加的方法
    void S_list();
    void S_listInfo(QUrlInfo);
    //文件控制
    void S_fileCtrl(CtrlDlg::ctrl);

    //继续上传或者现在
    void S_reseed();



private:

    QString         m_userName;
    QString         m_passwd;

    QFtp            *myFtp;
    QFile           *m_File;

    bool            m_IsOpenFile;
    bool            m_IsDloadDir;
    bool            m_IsUloadDir;
    bool            m_createDir;

    bool            m_IsCoverDlDir;                //是否为覆盖文件夹
    bool            m_IsFileDone;                  //文件是否已经存在
    bool            m_IsReDlDir;                   //是否为文件夹续传

    bool            m_IsDloadFile;                 //是否是下载文件
    bool            m_IsUloadFile;                 //是否是上传文件

    QString         m_remoDir;                     //文件夹的存放位置(固定不变)
    QString         m_remoteFdir;                  //普通文件 在远程所在的文件夹(可能会变化)
    QString         m_localDir;                    //文件夹 对应的本地文件夹
    QString         m_llocalDir;                   //原始本地目录
    QString         m_localFdir;                   //普通文件 在本地对应文件夹

    QString         m_remoteFile;                  //ftp普通文件
    QString         m_localFile;                   //本地普通文件

    Flist           m_remoteFlist;                 //ftp文件列表
    Flist           m_remoteDlist;                 //ftp目录列表
    Flist           m_localFlist;                  //本地文件列表
    Flist           m_localDlist;                  //本地目录列表
    Flist           m_rFileCheckList;              //查看文件是否存在的文件列表

    //------------------------------------
    Flist           tmpReDlist;                    //临时ftp文件列表
    Flist           tmpReFlist;
    Flist           tmpLoDlist;
    Flist           tmpLoFlist;

    //------------------------------------

    int             m_allFileCount;                 //所有文件的数量
    qint64          m_allFileSize;                  //所有文件的大小
    bool            m_isChange;                     //用于文件夹传输,区别传输的文件已经更换
    int             FtpStatus;                      //判断ftp的传输的是下载文件、上传文件、还是文件夹
    QDir            m_dir;

private:
    void            travelDir(QString dirPath);     //遍历本地目录以及子目录下的文件或文件夹
    void            ftpInit();                      //ftp初始化

public:
    static qint64 _allUse;                          //文件夹已经传输的大小



};


#endif // FTPMANAGER_H


 

备注:主要是自己以后工作使用。

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值