Python之FTP多线程下载文件之分块多线程文件合并

欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP多线程下载文件之多线程分块下载文件,主要讲述了Python中如何使用多线程对文件进行分块下载。

今天,我们接着上篇的思路,我们利用多线程对文件进行下载,待全部文件下载完成之后,我们需要对各个文件块进行合并,合并的过程比较简单:

  1. 1 def mergerFile(self, localFile, threadNumber):
  2. 2 """
  3. 3 Meger all the sub parts of the file into 1 file
  4. 4 another thread will be call to do this
  5. 5 """
  6. 6 try:
  7. 7 while 1:
  8. 8 subThread = threading.Thread(target = self.mergeFileExecutor, args = (localFile, threadNumber,))
  9. 9 subThread.start()
  10. 10 subThread.join()
  11. 11 if 1 == self.mergerFlag:
  12. 12 self.mergerFlag = 0
  13. 13 return False
  14. 14 # check if total size of part file equals to size of the whole file
  15. 15 localFileSize = os.path.getsize(localFile)
  16. 16 totalSize = 0
  17. 17 for i in range(0, threadNumber):
  18. 18 totalSize += os.path.getsize(localFile + '.part.' + str(i))
  19. 19 if localFileSize == totalSize:
  20. 20 break
  21. 21 return True
  22. 22 except Exception, diag:
  23. 23 self.recordLog(str(diag), 'error')
  24. 24 return False

其中的mergeFileExecutor函数如下:

  1. 1 def mergerFileExecutor(self, localFile, threadNumber):
  2. 2 try:
  3. 3 errorFlag = 0
  4. 4 fw = open(localFile, 'wb')
  5. 5 for i in range(0, threadNumber):
  6. 6 fname = localFile + '.part.' + str(i)
  7. 7 if not os.path.exists(fname):
  8. 8 errorFlag = 1
  9. 9 break
  10. 10 fr = open(fname, 'rb')
  11. 11 data = fr.read()
  12. 12 time.sleep(2)
  13. 13 fr.close()
  14. 14 fw.write(data)
  15. 15 fw.flush()
  16. 16 time.sleep(1)
  17. 17 fw.close()
  18. 18 if 1 == errorFlag:
  19. 19 # some part file is not available
  20. 20 self.mergerFlag = 1
  21. 21 except Exception, diag:
  22. 22 # error occr
  23. 23 self.mergerFlag = 1
  24. 24 self.recordLog(str(diag), 'error')

好了,我们分块下载到的文件已经被成功合并为一整个文件,当然为了保证文件的完整性,我们可以采用诸如md5sum等方式对文件进行验证,在此我采用了比较简单的比较文件大小的方式来验证文件的完整性,验证代码如下:

  1. 1 def checkSizeEqual(self, remoteFile, localFile):
  2. 2 '''
  3. 3 check the remote file size and the local file size.
  4. 4 if =, return true,
  5. 5 else, return false
  6. 6 '''
  7. 7 try:
  8. 8 remoteFileSize = self.ftp.size(remoteFile)
  9. 9 localFileSize = os.path.getsize(localFile)
  10. 10 if localFileSize == remoteFileSize:
  11. 11 return True
  12. 12 else:
  13. 13 return False
  14. 14 except Exception, diag:
  15. 15 print diag

好了,完成上述的准备工作,我们就可以进行FTP多线程文件下载的操作了,开始我们的main函数之旅吧!今天的内容就这些,在下一节,我将会给出main函数代码,并给出完整的FTP类的全部源代码下载,敬请关注!

感谢大家的阅读,希望能够帮到大家!

Python之FTP多线程下载文件之分块多线程文件合并的更多相关文章

  1. FtpWebRequest FTP异步下载、异步上传文件

    异步下载: public interface IPrimaryKey<T> { T GetKey(); } public class DownloadInfo : IPrimaryKey& ...

  2. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  3. Linux下多线程下载工具 - Axel

    Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...

  4. Linux多线程下载工具Axel

    一般情况,在 Linux 下我们习惯于用 wget 下载,但该工具的缺点就是无法进行多线程下载,所以往往有时候速度不够快.这里介绍的 Axel,是 Linux 下一款不错的 HTTP 或 FTP 高速 ...

  5. Axel linux下多线程下载工具

    Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...

  6. 【原创】linux命令-Axel命令 - linux多线程下载 - 费元星 - 未来星开发团队

    [费元星版权Q:9715234] Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续[费元星版权Q:9715234]传,且可以从多个地址或者从一个地址的多个连接 ...

  7. [C#]多线程下载

    发现电脑里以前编写的下载程序... 做个记录,那时做的挺匆忙的,没用委托,通过公开出窗体来修改下载进度,做的比较乱... ==!! 程序具体功能(流程): 1.检测系统托盘图标内的进程名是否符合要求 ...

  8. libcurl的封装,支持同步异步请求,支持多线程下载,支持https

    最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...

  9. 多线程下载 HttpURLConnection

    Activity /**实际开发涉及文件上传.下载都不会自己写这些代码,一般会使用第三方库(如xUtils)或Android提供的DownloadManager下载*/ public class Ht ...

随机推荐

  1. 《剑指offer》 相应 在线测试地址

    <剑指Offer>面试题集收录汇总 面试题1 赋值运算符函数 不适合在线模式 面试题2 实现Singleton模式 不适合在线模式 面试题3 二维数组中的查找 已收录 面试题4 替换空格 ...

  2. UVA 10139 Factovisors(数论)

    Factovisors The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * ...

  3. hdu2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 Problem ...

  4. HTML DOCTYPE 重要性

    定义和使用方法 <!DOCTYPE> 声明必须是 HTML 文档的第一行.位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签.它是指示 ...

  5. WCF消息交换模式之双工通讯(Duplex)

    WCF消息交换模式之双工通讯(Duplex) 双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服 ...

  6. [ASP.NET MVC]如何定制Numeric属性/字段验证消息

    原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字, ...

  7. RegularExpressionValidator控件

    原文:RegularExpressionValidator控件 ★搜Asp.net★(www.soAsp.net),为专业技术文档网站.包括Asp.net开发技术文档·C#开发技术文档·Access/ ...

  8. C# 对Outlook联系人的增、删、查 

    原文:C# 对Outlook联系人的增.删.查 [转] 注:定义变量 Outlook.Application myOlApp = new Outlook.ApplicationClass(); Out ...

  9. Fluent Validation

    .NET业务实体类验证组件Fluent Validation   认识Fluent Vaidation. 看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真 ...

  10. Asterisk 未来之路3.0_0001

    原文:Asterisk 未来之路3.0_0001 第一章:电信技术革命 刚开始他们忽视你,然后他们嘲笑你,然后他们向你挑战,最后你赢了 ---Mahatma Ganhdi 在5年前,我最初规划写一本关 ...