说明:在“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
备注:主要是自己以后工作使用。