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

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

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

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

其中的mergeFileExecutor函数如下:

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

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

 1 def checkSizeEqual(self, remoteFile, localFile):
2 '''
3 check the remote file size and the local file size.
4 if =, return true,
5 else, return false
6 '''
7 try:
8 remoteFileSize = self.ftp.size(remoteFile)
9 localFileSize = os.path.getsize(localFile)
10 if localFileSize == remoteFileSize:
11 return True
12 else:
13 return False
14 except Exception, diag:
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. AJAX及其跨域的主要解决方法

    AJAX = Asynchronous JavaScript andXML(异步的 JavaScript 和 XML).通过在后台与服务器进行少量数据交换,使网页实现异步更新.要明白异步交互可以通过同 ...

  2. 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔

    package sundemo2; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public ...

  3. 熊猫猪新系统測试之三:iOS 8.0.2

    本来本猫要等到8.1版本号出来后再做測试的,结果等来等去就是迟迟不推送更新呀!说好10月20号的iOS 8.1呢?为了一鼓作气写完,就先不等了.先拿手头的iOS 8.0.2系统做一下測试吧! 8.x系 ...

  4. Swift语言指南(三)--语言基础之整数和浮点数

    原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...

  5. .net EF 事物 订单流水号的生成 (一)

    首先需要 添加 System.Transactions 程序集 数据表: create table SalesOrder ( ID ,) primary key not null, OrderNo ) ...

  6. Win7搭建NodeJs开发环境

    Win7搭建NodeJs开发环境以及HelloWorld展示—图解 Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第 ...

  7. 文字超出DIV后,隐藏文字并显示...

    <html> <head> <style type="text/css"> #cs{width:100px;height:50px;line-h ...

  8. 退出手机QQ依旧显示在线

    老婆说明明看到你手机QQ在线,怎么发信息不回复?这让我非常是冤枉,我明明退出了啊! 晚上宝宝睡觉后,我们一起来研究,发现了当中的秘密,原来仅仅要选择了"退出后仍接受消息通知"这个选 ...

  9. How to:installshield安装包怎样才能出现选择路径的界面?

    原文:How to:installshield安装包怎样才能出现选择路径的界面? 这个问题新手问的很多,installshield的安装包默认设置下选择路径的界面藏在Custom安装类型下.在做完安装 ...

  10. sb2-admin

    近期开发中遇到的问题总结   最近准备把后台管理系统重新设计开发下,使用了bootstrap,在网上找了个漂亮的后台模板:sb2-admin,在使用中遇到了不少问题,总结下,以免以后忘记. 1.EF5 ...