#!/usr/bin/python
# -*- coding:utf-8 -*-
from ftplib import FTP
import os


CONST_HOST = '127.0.0.1'
CONST_PORT = 8200
CONST_USERNAME = 'admin'
CONST_PWD = 'password'


class FtpTree:
    def __init__(self,verbose = False):
        self.verbose = verbose
        try:
            self.ftp = FTP()
            self.ftp.connect(CONST_HOST,CONST_PORT)
            self.ftp.login(CONST_USERNAME,CONST_PWD)
        except:
            if self.verbose:
                print('ftp connect failed!')
                exit(0)
                
    def existflag(self,memberName):
        if memberName in self.ftp.nlst():
            return 1
        else:
            return 0
        
    def ftpmkdir(self,fileName):
        self.ftp.cwd(fileName)
        if self.verbose:
            print(self.ftp.dir())
    
    def ftpclose(self):
        self.ftp.quit()
    
    def deletefolder(self,folderName):
        self.ftpcwd(folderName)
        root_lists = self.ftp.nlst()
        for root_list in root_lists:
            try:
                self.ftp.delete(root_list)
            except:
                self.ftp.deletefolder(root_list)
        self.ftpcwd('..')
        self.ftprmd(folderName)
    
    def deletefile(self,fileName):
        self.ftp.delete(fileName)
    
    def deletermd(self,fileName):
        self.ftp.rmd(fileName)
    
    def uploadfile(self,filePath,fileName):
        if not self.existflag(fileName):
            fp = open(filePath,'rb')
            self.ftp.storbinary('STOR %s' % fileName,fp)
            fp.close()

    def uploadfolder(self,path):
        fileDirs = os.listdir(path)
for fileDir in fileDirs:
filePath = path + '/' + fileDir
if os.path.isfile(filePath):
self.uploadfile(filePath,fileDir)
if os.path.isdir(filePath):
try:
self.ftpmkdir(fileDir)
except:
pass
self.ftpcwd(fileDir)
self.uploadfolder(filePath)
self.ftpcwd('..')

def downloadfile(self,localPath,fileName):
localFilePath = localPath + '/' + fileName
if os.path.isdir(localPath) and self.existflag(fileName):
fp = open(localFilePath,'wb')
self.ftp.retrbinary('RETR %s' % fileName,fp.write)
fp.close()
else:
print('download failed!')
exit(0)

def downloadfolder(self,localPath):
if not os.path.isdir(localPath):
os.mkdir(localPath)
else:
print(localPath,' was already exist!')
listDirs = []
self.ftp.dir(listDirs.append)
for listDir in listDirs:
if '<DIR>' in listDir.split():
self.ftpcwd(listDir.split()[-1])
self.downloadfolder(localPath + '/' + listDir.split()[-1])
else:
self.downloadfolder(localPath, listDir.split()[-1])
self.ftpcwd('..')

#self test
if __name__ == '__main__':
ftpclass = FtpTree(verbose = True)
if ftpclass.existflag('svn_code'):
ftpclass.ftpcwd('svn_code')

# delete
if ftpclass.existflag('trunk_svn11135'):
ftpclass.deletefolder('trunk_svn11135')

# upload
fileName = 'trunk_svn11136'
folderPath = 'd:/svn' + '/' + fileName
if os.path.exists(folderPath):
ftpclass.ftpmkdir(fileName)
ftpclass.ftpcwd(fileName)
ftpclass.uploadfolder(folderath)
else:
print('upload file not exist!')

# download
downloadDir = 'd:/svn'
downloadFile = 'trunk_svn11303'
if ftpclass.existflag(downloadFile):
ftpclass.ftpcwd(downloadFile)
ftpclass.downloadfolder(downloadDir + '/' + downloadFile)
else:
print(downloadFile, ' not exist!')
exit(0)

ftpclass.ftpclose()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐