# -*- coding: utf-8 -*- import os from ftplib import FTP import logging # FTP接口类 class FtpController(): ''' 这是ftp接口类,在类初始化的时候就连接了ftp服务器,能否成功连接有反馈。 类中定义了两个接口:上传接口和删除接口 ''' ftp = FTP() def __init__(self, host, port, username, password): try: self.ftp.connect(host, port) self.ftp.login(username, password) logging.info("ftp连接成功") except Exception: logging.info("ftp连接失败") def file_exists_1(self, path): # 检查文件是否存在于FTP服务器上 try: logging.info("path:%s" % path) logging.info("dirname:%s" % os.path.dirname(path)) directories = os.path.normpath(path).split(os.path.sep) # 切换到上级目录 current_dir = '/' for directory in directories: if directory: # 检查目录是否存在 if directory in ['NC']: self.ftp.cwd(directory) if directory not in ['home', 'ftp', 'ftp_root', 'NC']: # 切换到新的目录 self.ftp.cwd(current_dir) return os.path.basename(path) except Exception as e: logging.error(f"Error checking file: {e}") return False def file_exists(self, path): # 检查文件是否存在于FTP服务器上 try: logging.info("dirname:%s" % os.path.dirname(path)) self.ftp.cwd(os.path.dirname(path)) files = self.ftp.nlst() return os.path.basename(path) in files except Exception as e: logging.error(f"Error checking file: {e}") return False # 下载目录下的pdf文件(程序单) def download_program_file(self, target_dir, serverdir): if not os.path.exists(serverdir): os.makedirs(serverdir) try: logging.info('FTP目录:%s' % target_dir) logging.info("进入FTP目录 ") # self.ftp.cwd(target_dir) # 切换工作路径 # logging.info('FTP目录:%s' % target_dir) remotenames = self.ftp.nlst() logging.info('FTP目录文件:%s' % remotenames) for file in remotenames: server = os.path.join(serverdir, file) if file.find(".pdf") != -1: self.download_file(server, file) except: return False # # 检测字符串的编码 # def detect_encoding(self, s): # result = chardet.detect(s) # return result['encoding'] # 下载目录下的文件 def download_file_tree(self, target_dir, serverdir): if not os.path.exists(serverdir): os.makedirs(serverdir) try: logging.info("进入FTP目录 ") self.ftp.pwd() logging.info('当前目录:%s' % self.ftp.pwd()) logging.info('目录:%s' % target_dir) target_dir1 = target_dir.split('/') logging.info('目录1:%s' % target_dir1[1]) self.ftp.cwd(target_dir1[1]) # 切换工作路径 logging.info('目录2:%s' % target_dir1[2]) self.ftp.cwd(target_dir1[2]) # 切换工作路径 logging.info('目录3:%s' % target_dir1[3]) self.ftp.cwd(target_dir1[3]) # 切换工作路径 logging.info('目录4:%s' % target_dir1[4]) self.ftp.cwd(target_dir1[4]) # 切换工作路径 remotenames = self.ftp.nlst() logging.info('FTP目录文件:%s' % remotenames) for file in remotenames: server = os.path.join(serverdir, file) if file.find(".") != -1: self.download_file(server, file) return 1 except Exception: return 0 finally: self.ftp.quit() logging.info("ftp已关闭") # 下载目录下的检测文件 def download_reportfile_tree(self, target_dir, serverdir, reportpath): if not os.path.exists(serverdir): os.makedirs(serverdir) try: logging.info("进入FTP目录-检测文件") logging.info('serverdir:%s' % serverdir) target_dir1 = target_dir.split('/') logging.info('目录1:%s' % target_dir1[1]) self.ftp.cwd(target_dir1[1]) # 切换工作路径 logging.info('目录2:%s' % target_dir1[2]) self.ftp.cwd(target_dir1[2]) # 切换工作路径 logging.info('目录2:%s' % target_dir1[3]) self.ftp.cwd(target_dir1[3]) # 切换工作路径 remotenames = self.ftp.nlst() logging.info('FTP目录检测报告文件:%s' % remotenames) for filename in remotenames: if os.path.basename(filename) == os.path.basename(reportpath): server = os.path.join(serverdir, filename) logging.info('server%s' % server) self.download_file(server, filename) return 1 except Exception: return 0 finally: self.ftp.quit() logging.info("ftp已关闭") # 下载指定目录下的指定文件 def download_file(self, serverfile, remotefile): file_handler = open(serverfile, 'wb') self.ftp.retrbinary('RETR ' + remotefile, file_handler.write) file_handler.close()