#!/usr/bin/env python.exe
#coding=gbk
from ftplib import FTP
from os.path import basename, dirname, exists
from os import stat, rename, remove
from time import localtime, strftime
from sys import argv
TIMEFORMAT = '%Y%m%d%H%M%S'
TIMESTRING = strftime( TIMEFORMAT, localtime() )
#字符串格式:传输类型|传输模式|主机用户|主机密码|主机IP|本地文件|替换的远程文件
#传输类型: U上传 D下载
#传输模式: I二进制模式 A ascii模式
#~ ftpString0 = 'U|A|ocs|ocs321|172.31.1.142|/cygdrive/z/OcsFileRateEngine.cpp|/ztesoft/ocs/zdl/OcsFileRateEngine.cpp'
#~ ftpString1 = 'U|I|ocs|ocs321|172.31.1.142|/cygdrive/z/OcsFileRateEngine.cpp|/ztesoft/ocs/zdl/OcsFileRateEngine.cpp'
#~ ftpString2 = 'D|A|ocs|ocs321|172.31.1.142|/cygdrive/z/conn.pl|/ztesoft/ocs/zdl/conn.pl'
#~ ftpString3 = 'D|I|ocs|ocs321|172.31.1.142|/cygdrive/z/conn.pl|/ztesoft/ocs/zdl/conn.pl'
def UpdateFile(filestr):
''
list = filestr.split('|')
transferType = list[0]
transferMod = list[1]
r_user = list[2]
r_passwd = list[3]
r_ip = list[4]
localFile = list[5]
roamFile = list[6]
l_fileName = basename(localFile)
l_filePath = dirname(localFile)
r_fileName = basename(roamFile)
r_filePath = dirname(roamFile)
isBackFile = 0
print '###########################################################'
print '开始连接主机:',r_ip
print '登录用户: ',r_user
if (transferType=='U'):
print '上传文件: /n/t/t',localFile
print '上传文件大小:',stat(localFile).st_size,'byte'
if (transferType=='D'):
myFtp.sendcmd('TYPE I')
print '下载文件: /n/t/t',roamFile
print '下载文件大小:',myFtp.size(roamFile),'byte'
myFtp = FTP(r_ip)
myFtp.login(r_user, r_passwd)
print '当前远程路径:',myFtp.pwd()
myFtp.cwd(r_filePath)
print '变更路径到: ',myFtp.pwd()
myFtp.set_debuglevel(0)
if (transferType == 'U'):#上传流程
#判断目录下文件是否存在
#上传流程判断远程目录下相应文件是否存在
#~ print '上传流程判断远程目录下相应文件是否存在'
fileNameList = []
fileNameList = myFtp.nlst()
for file in fileNameList:
if (file == r_fileName):
bakFileName = roamFile + TIMESTRING
print '远程FTP服务器存在重名文件,将其改名为:/n/t',bakFileName
myFtp.rename(roamFile, bakFileName)
isBackFile=1
if (transferMod == 'I'):#二进制模式
print 'localfile:',localFile
fileHeadle = open(localFile, 'rb')
myFtp.storbinary('STOR ' + r_fileName, fileHeadle)
fileHeadle.close()
elif (transferMod == 'A'):#ascii模式
fileHeadle = open(localFile, 'r')
myFtp.storlines('STOR ' + r_fileName, fileHeadle)
fileHeadle.close()
else:
print '未知的模式类型:',transferMod
elif (transferType == 'D'):#下载流程
#判断目录下文件是否存在
#下载流程判断本地目录下文件是否已经存在
#~ print '下载流程判断本地目录下文件是否已经存在'
if exists(localFile):
bakFileName = localFile + TIMESTRING
print '本地存在重复文件,将其改名为:',bakFileName
rename(localFile, bakFileName)
isBackFile=1
#开始下载
if (transferMod == 'I'):#二进制模式
fileHeadle = open(localFile, 'wb')
myFtp.retrbinary('RETR ' + r_fileName, fileHeadle.write)
fileHeadle.close()
elif (transferMod == 'A'):#ascii模式
fileHeadle = open(localFile, 'w')
myFtp.retrlines('RETR ' + r_fileName, lambda s, w=fileHeadle.write: w(s+"/n"))
fileHeadle.close()
else:
print '未知的模式类型:',transferMod
else:
print '未知的传输类型:',transferType
myFtp.set_debuglevel(0)
myFtp.sendcmd('TYPE I')
if (transferType=='U'):
print '上传文件:/n/t/t%s [%d] byte ' % (roamFile, myFtp.size(roamFile))
if (transferType=='D'):
print '下载文件:/n/t/t%s [%d] byte ' % (localFile, stat(localFile).st_size)
isOK = (stat(localFile).st_size == myFtp.size(roamFile))
if (isOK == False):
print '本地文件大小:[%d] byte' % stat(localFile).st_size
print '远程文件大小:[%d] byte' % myFtp.size(roamFile)
if ( isOK == False and transferType=='U'):
print '!=============文件上传大小不一致,进行回退=================!'
#删除远程服务器刚上传的文件
myFtp.delete(roamFile)
#回退备份文件
if (isBackFile == 1):
myFtp.rename(bakFileName, roamFile)
if ( isOK == False and transferType=='D'):
print '!=============文件下载大小不一致,进行回退=================!'
#删除刚下载文件
remove(localFile)
#回退备份文件
if (isBackFile == 1):
rename(bakFileName, localFile)
if ( isOK == False ):
print '!======================回退完成===========================!'
print '###########################################################'
myFtp.quit()
#从文件中读取更新文件字符串
updateFileListName = argv[1]
UpdateFD = open(updateFileListName, 'r')
for str in UpdateFD:
if (str[0] != '#'): UpdateFile(str)
UpdateFD.close()
本文件转载自:http://blog.youkuaiyun.com/ganmao/article/details/4190463