Евгения обнови решението на 30.04.2015 16:56 (преди над 9 години)
+class File():
+ def __init__(self, name, content):
+ self.size = len(content) + 1
+ self.name = name
+ self.content = content
+ self.is_directory = False
+
+ def append(self, text):
+ self.content += text
+ self.size += len(text)
+
+ def truncate(self, text):
+ self.content = text
+ self.size = len(text) + 1
+
+
+class Directory():
+ def __init__(self, name):
+ self.size = 1
+ self.name = name
+ self.content = []
+ self.is_directory = True
+ self.is_mount_point = False
+
+ def directories(self):
+ return [obj for obj in self.content if obj.is_directory]
+
+ def files(self):
+ return [obj for obj in self.content if not obj.is_directory]
+
+ def nodes(self):
+ return self.content
+
+ def __contains__(self, node):
+ return node in self.content
+
+ def dir_get_node(self, path):
+ for node in self.content:
+ if node.name == path:
+ return node
+ return False
+
+
+class FileSystemError(Exception):
+ def __init__(self):
+ self.message = "Something in your file system went wrong!"
+
+
+class FileSystemMountError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+ self.message = "Something in the mounting went wrong!"
+
+
+class NodeDoesNotExistError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class SourceNodeDoesNotExistError(NodeDoesNotExistError):
+ def __init__(self):
+ super().__init__()
+
+
+class DestinationNodeDoesNotExistError(NodeDoesNotExistError):
+ def __init__(self):
+ super().__init__()
+
+
+class NotEnoughSpaceError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class DestinationNodeExistsError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class NonExplicitDirectoryDeletionError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class NonEmptyDirectoryDeletionError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class DestinationNotADirectoryError(FileSystemError):
+ def __init__(self):
+ super().__init__()
+
+
+class DirectoryHardLinkError(FileSystemError):
+ def __init__(self, directory):
+ super().__init__()
+ self.issuer = directory
+
+
+class MountPointNotEmptyError(FileSystemMountError):
+ def __init__(self):
+ super().__init__()
+
+
+class MountPointNotADirectoryError(FileSystemMountError):
+ def __init__(self):
+ super().__init__()
+
+
+class MountPointDoesNotExistError(FileSystemMountError):
+ def __init__(self):
+ super().__init__()
+
+
+class NotAMountPointError(FileSystemMountError):
+ def __init__(self):
+ super().__init__()
+
+
+class FileSystem():
+ def __init__(self, size_in_bytes):
+ self.size = size_in_bytes
+ self.available_size = size_in_bytes - 1
+ self.root = Directory('/')
+
+ def parent_path(self, path):
+ nodes_in_path = path.split('/')
+ current_node = self.root
+ searching_for_path = '/' + nodes_in_path[0]
+ for node in nodes_in_path[2:]:
+ next_node = current_node.dir_get_node(searching_for_path)
+ if next_node:
+ searching_for_path += ('/' + node)
+ current_node = next_node
+ else:
+ raise NodeDoesNotExistError
+ return current_node
+
+ def get_node(self, path):
+ node_where_path_is = self.parent_path(path)
+ return node_where_path_is.dir_get_node(path)
+
+ def create(self, path, directory=False, content=''):
+ try:
+ node_where_path_is = self.parent_path(path)
+ except NodeDoesNotExistError:
+ raise DestinationNodeDoesNotExistError
+
+ if node_where_path_is.dir_get_node(path):
+ raise DestinationNodeExistsError
+
+ if directory:
+ new = Directory(path)
+ if self.available_size < 1:
+ raise NotEnoughSpaceError
+ else:
+ new = File(path, content)
+ if self.available_size < new.size:
+ raise NotEnoughSpaceError
+
+ node_where_path_is.content.append(new)
+ self.available_size -= new.size
+
+ def direct_remove(self, remove_from, node_to_be_removed):
+ remove_from.content.remove(node_to_be_removed)
+ if not node_to_be_removed.is_directory:
+ self.available_size += node_to_be_removed.size
+ else:
+ self.available_size += 1
+ for node in node_to_be_removed.content:
+ self.direct_remove(node_to_be_removed, node)
+
+ def remove(self, path, directory=False, force=True):
+ node_where_path_is = self.parent_path(path)
+ node_to_be_removed = node_where_path_is.dir_get_node(path)
+
+ if not node_to_be_removed:
+ raise NodeDoesNotExistError
+
+ if not node_to_be_removed.is_directory:
+ self.direct_remove(node_where_path_is, node_to_be_removed)
+ elif not directory:
+ raise NonExplicitDirectoryDeletionError
+ elif node_to_be_removed.content and not force:
+ raise NonEmptyDirectoryDeletionError
+ else:
+ self.direct_remove(node_where_path_is, node_to_be_removed)
+
+ def move(self, source, destination):
+ try:
+ source_parent = self.parent_path(source)
+ except NodeDoesNotExistError:
+ raise SourceNodeDoesNotExistError
+
+ source_node = source_parent.dir_get_node(source)
+ self.direct_remove(source_parent, source_node)
+
+ try:
+ destination_parent = self.parent_path(destination)
+ except NodeDoesNotExistError:
+ raise DestinationNodeDoesNotExistError
+
+ destination_node = destination_parent.dir_get_node(destination)
+
+ source_own_name = source_node.name.split('/')[-1]
+ source_new_name = destination_node.name + ('/' + source_own_name)
+
+ if not destination_node.is_directory:
+ raise DestinationNotADirectoryError(destination)
+ elif destination_node.dir_get_node(source_new_name):
+ raise DestinationNodeExistsError
+ else:
+ source_node.name = source_new_name
+ destination_node.content.append(source_node)
+
+ def mount(self, file_system, path):
+ try:
+ point_parent = self.parent_path(path)
+ except NodeDoesNotExistError:
+ raise MountPointDoesNotExistError
+
+ mount_point = point_parent.dir_get_node(path)
+
+ if not mount_point.is_directory:
+ raise MountPointNotADirectoryError
+ elif mount_point.content:
+ raise MountPointNotEmptyError
+
+ mount_point.content = file_system.root.content
+ mount_point.is_mount_point = True
+
+ def unmount(self, path):
+ mounted_point = self.get_node(path)
+ if not mounted_point.is_mount_point:
+ raise NotAMountPointError
+
+ mounted_point.is_mount_point = False
+ mounted_point.content = []