Клара обнови решението на 30.04.2015 16:35 (преди над 9 години)
+import tempfile
+import exceptions
+import os
+import shutil
+from os import listdir
+from os.path import isfile
+
+
+class NodeDoesNotExistError(Exception):
+
+ def __init__(self):
+ self.message = ''
+
+
+class FileSystemMountError(Exception):
+
+ def __init__(self):
+ self.message = ''
+
+
+class SourceNodeDoesNotExistError(NodeDoesNotExistError):
+
+ def __init__(self):
+ self.message = 'Source node does not exist! '
+
+
+class DestinationNodeDoesNotExistError(NodeDoesNotExistError):
+
+ def __init__(self):
+ self.message = 'Destination node does not exist! '
+
+
+class MountPointDoesNotExistError(FileSystemMountError):
+
+ def __init__(self):
+ self.message = 'Mouse point does not exist! '
+
+
+class MountPointNotADirectoryError(FileSystemMountError):
+
+ def __init__(self):
+ self.message = 'Mouse point is not a directory! '
+
+
+class MountPointNotEmptyError(FileSystemMountError):
+
+ def __init__(self):
+ self.message = 'Mouse point is not empty!'
+
+
+class NotAMountpointError(FileSystemMountError):
+
+ def __init__(self):
+ self.message = 'Not a mount point error'
+
+
+class DestinationNodeExistsError(NodeDoesNotExistError):
+
+ def __init__(self):
+ self.message = 'Destination node exists error'
+
+
+class File:
+
+ def __init__(self, path, content):
+ self.path = path
+ self.content = content
+ self.is_directory = False
+
+ def append(text):
+ self.content = self.content + text
+
+ def truncate(text):
+ self.content = ''
+ self.content += text
+
+ def size():
+ return len(self.content) + 1
+
+
+class Directory:
+
+ def __init__(self, path):
+ self.path = path
+ self.is_directory = True
+
+ def files():
+ return [f for f in listdir(self.path)
+ if isfile(join(self.path, f))]
+
+ def directories():
+ return [f for f in listdir(self.path)
+ if not isfile(join(self.path, f))]
+
+ def nodes():
+ return os.listdir(self.path)
+
+
+class FileSystem:
+
+ def __init__(self, size):
+ self.size = size
+ self.available_size = size - 1
+ self.path = "/"
+ self.explorer = {}
+
+ def __getsize__(self):
+ return self.size
+
+ def __getavsize__(self):
+ return self.available_size
+
+ def _get_explorer(self):
+ return self.explorer
+
+ def get_node(self, path):
+ if self.is_existing_file(path):
+ file_content = self.get_content(path)
+ if file_content == '':
+ return Directory(path)
+ else:
+ return File(path, file_content)
+ else:
+ raise NodeDoesNotExistError
+
+ def is_existing_file(self, path):
+ for key, value in self.explorer.items():
+ if path == key:
+ return True
+
+ def get_content(self, path):
+ for key, value in self.explorer.items():
+ if path == key:
+ return value
+
+ def is_not_empty(self, path):
+ files = os.listdir(path)
+ if len(files) != 0:
+ return True
+
+ def create(self, path, *, directory=False, content=''):
+ if content == '':
+ directory is True
+
+ if directory is False:
+ if self.is_existing_file(path):
+ raise DestinationNodeExistsError
+ len_of_file = len(content) + 1
+ if self.__getavsize__() >= len_of_file:
+ make_file = open("./%s" % (path), 'a+')
+ self.available_size = self.available_size - len_of_file
+ make_file.write(content)
+ make_file.close()
+ self.explorer[path] = content
+ else:
+ raise NotEnoughSpaceError
+ else:
+ if self.is_existing_file(path) is not True:
+ making_dir = os.mkdir(path)
+ self.available_size += 1
+ self.explorer[path] = content
+ else:
+ raise DestinationNodeExistsError
+
+ def remove(self, path, *, directory=False, force=True):
+ if os.path.isdir(path):
+ if directory is True:
+ if force is True and is_not_empty(path) is True:
+ del self.explorer[path]
+ available_size -= 1
+ os.rmdir(path)
+ else:
+ raise NonEmptyDirectoryDeletionError
+ else:
+ raise NonExplicitDirectoryDeletionError
+ else:
+ if is_existing_file(path):
+ file_content = read()
+ len_of_file = len(file_content) + 1
+ available_size += len_of_file
+ del self.explorer[path]
+ os.remove(path)
+
+ def move(self, source, destination):
+ try:
+ value = self.explorer[source]
+ except KeyError:
+ raise SourceNodeDoesNotExistError
+ try:
+ value = self.explorer[destination]
+ if os.path.isdir(destination):
+ dirs = os.listdir(destination)
+ for files in dirs:
+ if files == source:
+ raise DestinationNodeExistsError
+ shutil.move(source, destination)
+ else:
+ raise DestinationNotADirectoryError
+ except KeyError:
+ raise DestinationNodeDoesNotExistError
+
+ def link(self, source, destination, *, symbolic=True):
+ if is_existing_file(path) is not True and symbolic is True:
+ raise NodeDoesNotExistError
+
+ if is_existing_file(path) is True:
+ if symbolic is False:
+ os.link(source, destination)
+ else:
+ os.symlink(source, destination)
+ else:
+ raise SourceNodeDoesNotExistError
+ if os.path.isdir(source) is True and symbolic is False:
+ raise DirectoryHardLinkError
+
+ def mount(self, file_system, path):
+ if is_not_empty(path):
+ raise MountPointNotEmptyError
+ if not os.path.isdir(path):
+ raise MountPointNotADirectoryError
+ if not is_existing_file(path):
+ raise MountPointDoesNotExistError
+
+ def unmount(self, path):
+
+ if is_existing_file(path) is False:
+ raise NodeDoesNotExistError