1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26-27--28 29---30 31--32 33 34 35 36 37 38-39 40 41 42 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 5, 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 11 9 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148-149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
#!/usr/bin/env python #-*-coding:utf-8-*-import ftplib import OS import sys class Ftpsync (object): conn = Ftplib. FTP () def __init__ (self,host,port=21): Self.conn.connect (host,port) def login (Self,username,password): Self.conn.login (Username,password) SELF.CONN.SET_PASV (False) print Self.conn.welcome def test (Self,ftp_path): Print Ftp_path print Self._is_ftp_dir (ftp_path) #print self.conn.nlst (Ftp_path) #self. Conn.retrlines (' LIST./a/b ') #ftp_ Parent_path = Os.path.dirname (ftp_path) #ftp_dir_name = Os.path.basename (ftp_path) #print Ftp_parent_path #print ftp_ Dir_name def _is_ftp_file (self,ftp_path): Try:if Ftp_path in Self.conn.nlst (Os.path.dirname (Ftp_path)): Return True Else:return false except Ftplib.error_perm,e:return false def _ftp_list (self, line): List = Line.split (') if SELF.FTP_ Dir_name==list[-1] and List[0].startswith (' d '): Self._is_dir = True def _is_ftp_dir (self,ftp_path): Ftp_path = Ftp_ Path.rstrip ('/') Ftp_parent_path = Os.path.dirname (Ftp_path) Self.ftp_dir_name = Os.path.basename (ftp_path) Self._is_dir = False if Ftp_path = = '. ' or ftp_path== './' or ftp_path== ': Self._is_dir = True Else: #this ues callback function, that'll change _is_dir value Try:self.conn.retrlines (' LIST%s '%ftp_parent_pat h,self._ftp_list) except Ftplib.error_perm,e:return self._is_dir return Self._is_dir def get_file (self,ftp_path,local _path= '. '): Ftp_path = Ftp_path.rstrip ('/') if Self._is_ftp_file (ftp_path): file_name = Os.path.basename (ftp_path) # If the local path is a directory, download the file to the directory if Os.path.isdir (local_path): File_handler = open (Os.path.join (local_path,file_name), ' WB ') Self.conn.retrbinary ("RETR%s"% (Ftp_path), File_handler.write) File_handler.close () #如果本地路径不是目录, but the upper directory exists, Elif Os.path.isdir (Os.path.dirname (Local_path)) by the filename of the local path as the downloaded file name: File_handler = open (Local_path, ' WB ') Self.conn.retrbinary ("RETR%s"% (Ftp_path), File_handler.write) File_handler.close () #如果本地路径不是目录, and the upper directory does not exist, exit else: print ' eroor:the dir:%s is not exist '%os.path.dirname (local_path) Else:print 'Eroor:the FTP file:%s is not exist '%ftp_path def put_file (self,local_path,ftp_path= '. '): Ftp_path = Ftp_path.rstrip ('/') If Os.path.isfile (local_path): File_handler = open (Local_path, "r") Local_file_name = Os.path.basename (Local_path) #如果远 Path is a directory, then upload files to this directory, filename unchanged if Self._is_ftp_dir (Ftp_path): Self.conn.storbinary (' STOR%s '%os.path.join (ftp_path,local _file_name), File_handler) #如果远程路径的上层是个目录, then upload files, file names according to the given name Elif Self._is_ftp_dir (Os.path.dirname (Ftp_path)): print ' STOR%s '%ftp_path self.conn.storbinary (' STOR%s '%ftp_path, File_handler) #如果远程路径不是目录, and the directory on the previous level does not exist, prompts for a given remote path error else: print ' eroor:the ftp path:%s is error '%ftp_path file_handler.close () else:print ' error:the file:%s ' are not exist '%local_ Path def get_dir (self,ftp_path,local_path= '. ', begin=true): Ftp_path = Ftp_path.rstrip ('/') #当ftp目录存在时下载 if Self._is_ Ftp_dir (Ftp_path): #如果下载到本地当前目录下, and create a directory #下载初始化: If the given local path does not exist, the FTP directory is stored in the given local directory. #ftp目录下文件存放的路径为local_path =local_path+os.path.basename (ftp_path) #例如: Download ftp folder A to a local A/b directory, thenFiles in the FTP a directory are downloaded to the local a/b/a directory if begin:if not Os.path.isdir (Local_path): Os.makedirs (Local_path) local_path= Os.path.join (Local_path,os.path.basename (Ftp_path)) #如果本地目录不存在, create a directory if not Os.path.isdir (Local_path): Os.makedirs ( Local_path) #进入ftp目录, start the recursive query self.conn.cwd (ftp_path) ftp_files = Self.conn.nlst () for file in Ftp_files:local_file = OS.PA Th.join (Local_path, file) #如果file FTP path is a directory that recursively uploads the directory (the flag that does not need to initialize begin is modified to false) #如果file The FTP path is a file that uploads the file directly if Self._is_ftp_ Dir (file): Self.get_dir (File,local_file,false) else:self.get_file (file,local_file) #如果当前ftp目录文件已经遍历完毕返回上一层目录 SELF.CONN.CWD ("..") return Else:print ' error:the dir:%s are not exist '%ftp_path return def put_dir (Self,local_pa Th,ftp_path= '. ', begin=true): Ftp_path = Ftp_path.rstrip ('/') #当本地目录存在时上传 if Os.path.isdir (local_path): # Upload initialization: If the given FTP path does not exist, it needs to be created and the local directory is stored in the given FTP directory. #本地目录下文件存放的路径为ftp_path =ftp_path+os.path.basename (local_path) #例如: Upload a local folder A to the FTP A/b directory, then the local a directory of files will be uploaded ftp a/b/ A directory if begin:if not Self._is_ftp_dir (Ftp_path):SELF.CONN.MKD (Ftp_path) ftp_path=os.path.join (Ftp_path,os.path.basename (Local_path)) #如果ftp路径不是目录, create the directory if not self . _is_ftp_dir (Ftp_path): SELF.CONN.MKD (Ftp_path) #进入本地目录, start a recursive query Os.chdir (local_path) local_files = Os.listdir (' .') For file in Local_files: #如果file本地路径是目录则递归上传目录 (the flag that does not need to initialize begin Again is modified to false) #如果file本地路径是文件则直接上传文件 if Os.path.isdir (file ): Ftp_path=os.path.join (ftp_path,file) self.put_dir (file,ftp_path,false) Else:self.put_file (File,ftp_path) # If the current local directory file has been traversed, return to the previous level directory Os.chdir ("..") Else:print ' error:the dir:%s are not exist '%local_path ' returns if __name__ = ' __ Main__ ': FTP = Ftpsync (' 192.168.1.110 ') ftp.login (' Test ', ' test ') #上传文件, do not rename #ftp. Put_file (' 111.txt ', ' A/b ') #上传文件, renaming # Ftp.put_file (' 111.txt ', ' a/112.txt ') #下载文件, do not rename #ftp. Get_file ('/a/111.txt ', R ' D: ') #下载文件, rename #ftp. Get_file ('/a/111. TXT ', R ' d:112.txt ') #下载到已经存在的文件夹 #ftp. Get_dir (' a/b/c ', R ' d:a ') #下载到不存在的文件夹 #ftp. Get_dir (' a/b/c ', R ' D:aa ') #上传到已经存在的文件夹 Ftp.put_dir (' B ', ' a ') #上传到不存在的文件夹 ftp.put_dir (' B ', ' aa/b/') |