操作系统:实验七文件管理
文章目录
1. 实验目的
2. 实验内容
3. 实验准备
数据结构定义
以下是一些基本的数据结构定义:
文件目录项
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春