python--FTP两个文件夹间的同步

本文介绍了一个利用Python脚本实现的FTP文件同步系统,通过层序遍历算法,自动检测源文件夹更新,并将新内容复制到目标文件夹中,支持深度目录拷贝。
# -*- coding: utf-8 -*-
'''''
    ftp自动检测源文件夹的更新,将源文件夹更新的内容拷贝到目标文件夹中
    使用树的层序遍历算法,支持深度目录拷贝
'''
import os
from ftplib import FTP
import os,sys,string,datetime,time
import shutil
import socket

class MyUpdateMonitor(object):
    def __init__(self, hostaddr, username, password, remotedir_old, remotedir_new, port = 21):
        self.hostaddr = hostaddr
        self.username = username
        self.password = password
        self.remotedir_old = remotedir_old
        self.remotedir_new = remotedir_new
        # self.port = port
        self.ftp = FTP()
        # 源文件文件队列
        self.FolderListOld = []
        # 目标文件文件队列
        self.FolderListNew = []

    def __del__(self):
        self.ftp.close()
        self.FolderListOld.clear()
        self.FolderListNew.clear()

    def FtpLogin(self):
        ftp = self.ftp
        try:
            timeout = 300
            socket.setdefaulttimeout(timeout)
            ftp.set_pasv(True)
            print u'开始连接到 %s' %(hostaddr)
            ftp.connect(hostaddr)
            print u'成功连接到 %s' %(hostaddr)
            print u'开始登录到 %s' %(hostaddr)
            ftp.login(username, password)
            print u'成功登录到 %s' %(hostaddr)
            ftp.getwelcome()
        except Exception, e:
            print 'find exception now:',e

    # 使用树的层序遍历来检查文件目录
    def LevelOrderFolder(self):
        # 新增文件起始位置和终止位置
        start = 0
        end = 0
        try:
            # 将根目录放入队列中
            self.FolderListOld.append(self.remotedir_old)
            self.FolderListNew.append(self.remotedir_new)
            while not (0 == len(self.FolderListOld)):
                end = start
                # 将文件夹下的文件全部压入队列
                if os.path.isdir(self.FolderListOld[0]):
                    files = os.listdir(self.FolderListOld[0])

                    for file in files:
                        self.FolderListOld.append(os.path.join(self.FolderListOld[0], file))
                    # 确定新增文件在队列中的位置
                    end += len(files)
                # 将已经查看的文件夹删除
                del self.FolderListOld[0]
                # 检查目标文件夹该级目录
                if os.path.isdir(self.FolderListNew[0]):
                    # 将该级目录的文件都列出
                    files = os.listdir(self.FolderListNew[0])
                    # 检查源文件该级目录下的文件在目标该级目录下是否有
                    for file in self.FolderListOld[start:end]:
                        temp = file.split('\\')
                        if temp[-1] in files:
                            # 这里判断文件大小是否一致,不一致拷过去
                            if os.path.isfile(file) and not  os.path.getsize(file) == os.path.getsize(os.path.join(self.FolderListNew[0], temp[-1])):
                                print 'Find the file(%s) size is changed!\n' % file
                                # print r'Start delete...\n'
                                # os.remove(os.path.join(self.FolderListNew[0], temp[-1]))
                                # print r'delete is over...\n'

                                print 'Start Copy...\n'
                                shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1]))
                                print 'Copy is over...\n'
                            # # 如果是文件夹存在,但是修改过,没有必要全部拷贝文件夹,可以到文件夹中拷贝单个文件
                            # if os.path.isfile(file) and not (os.path.getmtime(file) == os.path.getmtime(os.path.join(self.FolderListNew[0], temp[-1]))):
                            #     print 'Find the file(%s) size is changed!\n' % file
                            #     changetime = os.path.getmtime(file) #以毫秒为单位的时间,自1970年开始到现今
                            #     changetime = float(changetime)
                            #     print 'Change Time is', time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(changetime)), r'\n'
                            #
                            #     print 'Start Copy...\n'
                            #     shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1]))
                            #     print 'Copy is over...\n'
                        else:
                            if os.path.isdir(file):
                                # 如果是文件夹不存在使用,目录树拷贝
                                print 'Find the folder(%s) is updated!\n' % file
                                print 'Start Copy...\n'
                                shutil.copytree(file, os.path.join(self.FolderListNew[0], temp[-1]))
                                print 'Copy is over...\n'
                            else:
                                # 如果是文件
                                print 'Find the file(%s) is updated!\n' % file
                                print 'Start Copy...\n'
                                shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1]))
                                print 'Copy is over...\n'
                        self.FolderListNew.append(os.path.join(self.FolderListNew[0], temp[-1]))

                del self.FolderListNew[0]

                start = end - 1
        except Exception, e:
            print 'find exception now:',e


if __name__ == '__main__':

    # 配置如下变量
    hostaddr = r'10.204.16.28' # ftp地址
    username = r' ' # 用户名
    password = r' ' # 密码

    remotedir_old = r'\\10.204.16.28\Home\TDME\Test\Old\TMUMH_1.6.1055'
    remotedir_new = r'\\10.204.16.28\Home\TDME\Test\New\TMUMH_1.6.1055'

    monitorfileupdae = MyUpdateMonitor(hostaddr, username, password, remotedir_old, remotedir_new)
    monitorfileupdae.FtpLogin()

    while True:
		print 'Start Check Update...\n'
		monitorfileupdae.LevelOrderFolder()
		print 'Check Update is Over...\tSleep one hour...'
		time.sleep(3600)

    print 'hello'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值