summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-02-06 21:38:09 (GMT)
committerGuido van Rossum <guido@python.org>1998-02-06 21:38:09 (GMT)
commitd76732918a12e03e95b753dde2691268592ae0cf (patch)
tree5cb2f660fd3c0cca33e58c22705f54218c48c02a /Lib
parenta0fec2b5df6827300bf80511a1fd6596e6f71e21 (diff)
downloadcpython-d76732918a12e03e95b753dde2691268592ae0cf.zip
cpython-d76732918a12e03e95b753dde2691268592ae0cf.tar.gz
cpython-d76732918a12e03e95b753dde2691268592ae0cf.tar.bz2
Added rmtree(), to recursively remove a directory tree.
Code by David Ascher (docstring by me).
Diffstat (limited to 'Lib')
-rw-r--r--Lib/shutil.py32
1 files changed, 32 insertions, 0 deletions
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)