制作一个良好的FTP检查Python程序有困难

1 投票
1 回答
1106 浏览
提问于 2025-04-17 16:28

请耐心听我说。我刚学了Python一周,遇到了一个问题:我想连接到一个FTP服务器。假设我的FTP服务器和本地文件夹的文件结构是一样的。我希望我的Python程序能做到以下几点:

1> 当我运行程序时,它应该上传所有在服务器上没有的文件,也就是只上传缺失的文件,而不是替换所有文件。比如,我添加了一个新文件夹或新文件,它应该直接上传到服务器上。

2> 然后,它应该检查本地文件和服务器文件的修改时间,并告诉我哪个是最新的。

现在,我已经写了两个程序:

1> 第一个程序会把本地的所有文件直接上传到服务器。我希望它能先检查缺失的文件,然后只上传那些缺失的文件夹,而不是替换所有文件。

2> 第二个程序会使用os.walk列出本地的所有文件,并把所有文件上传到服务器,但没有创建正确的文件夹结构。所有文件都被复制到服务器的根目录。然后它还会检查修改时间。

我现在很困惑,想把这两个程序合并成一个完美的程序,完成我想要的功能。如果有人能帮我看看这些代码,帮我把它们合并成我想要的样子,那就太好了。抱歉让大家烦恼了!

附注:我可能没有用最简单的方法来做这些事情!

代码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")

代码2:

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\Test")

1 个回答

0

也许这个脚本会对你有帮助。

撰写回答