操作系统:实验七文件管理

文章目录

  • 1. 实验目的
  • 2. 实验内容
  • 3. 实验准备
  • 数据结构定义
  • 文件目录项
  • 文件分配表(FAT)项
  • 模拟程序设计
  • 初始化磁盘和FAT
  • 分配磁盘空间
  • 保存文件
  • 增加记录
  • 主程序

  • 1. 实验目的

  • 理解文件的逻辑结构与物理结构:文件的逻辑结构是用户视角下文件的组织方式,如顺序、链接和索引结构;物理结构是文件在存储介质上的实际存储方式,如连续、链接和索引方式。
  • 掌握文件的物理结构与存取文件方法之间的关系:了解不同的物理结构如何影响文件的存取效率和方法。
  • 2. 实验内容

  • 设计文件分配表(FAT):创建一个数据结构来模拟文件分配表,记录文件在磁盘上的位置。
  • 模拟程序实现:编写程序实现文件保存和记录增加的功能。
  • 位示图管理:使用位示图来展示磁盘的使用情况。
  • 显示文件目录、位示图、索引表:在程序执行的每一步,展示文件目录、位示图和索引表的状态。
  • 3. 实验准备

  • 理解磁盘文件的结构及管理方法:了解文件如何在磁盘上存储和管理。
  • 理解文件目录及文件分配表(FAT):了解文件目录存储文件的元数据,FAT记录文件数据的物理位置。
  • 理解文件存取的方法:了解顺序访问、随机访问等文件存取方法。
  • 数据结构定义

    以下是一些基本的数据结构定义:

    文件目录项
    class FileDirectoryEntry:
        def __init__(self, filename, fid, size, faddr):
            self.filename = filename  # 文件名
            self.fid = fid  # 文件唯一标识符
            self.size = size  # 文件大小(记录个数)
            self.faddr = faddr  # 文件首地址(在FAT中的索引)
    
    文件分配表(FAT)项
    class FATEntry:
        def __init__(self, next_block):
            self.next_block = next_block  # 下一个块的索引,-1表示文件结束
    

    模拟程序设计

    以下是模拟程序设计的概要:

    初始化磁盘和FAT
    def init_disk(disk_size):
        disk = [0] * disk_size  # 模拟磁盘块
        fat = [FATEntry(-1)] * disk_size  # 初始化FAT,-1表示空闲块
        return disk, fat
    
    分配磁盘空间
    def allocate_space(fat, num_blocks):
        free_blocks = []
        for i, entry in enumerate(fat):
            if entry.next_block == -1:  # 空闲块
                free_blocks.append(i)
            if len(free_blocks) == num_blocks:
                for i in range(num_blocks - 1):
                    fat[free_blocks[i]].next_block = free_blocks[i + 1]
                fat[free_blocks[-1]].next_block = -1
                return free_blocks
        return None
    
    保存文件
    def save_file(disk, fat, file_dir, filename, records):
        fid = len(file_dir)  # 分配文件ID
        file_dir_entry = FileDirectoryEntry(filename, fid, len(records), 0)
        file_dir.append(file_dir_entry)
        
        blocks = allocate_space(fat, len(records))
        if blocks is None:
            print("Not enough space")
            return
        
        for i, block in enumerate(blocks):
            disk[block] = records[i]  # 保存记录到磁盘
            file_dir_entry.faddr = blocks[0]  # 更新文件首地址
            fat[block].next_block = blocks[i + 1] if i < len(blocks) - 1 else -1
        file_dir_entry.size = len(records)
    
    增加记录
    def add_record(disk, fat, file_dir, filename, record):
        file_entry = next((entry for entry in file_dir if entry.filename == filename), None)
        if file_entry is None:
            print("File not found")
            return
        
        new_block = allocate_space(fat, 1)[0] if file_entry.size < len(disk) else None
        if new_block is None:
            print("Not enough space")
            return
        
        disk[new_block] = record
        last_block_index = file_entry.faddr + file_entry.size - 1
        fat[last_block_index].next_block = new_block
        fat[new_block].next_block = -1
        file_entry.size += 1
    
    主程序
    def main():
        disk_size = 100  # 假设有100个磁盘块
        disk, fat = init_disk(disk_size)
        file_dir = []  # 文件目录
    
        # 保存文件
        save_file(disk, fat, file_dir, "file1", ["record1", "record2", "record3"])
        
        # 显示文件目录、位示图、索引表
        print("File Directory:", file_dir)
        print("Bitmap:", [1 if entry.next_block != -1 else 0 for entry in fat])
        print("Index Table:", [(entry.fid, entry.faddr) for entry in file_dir])
        
        # 增加记录
        add_record(disk, fat, file_dir, "file1", "record4")
        
        # 显示文件目录、位示图、索引表
        print("Updated File Directory:", file_dir)
        print("Updated Bitmap:", [1 if entry.next_block != -1 else 0 for entry in fat])
        print("Updated Index Table:", [(entry.fid, entry.faddr) for entry in file_dir])
    
    if __name__ == "__main__":
        main()
    

    这个模拟程序提供了一个基本的框架,可以根据实验要求进行扩展和修改。例如,可以添加文件删除功能、文件读取功能,或者实现不同的文件物理结构,如链接结构或索引结构。

    作者:Argonaut春

    物联沃分享整理
    物联沃-IOTWORD物联网 » 操作系统:实验七文件管理

    发表回复