def create(self, file_name): superblock = self._superblock fat = self._fat inode_map = self._inode_map root = self._root if file_name in root.list: raise FileExistsError('Файл с данным именем уже существует') if superblock.free_cluster_num == 0: raise NoFreeClustersException( 'Не осталось свободных блоков данных') if len(file_name) > 59: raise ValueError('Имя файла должно быть не более 59 символов') inode_id = inode_map.get_free_inode() now = int(time()) first_cluster = fat.get_free_cluster() inode = Inode(inode_id, uid=self._uid, ctime=now, mtime=now, first_cluster=first_cluster) inode.set_permissions(owner_read=True, owner_write=True, other_read=True, other_write=False) fat.set(index=first_cluster, value=-1) inode_map.set(inode.id, False) root.add(file_name, inode)
def create(self, file_name): superblock = self._superblock fat = self._fat inode_map = self._inode_map root = self._root if file_name in root.list: raise FileExistsError('Файл с данным именем уже существует') if superblock.free_cluster_num == 0: raise NoFreeClustersException( 'Не осталось свободных блоков данных') if len(file_name) > 59: raise ValueError('Имя файла должно быть не более 59 символов') inode_id = inode_map.get_free_inode() now = int(time()) first_cluster = fat.get_free_cluster() inode = Inode(inode_id, uid=self._uid, ctime=now, mtime=now, first_cluster=first_cluster) inode.set_permissions(owner_read=True, owner_write=True, other_read=True, other_write=False) fat.set(index=first_cluster, value=-1) inode_map.set(inode.id, False) root.add(file_name, inode)
def add(self, file_name, inode): superblock = self._superblock fat = self._fat file = self._file file_name = bytes(file_name, "utf-8") clusters = fat.get_clusters_chain(0) empty_space = None for cluster in clusters: file.seek(self._cluster_offset(cluster)) for _ in range(superblock.cluster_size // 64): data = unpack("59sci", file.read(64)) if ord(data[1]) == 0: empty_space = file.tell() - 64 break if empty_space: break else: cluster_index = fat.get_free_cluster() fat.set(clusters[-1], cluster_index) fat.set(cluster_index, -1) empty_space = self._cluster_offset(cluster_index) root_inode = Inode.get_inode(superblock.inode_array_offset, file, 0) root_inode.size = (len(clusters) + 1) * superblock.cluster_size Inode.set_inode(superblock.inode_array_offset, file, root_inode) file.seek(empty_space) file.write(pack("59sci", file_name, bytes([len(file_name)]), inode.id)) self._list[file_name.decode()] = inode Inode.set_inode(superblock.inode_array_offset, file, inode)
def _init_files_list(self): superblock = self._superblock fat = self._fat file = self._file self._list = {} clusters = fat.get_clusters_chain(0) for cluster in clusters: file.seek(self._cluster_offset(cluster)) for _ in range(superblock.cluster_size // 64): data = unpack("59sci", file.read(64)) length = ord(data[1]) if length: position = file.tell() self._list[data[0][:length].decode()] = Inode.get_inode( superblock.inode_array_offset, file, data[2] ) file.seek(position)
def format(file_name, password='******', size=50 * 1024 * 1024): file = open(file_name, 'wb') file.seek(size - 1) file.write(b'\0') superblock = SuperBlock.default(size) file.seek(superblock.inode_array_offset) inode_table = [Inode(id) for id in range(superblock.cluster_num)] for inode in inode_table: file.write(inode.pack()) cluster_size = superblock.cluster_size offset = cluster_size - file.tell() % cluster_size superblock.first_cluster_offset = file.tell() + offset superblock.free_cluster_num = ( superblock.cluster_num - superblock.first_cluster_offset // cluster_size) fat = FAT.empty(superblock.free_cluster_num, superblock) inode_map = InodeMap.empty(superblock.free_cluster_num) Root.write(superblock, fat, inode_map, file) superblock.write(file) fat.write(superblock.fat_offset, file) inode_map.write(superblock.inode_map_offset, file) file.close() fs = FileSystem(file_name, 0) fs.create('users') hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode() fs.write('users', '0 admin %s' % hash)
def write(superblock, fat, inode_map, file): now = int(time()) inode = Inode(id=0, size=superblock.cluster_size, ctime=now, mtime=now, first_cluster=0) Inode.set_inode(superblock.inode_array_offset, file, inode) inode_map.set(inode.id, False) fat.set(0, -1)
def update_inode(self, file_name, inode): self._list[file_name] = inode Inode.set_inode(self._superblock.inode_array_offset, self._file, inode)