QFtp实现文件夹下载类,希望能帮到有需要的人

完整文件资源链接 https://download.csdn.net/download/ufe_1/12838957

以下是cpp源码;


ftpDownloadDir::ftpDownloadDir(QUrl url,QString srcRootDir, QString strName, QString saveDir):QFtp(), m_url(url), m_srcRootDir(srcRootDir)  //服务器源文件夹所在目录, m_srcDirName(strName)    //服务器源文件夹名称, m_saveRootDir(saveDir)     //保存根路径
{errorInfo = "";//报错信息初始化为空字符串qDebug() << url.host() << url.port();qDebug() << url.userName() << url.password();m_ftp.connectToHost(url.host(), url.port());//连接主机m_ftp.login(url.userName(), url.password());//登录账户connect(&m_ftp, SIGNAL(commandFinished(int, bool)), this, SLOT(ftpCmdFinished(int, bool)));connect(&m_ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));connect(&m_ftp, SIGNAL(listInfo(const QUrlInfo &)),this, SLOT(ftpListInfo(const QUrlInfo &)));//connect(&ftp,SIGNAL(dataTransferProgress(qint64,qint64)),this,SLOT(updateDataTransferProgress(qint64,qint64)));QString saveAllPath = m_saveRootDir + "/" + m_srcDirName;QDir(m_saveRootDir).mkpath(saveAllPath);//先在本地创建好这个文件夹,下一步才能下载成功m_curSrcDir = m_srcRootDir;m_curLocalDir = "";m_lstPendingDir.append(m_srcRootDir + "/" + m_srcDirName);m_iSeccessNum = 0;m_iFailNum = 0;}//srcDir-当前所在目录,当前目录下要下载的文件夹/文件名称
void ftpDownloadDir::downloadDir()
{if (!m_lstPendingDir.isEmpty()){QString strPath = m_lstPendingDir.takeFirst();QString strDir = strPath;m_curLocalDir = m_saveRootDir + strDir.remove(m_srcRootDir);m_ftp.cd(strPath);m_curSrcDir = strPath;m_ftp.list();}else{//WRITE_LOG("done.");m_ftp.close();//关闭FTP连接emit done(errorInfo);}
}void ftpDownloadDir::ftpCmdFinished(int id, bool error)
{if (error){qDebug() << "id:" << id << " cmd:" << m_ftp.currentCommand() << " error:" << m_ftp.errorString();//WRITE_LOG(QString("id:%1 cmd:%2 error:%3").arg(id).arg(m_ftp.currentCommand()).arg(m_ftp.errorString()));}switch(m_ftp.currentCommand()){case QFtp::ConnectToHost:{if (error)qDebug() << QString::fromLocal8Bit("服务器连接失败: %1").arg(m_ftp.errorString());elseqDebug() << QString::fromLocal8Bit("服务器连接成功");}break;case QFtp::Cd:{
//      if (error)
//          WRITE_LOG("cmd cd error:" + m_ftp.errorString());
//      else
//          WRITE_LOG("cmd cd end. ");}break;case QFtp::List:{
//      if (error)
//          WRITE_LOG("cmd list error:" + m_ftp.errorString());
//      else
//          WRITE_LOG("cmd list end.");if (!m_lstPendingDir.isEmpty()){downloadDir();}}break;case QFtp::Get:{QFile* pFile = m_mapOpendFile.value(id);//下载完成,清理内存if (pFile != NULL){if (error){//printInfo("download fail : " + pFile->fileName());m_iFailNum++;}else{//printInfo("download success : " + pFile->fileName());m_iSeccessNum++;}pFile->close();//文件必须关闭,否则下载的文件为0;delete pFile;m_mapOpendFile.remove(id);}}break;default:break;}
}void ftpDownloadDir::ftpListInfo(const QUrlInfo &urlInfo)
{//WRITE_LOG("ftpListInfo start.");if (urlInfo.isFile())//如果是文件,则下载{if (urlInfo.isReadable()){QString filePath = m_curLocalDir + "/" + urlInfo.name();qDebug() << "filePath : " << filePath;QFile* pFile = new QFile(filePath);    //创建本地文件if (!pFile->open(QIODevice::WriteOnly)){return;}int id = m_ftp.get(urlInfo.name(), pFile);//开始下载文件m_mapOpendFile.insert(id, pFile);     //保存下载命令id和文件名}}else if (urlInfo.isDir() && !(urlInfo.name() == ".") && !(urlInfo.name() == "..")){//如果是文件夹,则创建本地目录m_lstPendingDir.append(m_curSrcDir + "/" + urlInfo.name());//记录源文件夹路径 QDir(m_saveRootDir).mkpath(m_curLocalDir + "/" + urlInfo.name());//创建本地目录}}void ftpDownloadDir::ftpDone(bool error)//当同一个文件夹下的所有文件都下载完后才到发出“done(bool)”信号,然后触发此函数
{//WRITE_LOG("ftpDone start.");m_mapOpendFile.clear();//清空列表if (error)//{printInfo(QString::fromLocal8Bit("下载错误!error:%1").arg(m_ftp.errorString()));}QString path = m_srcRootDir + m_srcDirName + "->" + m_saveRootDir + m_srcDirName;QString info = QString::fromLocal8Bit("下载完成,%1成功,%2失败, %3").arg(m_iSeccessNum).arg(m_iFailNum).arg(path);printInfo(info);m_iSeccessNum = 0;m_iFailNum = 0;
}

QFtp实现文件夹下载相关推荐

  1. Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理

    Python 连接 FTP 服务器并实现文件夹下载实例演示 第一章:连接 FTP 服务器并实现文件夹下载 ① 连接 FTP 服务器 ② 进入指定目录并显示文件信息 ③ 区分文件和文件夹名 ④ 文件夹名 ...

  2. iOS GoldRaccoon第三方FTP文件夹下载失败原因

    一.问题描述:1.下载失败报错: 文件写入失败Error Domain=NSCocoaErrorDomain Code=512 "未能将文件"jquery_1_10_2_min.j ...

  3. XP中i386/lang的文件夹下载

    XP中i386/lang的文件夹下载 这种有两种解决方法(其实也是一种啦)一种是去网上直接下载i386/lang的文件夹,第二种就是去网上下载XP的原版光盘镜像,用虚拟光驱加载下载下来的ISO光盘镜像 ...

  4. 华为网盘 文件夹下载

    如果不是必要,平时自己使用还是用百度网盘比较方便,但是如果下载的资源只有从华为网盘下载,那就用一下方法: 1:安装华为的 爱同步客户端. 2:用浏览器登入自己的华为网盘账号,会出现一下界面. 3:将网 ...

  5. 如何将服务器端的文件或文件夹下载到本地

    问题如上所示,企业开发人员的数据和程序很多都是放在服务器上面的,但是有时候需要下载到本地跑一下或者进行修改.我使用的是scp命令. 先来看看如何将服务器上面文件下载到本地,直接上命令: scp zhu ...

  6. 命令行CMD切换路径(从c盘切换到其他文件夹下载东西)

    例如进入D盘下的文件夹名称为xz的 跟着图片步骤来就可以了

  7. Restlet Client 安装 网盘里面有压缩文件夹下载引用即可 谷歌浏览器

  8. GitHub如何下载单个文件夹

    更新: 如果用 Chrome 的话,我一般用 GitZip for github 这个扩展 Github中并不提供单个文件夹下载, 每当下载仓库中某个文件夹时,只能克隆整个仓库, 浪费硬盘空间不说,浪 ...

  9. 从GitHub存储库下载单个文件夹或目录

    如何从GitHub上托管的远程Git存储库中仅下载特定文件夹或目录? 假设示例GitHub存储库位于此处: git@github.com:foobar/Test.git 其目录结构: Test/ ├─ ...

最新文章

  1. “不会数学,干啥都不行!”骨灰级程序员:你方向不对,努力也白费!
  2. 减小Delphi的Exe文件大小
  3. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
  4. 腾讯云一口气发布四大新品,云原生时代将正式开启
  5. java用mysql存储图片_Java存储图片到Mysql
  6. 决策者根据什么曲线做出决策_如何在开放社区中做出品牌决策
  7. S7-300/400 系统 Profibus DP 通讯故障诊断实用方
  8. thinkphp5 mysql助手_ThinkPHP5-数据库基本操作
  9. Django之一个简单的图书管理系统(单表)
  10. D3之svg transform 与 css3 transform 区别与联系
  11. 计算坐标系中两个点之间的距离c语言,如何求坐标系中两点间的距离
  12. 用 Python 自制成语接龙小游戏!
  13. 多空对比:一个实用的短中长期资金观察指标介绍
  14. 服务器fs改变文件内容,SeaweedFS文件系统
  15. c语言模拟扫雷小游戏
  16. 录屏 java_Java小程序—录屏小程序(上半场)
  17. fatal error C1088
  18. ubuntu解压各种文件
  19. 实现移动端查看控制台
  20. 一个初中生到程序员的辛酸经历

热门文章

  1. 软件工程中,在软件项目管理过程中,估算软件规模的方法有哪些?
  2. 企业数字化进程的关键一步
  3. SQL A表数据更新到B表
  4. 通过蜜网和钻石模型对ICS威胁进行分析
  5. 苹果要收割智商税了?
  6. 在全文索引中同义词的使用
  7. STA-11. 芯片中的偏差和风控机制
  8. python复数运算程序,【python基础】——python 复数运算
  9. 用Python将PDF文件转存为图片
  10. PyQt5 打地鼠小游戏 代码及素材