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. 试想一下,在代码学习Swift!

    文件       https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11       htt ...

  2. Appium在手机浏览器使用滑屏Not yet implemented解决办法。

    在手机浏览器使用swipe.scroll等手机特有行为时,因为默认context是WEBVIEW,所有一定要切换回NATIVE_APP才可以使用. python: driver.switch_to.c ...

  3. 用css2属性clip实现网页进度条

    前言 看了网上一些关于网页进度条样式的资料,有很多方式实现,针对其展现形式,有用图片的,有用css2属性clip,有用flash的,本人就学会了一种,下面就简单来介绍一下. css2的属性clip 如 ...

  4. MacOS10.9平台配置Appium+Java环境

    1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html   ...

  5. SVN & Git (一)

    (一)SVN的使用.CornerStone图形化管理工具! SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...

  6. 在线预览Excel

    遇到的问题各种多 <system.web>        <identity impersonate="true" userName="Administ ...

  7. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

  8. Asp.Net MVC5入门学习系列③

    原文:Asp.Net MVC5入门学习系列③ 添加一个视图(View) 接着上篇的入门系列,上面解说添加一个简单Controller(控制器),这里我们简单的在来添加一个View(视图)来展示我们Co ...

  9. CreateMutex

    C++ API CreateMutex 找出当前系统是否已经存在指定进程的实例.假设没有则创建一个相互排斥体.CreateMutex()函数可用来创建一个有名或无名的相互排斥量对象. HANDLE C ...

  10. C#异步Socket示例

    C#异步Socket示例 概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域, ...