操作系统实验五 文件系统

实验五 文件系统

16281259 鲁鑫

  1. 实验简介:
    本实验要求在模拟的I/O系统之上开发一个简单的文件系统。用户通过create, open, read等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0至L − 1。I/O系统利用内存中的数组模拟磁盘。
  2. I/O系统
    实际物理磁盘的结构是多维的:有柱面、磁头、扇区等概念。I/O系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0至L−1,其中L表示磁盘的存储块总数。实验中,我们可以利用数组ldisk[C][H][B]构建磁盘模型,其中CHB 分别表示柱面号,磁头号和扇区号。每个扇区大小为512字节。I/O系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。文件系统和I/O系统之间的接口由如下两个函数定义:
    • read_block(int i, char *p);
    该函数把逻辑块i的内容读入到指针p指向的内存位置,拷贝的字符个数为存储块的长度B。
    • write block(int i, char *p);
    该函数把指针p指向的内容写入逻辑块i,拷贝的字符个数为存储块的长度B。此外,为了方便测试,我们还需要实现另外两个函数:一个用来把数组ldisk 存储到文件;另一个用来把文件内容恢复到数组。
  3. 系统说明
    用户与文件系统之间的接口
    文件系统需提供如下函数;create, destroy, open, read, write。
    • create(filename): 根据指定的文件名创建新文件。
    • destroy(filename): 删除指定文件。
    • open(filename): 打开文件。该函数返回的索引号可用于后续的read,write,lseek,close操作。
    • close(index): 关闭制定文件。
    • read(index, mem_area, count): 从指定文件顺序读入count个字节mem area指定的内存位置。读操作从文件的读写指针指示的位置开始。
    • write(index, mem_area, count): 把mem area指定的内存位置开始的count个字节顺序写入指定文件。写操作从文件的读写指针指示的位置开始。
    • lseek(index, pos): 把文件的读写指针移动到pos指定的位置。pos是一个整数,表示从文件开始位置的偏移量。每次读写操作之后,它指向最后被访问的字节的下一个位置。lseek能够在不进行读写操作的情况下改变读写指针能位置。
    • directory: 列表显示所有文件及其长度。
  4. 实验设计:
    1 菜单界面:
    在这里插入图片描述
    2.创建磁盘
    在这里插入图片描述
    3 Write_block
    功能:该函数把指针 p 指向的盘块缓冲内容写入到 i#逻辑块,缓冲区大小与物理盘块大小相等为 512Bytes。
    实现要领:利用 fseek 和 fwrite 函数找到位置并将数据写入物理块。最后将缓冲区置为空。注意写入计数,防止写入数据大于物理块大小 512Bytes。
    在这里插入图片描述
    4 Read_block
    功能:该函数把 i#逻辑块的内容读入到指针 p 指向的盘块缓冲(注意读入计数处理)。
    实现要领:利用 fseek 和 fscanf 函数找到位置并将数据读入缓冲区。最后输出缓冲区内的数据进行验证。注意缓冲区大小为 512Bytes,通过 j 对数组 p 进行计数,防止输入缓冲区的数据大于缓冲区大小。
    在这里插入图片描述
    5 create
    功能:创建一个文件,文件名和后缀由用户自己定义。命令格式为 newfile+ 文件名.后缀名.
    目录项结构:
    起始字节 长度(字节数) 内容含义
    0 8 文件名(自动大写)
    8 3 文件扩展名
    11 1 文件属性(创建文件时不用修改,表示为普通文件)
    26 2 文件第一逻辑簇号
    28 4 文件大小(字节数)
    表 5.2 目录项结构设计表
    实现要领:
  1. 读入文件名,大小写转换。

  2. 以可读写方式打开文件。

  3. 判断文件名是否已存在,若存在,函数调用失败返回。

  4. 计算文件的长度以及需要占用的物理块数。

  5. 寻找循环文件需要占用的物理块数个空闲位置。
    寻找空闲位置时需要分奇数偶数讨论,将1.5字节的数值取出来后与0比较,等于 0 则为空闲,可以存入数据。
    每找到一个就把自己的逻辑簇号写入前一个簇的 FAT 文件表项中。如果是最后一个则写 0xFFF,如果是第一个则不用写。
    在写入时,由于文件表项占用 1.5 个字节,因此如果写入的位置是偶数倍 1.5 字节,则是先写整字节再写半字节;如果是奇数倍 1.5 字节,则是先写半字节再整字节。
    在写入半字节的时候需要先用 getc 函数读出该字节原来存在的那半个字节,再将这个半个字节与 0x0F 做或运算,将或运算的结果写入该字节位置中。

  6. 寻找有空闲位置的目录项
    首字节为 0x00 就表示该目录项为空。
    创建目录项时按照上表写入文件名,扩展名以及第一逻辑簇号和文件大小,注意文件读写是按字节进行的,通过移位和取模取余等操作可以得到每个字节的值,然后通过 fseek 找到它们的位置并将它们写入即可。注意文件名要自动大写。

  7. 将数据写入数据区
    在这里插入图片描述
    6 Read_file
    功能:读取文件。命令格式为 readfile+文件名.后缀名.
    实验要领:存入用户输入的文件名,在目录表中查找非空目录项,并将从目录项中读出的文件名与用户输入的文件名进行比较,若一致且不是子目录名,则找到了文件,否则未找到文件。如果找到了文件,还需在目录项中读出文件的第一逻辑簇号,用第一逻辑簇号 fat 文件表寻找文件都存在哪些位置,从而将文件读出。

    7 Rename_file
    功能:重命名文件。命令格式 renamefile+原文件名+新文件名
    实现要领:查找目录表,寻找与输入源文件名一致的文件名,将其改为新的文件名。如果新文件名与原文件名一致,不需要修改。如果新文件名与根目录下已有文件名相同,则拒绝修改文件名。

在这里插入图片描述

8 Delete_file
功能:删除文件。命令:deletefile+文件名。
实现要领:查找目录项,如果找到匹配的文件名且不是子目录,则读出第一逻辑簇号,到 fat 文件表中寻找所以数据将其删除,最后把相应目录项和 fat 文件表表项删除。
在这里插入图片描述

9 Create_dir
功能:在当前目录下创建一个子目录。命令:createdir+子目录名。
实现要领:将目录项的文件属性设为子目录 0x10。注意通过文件名和文件属性是否为子目录来判断子目录名是否在此目录中已经存在。
在这里插入图片描述

10 Delete_dir
功能:删除子目录。命令:deletedir+子目录名。
实现要领:在目录表中查找文件名为子目录名以及文件属性为子目录的目录项,将其删除。
在这里插入图片描述
11 directory
功能:显示当前目录下所有文件及子目录名。命令:display。

至此,文件系统的实现已基本完成。具体代码上传:
github代码库

【实验目的】 1. 了解文件系统的原理; 2. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 【实验准备】 1.文件的逻辑结构  顺序文件  索引文件  索引顺序文件  直接文件和哈希文件 2.外存分配方式  连续分配  链接分配  索引分配 【实验内容】 1. 实验要求 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 2. 实验题目  设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。  程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。  为了便于实现,对文件读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)。 M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 文件名 A F D 打开文件名 打开保护码 读写指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值