2013-02-20 28 views
1

请耐心等待。它只是一个星期,我开始使用python。继承人问题:我想连接到FTP服务器。假定我的ftp和本地目录上的文件结构是相同的。我想让我的python程序执行以下操作:制作一个很好的ftp检查python程序的麻烦

1>在运行程序时,它应该上传所有不在服务器上但位于本地 上的文件(只上传缺失的文件 - 不能全部替换)。 说,我添加一个新的目录或一个新的文件,它应该照原样上载到服务器上。 2>然后它应该检查本地和服务器上这两个文件的修改时间,并通知哪些是最新的。

现在,我已经做了两个方案:

将从本地上传的所有文件服务器上,因为它是

1>一个程序。我宁愿它检查丢失的文件,然后仅卸载丢失的文件文件夹。 NOt全部取代。 2>第二个程序将使用os.walk列出来自本地的所有文件,并且它将上传服务器上的所有文件而不创建正确的目录结构。 所有被复制到服务器的根目录。然后它还检查修改的时间。

我现在正在尝试将这两个模块加入到一个完美的模型中,以满足我的所有需求。任何能够真正查看这些代码并尝试将它们加入我想要做的事情的人都是完美的。对不起,这样的痛苦! PS:我可能没有做任何事情的简单方法!

代码NO 1:

import sys 

from ftplib import FTP 

import os 

def uploadDir(localdir,ftp): 

    """ 

    for each directory in an entire tree 

    upload simple files, recur into subdirectories 

    """ 

    localfiles = os.listdir(localdir) 

    for localname in localfiles: 

     localpath = os.path.join(localdir, localname) 


     print ('uploading', localpath, 'to', localname) 
     if not os.path.isdir(localpath): 

      os.chdir(localdir) 


      ftp.storbinary('STOR '+localname, open(localname, 'rb')) 



     else: 

      try: 

       ftp.mkd(localname) 

       print ('directory created') 

      except: 

       print ('directory not created') 

      ftp.cwd(localname)    # change remote dir 

      uploadDir(localpath,ftp)     # upload local subdir 

      ftp.cwd('..')     # change back up 

      print ('directory exited') 


def Connect(path): 
    ftp = FTP("127.0.0.1") 
    print ('Logging in.') 
    ftp.login('User', 'Pass') 
    uploadDir(path,ftp) 


Connect("C:\\temp\\NVIDIA\\Test") 

代码NO2:

import os,pytz,smtplib 
import time 
from ftplib import FTP 
from datetime import datetime,timedelta 
from email.mime.text import MIMEText 



def Connect_FTP(fileName,pathToFile):      path from the local path 
(dir,file) = os.path.split(fileName) 

fo = open("D:\log.txt", "a+")      # LOgging Important Events 
os.chdir(dir) 
ftp = FTP("127.0.0.1") 
print ('Logging in.') 
ftp.login('User', 'Pass') 
l=dir.split(pathToFile) 
print(l[1]) 

if file in ftp.nlst():           
print("file2Check:"+file) 
    fo.write(str(datetime.now())+": File is in the Server. Checking the Versions....\n") 
    Check_Latest(file,fileName,ftp,fo) 
else: 
    print("File is not on the Server. So it is being uploaded!!!") 
    fo.write(str(datetime.now())+": File is NOT in the Server. It is being Uploaded NOW\n") 
    ftp.storbinary('STOR '+file, open(file, 'rb')) 


print("The End") 


def Check_Latest(file2,path_on_local,ftp,fo):        # Function to check the latest file, USING the "MOdified TIme" 
LOcalFile = os.path.getmtime(path_on_local) 
dloc=datetime.fromtimestamp(LOcalFile).strftime("%d %m %Y %H:%M:%S") 
print("Local File:"+dloc) 
localTimestamp=str(time.mktime(datetime.strptime(dloc, "%d %m %Y %H:%M:%S").timetuple())) # Timestamp to compare LOcalTime 


modifiedTime = ftp.sendcmd('MDTM '+file2)        # Using MDTM command to get the MOdified time. 
IST = pytz.timezone('Asia/Kolkata') 
ServTime=datetime.strptime(modifiedTime[4:], "%Y%m%d%H%M%S") 

tz = pytz.timezone("UTC") 
ServTime = tz.localize(ServTime) 
j=str(ServTime.astimezone(IST))          # Changing TimeZone 
g=datetime.strptime(j[:-6],"%Y-%m-%d %H:%M:%S") 
ServerTime = g.strftime('%d %m %Y %H:%M:%S') 
serverTimestamp=str(time.mktime(datetime.strptime(ServerTime, "%d %m %Y %H:%M:%S").timetuple())) # Timestamp to compare Servertime 

print("ServerFile:"+ServerTime) 

if serverTimestamp > localTimestamp: 
    print ("Old Version on The Client. You need to update your copy of the file") 
    fo.write(str(datetime.now())+": Old Version of the file "+file2+" on the Client\n") 
    return 
else: 
    print ("The File on the Server is Outdated!!!New COpy Uploaded") 
    fo.write(str(datetime.now())+": The server has an outdated file: "+file2+". An email is being generated\n") 
    ftp.storbinary('STOR '+file2, open(file2, 'rb')) 

def Connect(pathToFile): 

for path, subdirs, files in os.walk(pathToFile): 
for name in files: 
    j=os.path.join(path, name) 
    print(j) 
    Connect_FTP(j,pathToFile) 

连接( “C:\ TEMP \ NVIDIA \测试”)

回答

0

可能this script将是有用的。

+0

谢谢你。我一定会看看它。此外,上面的代码是我自己的,你认为我可以真正使用它们同步程序。所有需要的功能都只是我无法将它们加入到其中。 – Jino 2013-02-20 07:31:56