Implement delete_dir in the FileStorage

plus options for deleting only empty directories and deleting
them recursively.

Not sure how cloudfile storage is or should be handled here. Are
things such as a "directory" even a concept there?
This commit is contained in:
Sebastian Spaeth 2012-12-12 16:29:14 +01:00 committed by Christopher Allan Webber
parent 79f7cfd900
commit b34d7e1d9b
2 changed files with 39 additions and 3 deletions

View File

@ -101,14 +101,28 @@ class StorageInterface(object):
def delete_file(self, filepath):
"""
Delete or dereference the file at filepath.
Delete or dereference the file (not directory) at filepath.
TODO: is the below comment correct? AFAIK, we won't clean up empty directories...
This might need to delete directories, buckets, whatever, for
cleanliness. (Be sure to avoid race conditions on that though)
"""
# Subclasses should override this method.
self.__raise_not_implemented()
def delete_dir(self, dirpath, recursive=False):
"""Delete the directory at dirpath
:param recursive: Usually, a directory must not contain any
files for the delete to succeed. If True, containing files
and subdirectories within dirpath will be recursively
deleted.
:returns: True in case of success, False otherwise.
"""
# Subclasses should override this method.
self.__raise_not_implemented()
def file_url(self, filepath):
"""
Get the URL for this file. This assumes our storage has been

View File

@ -62,10 +62,32 @@ class BasicFileStorage(StorageInterface):
return open(self._resolve_filepath(filepath), mode)
def delete_file(self, filepath):
# TODO: Also delete unused directories if empty (safely, with
# checks to avoid race conditions).
"""Delete file at filepath
Raises OSError in case filepath is a directory."""
#TODO: log error
os.remove(self._resolve_filepath(filepath))
def delete_dir(self, dirpath, recursive=False):
"""returns True on succes, False on failure"""
dirpath = self._resolve_filepath(dirpath)
# Shortcut the default and simple case of nonempty=F, recursive=F
if recursive:
try:
shutil.rmtree(dirpath)
except OSError as e:
#TODO: log something here
return False
else: # recursively delete everything
try:
os.rmdir(dirpath)
except OSError as e:
#TODO: log something here
return False
return True
def file_url(self, filepath):
if not self.base_url:
raise NoWebServing(