FTP下载文件到文件夹+进度条

    任务是通过python FTP下载文件到内存 再到文件,好像没有搞清楚如何下载到内存,只是通过重载FTP中retrbinary函数,在里面增加打印下载进度条的功能,后面看到别人是拿pycurl做的,之后好好学习一下。

from ftplib import FTP
import unittest
import os
import sys


class MyFTP(FTP):#对FTP的继承  
    #重载父类中retrbinary的方法  
    def retrbinary(self, cmd, callback, fsize=0, rest=0):  
        """ 
        cmd: 命令 
        callback: 回调函数 
        fsize: 服务器中文件总大小
        rest: 已传送文件大小  
        """  
        cmpsize=rest  
        self.voidcmd('TYPE I')  
        conn = self.transfercmd(cmd, rest) #此命令实现从指定位置开始下载,以达到续传的目的  
        while 1:  
            if fsize: 
                if (fsize-cmpsize) >= 1024:
                    blocksize = 1024
                else:
                    blocksize = fsize - cmpsize
                ret=float(cmpsize)/fsize
                #print(cmpsize,fsize)
                num=ret*100
                print ('下载进度:%.2f%%'%num)  
                data = conn.recv(blocksize)  
                if not data:  
                    break  
                callback(data)  
            cmpsize+=blocksize  
        conn.close()  
        return self.voidresp()
  
    
#FTP服务器IP/用户名/密码
host = '127.0.0.1'
port = 21
username = 'li'
password = '0'

ftp=MyFTP()
ftp.connect(host,port)
ftp.login(username, password) 


def ftp_download(self, ftp, file_remote, file_local, bufsize):
    """ 
    ftp: 命令 
    file_remote: 要下载的文件名(服务器中)
    file_local: 本地文件路径
    bufsize: 服务器中文件大小 
    """  
    # 本地是否有此文件 来确认是否启用断点续传(没有这个文件)
    if not os.path.isfile(file_local):
        with open(file_local, 'wb') as f: 
            ftp.retrbinary('RETR %s' % file_remote, f.write, bufsize,0)
            f.close()

#TEST
class TestDownloader(unittest.TestCase):

    def setUp(self):
        print('setUp')


    def test_download(self):
        file_remote = '6.BMP'
        file_local = 'D:\\test_data\\'+file_remote
        #bufsize = 1024  # 设置缓冲器大小
        bufsize=ftp.size(file_remote) #服务器里的文件总大小
        ftp_download(ftp,file_remote,file_local,bufsize)
        #path=os.path
        #print(sys.argv[0])
        #print(__file__)

    def tearDown(self):
        print('tearDown')

if __name__ == '__main__':
    unittest.main()

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#写的ASP.NET上传到FTP上,文件文件夹都可以。 首先,选择本地文件或者文件夹,然后点击上传按钮以后,有一个压缩过程,该过程也有一个实时更新的进度条,并可以显示压缩所需的实时更新的剩余时间,压缩完成以后上传,上传也是有一个实时更新的进度条,显示剩余上传所需时间。上传完成以后显示压缩的时间、上传的时间和总共所需的时间。 根据文件流上传,根据文件流进度做的进度条,是真的实实在在的进度条。 代码都有详细的注释,例如: private string ftpUser = "Administrator"; //ftp用户名 private string ftpPassword = "123456"; //ftp密码 public TimeSpan t; //加载进度条总时间 private DateTime startTotalTimeFtp = System.DateTime.Now; private DateTime endTotalTimeFtp = System.DateTime.Now; //压缩用时(为传值做准备) //public TimeSpan zipTime; //定义开始时间、结束时间和之间的时间段,以此来估计完成所需剩余时间 DateTime startTime = System.DateTime.Now; DateTime endTime = System.DateTime.Now; TimeSpan TimeSp; //定义剩余时间 string surPlusTime = string.Empty; //判断是否小于1秒所用 int Ti = 0; //实例化类TimeSpanClass TimeSpanClass timeSpanClass = new TimeSpanClass(); 进度条可以实时动态更新,显示剩余时间,剩余时间也跟随进度条实时动态更新,上传完成显示上传时间。 再次声明,版权所有(花费本人好几个月的心血研究真实的进度条),保证进度条为真正按照文件流的进度所进行,如有问题,可与本人联系!
WinForm连接FTP树状文件夹下载文件的步骤如下: 首先,我们需要添加对System.Net命名空间的引用,将其添加到WinForm窗体应用程序项目中。 然后,创建一个WinForm界面,包含一个TreeView控件和一个下载按钮。TreeView控件用于显示FTP服务器上的文件文件夹结构。 接下来,我们需要编写代码实现FTP连接和获取文件夹结构的功能。首先,创建一个FTP客户端对象,设置FTP服务器的地址、用户名和密码。然后,使用FTPWebRequest类发送一个LIST命令来获取服务器上的文件文件夹列表,解析返回的结果并将其显示在TreeView控件中。 当用户选择TreeView中的文件文件夹时,点击下载按钮后,我们需要编写代码实现文件下载功能。首先,判断用户选择的是文件还是文件夹。如果是文件夹,则递归地下载文件夹下的所有文件和子文件夹。如果是文件,则创建一个FTPWebRequest对象,设置请求的方法为下载文件,并将文件写入本地磁盘。 需要注意的是,由于FTP是基于网络的操作,因此我们建议将FTP连接和文件下载操作放在后台线程中,以免阻塞UI线程。 最后,我们可以通过运行WinForm应用程序,连接到FTP服务器并浏览文件夹结构。用户可以选择文件文件夹,并点击下载按钮来下载文件到本地磁盘。 以上就是使用WinForm连接FTP树状文件夹下载文件的简要步骤和解释。由于篇幅限制,无法提供具体的代码实现。如果需要更详细的实现步骤和代码示例,请参考相关的WinForm和FTP操作的文档和教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值