转载请注明出处
http://blog.csdn.net/xugangjava/article/details/7401906
总体思路是:使用递归来 遍历文件 和文件夹 遍历过程中 直接删除掉 文件 将文件夹路径添加到列表中
yield 操作是在 for 递归遍历子文件夹 之后 所以先返回的是子文件夹
这时返回的文件夹肯定是空文件夹 ,使用rm命令就可以直接删除掉文件夹了
下面是核心代码
# -*- coding:gbk -*-
# Author: 许刚
# Created: 2012/3/28
import sitecustomize
import thread
from wx import _misc
from ftplib import FTP
import wx,os,uuid,socket,sys,time,re
from twisted.python import log
import wx.lib.agw.ultimatelistctrl as ULC
from msgbox import *
from db import Cfg
from win32com.shell import shell, shellcon
from win32con import FILE_ATTRIBUTE_NORMAL
from base import PanelWarpCtrl,FileItem,FileImageList
########################################################################
class FtpHandler(FTP):
"""ftp uploader handler"""
#blocksize=65536
def connect(self):
return self.login(Cfg.c_name,Cfg.c_pwd)
def login(self,name,pwd):
try:
FTP.connect(self,Cfg.c_ftpurl,int(Cfg.c_ftpport))
except:
log.err(sys.exc_info())
MessageBoxError('无法连接上传服务器!')
return False
try:
FTP.login(self,name,pwd)
except:
log.err(sys.exc_info())
MessageBoxError('无法连接上传服务器,\n用户名或密码错误!')
return False
return True
def delete(self, filename):
'''Delete a file.'''
self.sendcmd('DELE ' + filename)
def mlsd(self,callback = None):
self.retrlines('MLSD',callback)
def listdir(self,root):
items=[]
self.mlsd(lambda x:items.append(FileItem(x)))
return items
def deletedir(self,root):
def walk(root):
dirs = []
def ParseLine(line):
f=FileItem(line)
if f.isdir:
dirs.append(os.path.join(root,f.fname))
else:
self.delete(f.fname)
self.cwd(root)
self.mlsd(ParseLine)
for name in dirs:
new_path = os.path.join(root, name)
for x in walk(new_path):yield x
yield dirs
for dirs in walk(root):
for d in dirs:
self.rmd(d)
self.rmd(root)
其中FileItem用来解析 Ftp 返回的文件列表
mport wx
import re,os
from wx import MimeTypesManager
from win32com.shell import shell, shellcon
from win32con import FILE_ATTRIBUTE_NORMAL
mimeTypeManager=MimeTypesManager()
########################################################################
class FileItem:
pattern=re.compile('modify=(?P<modify>\d+);perm=(?P<perm>\w+);size=(?P<size>\d+);type=(?P<type>\w+);\s(?P<filename>.*)')
def __init__(self,line):
m=FileItem.pattern.search(line)
self.isdir=m.group('type')=='dir'
self.size='' if self.isdir else m.group('size')
self.time='' if self.isdir else m.group('modify')
self.fname=m.group('filename')
self.ext=os.path.splitext(self.fname)[-1]
def GetDesc(self):
desc=''
if self.isdir:
desc='文件夹'
elif self.ext:
fileType=mimeTypeManager.GetFileTypeFromExtension(self.ext)
if fileType:
desc=fileType.GetDescription()
if desc is None:
desc=''
return desc
最后运行结果