示例#1
0
文件: Root.py 项目: Djaler/PyOS
    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)
示例#2
0
文件: Root.py 项目: Djaler/PyOS
    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)