From d76732918a12e03e95b753dde2691268592ae0cf Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 6 Feb 1998 21:38:09 +0000 Subject: Added rmtree(), to recursively remove a directory tree. Code by David Ascher (docstring by me). --- Lib/shutil.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Lib/shutil.py b/Lib/shutil.py index 60c5c6d..2bfe331 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -93,3 +93,35 @@ def copytree(src, dst, symlinks=0): # XXX What about devices, sockets etc.? except (IOError, os.error), why: print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why)) + +def rmtree(path, ignore_errors=0, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if + onerror is set, it is called to handle the error; otherwise, an + exception is raised. + + """ + cmdtuples = [] + _build_cmdtuple(path, cmdtuples) + for cmd in cmdtuples: + try: + apply(cmd[0], (cmd[1],)) + except: + exc = sys.exc_info() + if ignore_errors: + pass + elif onerror: + onerror(cmd[0], cmd[1], exc) + else: + raise exc[0], (exc[1][0], exc[1][1] + ' removing '+cmd[1]) + +# Helper for rmtree() +def _build_cmdtuple(path, cmdtuples): + for f in os.listdir(path): + real_f = os.path.join(path,f) + if os.path.isdir(real_f) and not os.path.islink(real_f): + _build_cmdtuple(real_f, cmdtuples) + else: + cmdtuples.append(os.remove, real_f) + cmdtuples.append(os.rmdir, path) -- cgit v0.12