模拟文件系统的设计与实现

模拟文件系统的设计与实现


一、前言

模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
本文是在学习完操作系统课程后所完成的课程设计,文中就模拟文件管理系统进行了简单的研究。

二、选题

文件系统的目录结构采用类似 Linux 的树状结构。
在此文件管理系统中,可实现的操作有:
改变目录:格式: cd <目录名>
显示目录:格式: dir <目录名>
创建目录:格式: md <目录名>
删除目录:格式: rd <目录名>
新建文件:格式: edit <文件名>
删除文件:格式: del <文件名>
退出文件系统:格式: exit

三、分析

通过需求分析可知,模拟文件系统有一下几个功能模块:

  1. 进入系统模块
  2. 对文件的相关操作模块
    (1) 创建文件
    在用户登录后才具有的功能,查找一个未使用的文件块用来
    存放用户的文件信息,构建一个文件系统的元素放入找到的
    文件块中。新建文件时要求输入文件名称,当文件名称不与
    已存在的文件目录中名称冲突时,同时文件不发生越界,且
    磁盘空间成功分配,则文件创建成功。
    (2) 删除文件
    在文件目录中选中要删除的文件,若文件存在则继续判断文
    件是否被锁定。如果文件正使用处于锁定状态则删除失败。
    若处于非锁定状态,则删除成功。
  3. 对目录的相关操作模块
    (1) 创建目录
    (2) 删除目录
    (3) 列文件目录
    (4) 列全部文件目录

在这里插入图片描述
在这里插入图片描述

四、实现目标

通过一个简单文件系统目录结构的模拟设计,加深了解文件系统的功能和实现复习数据结构中的树型结构。熟悉树节点的插入、删除、修改以及树的遍历方法。编写一段程序,模拟实现一个简单文件系统的树型目录结构,实现以下命令:
在这里插入图片描述

五、编写代码

class Folder:
    def __init__(self, father, name):
        '''
        :param father: 上级目录
        :param name: 目录名称
        '''
        self.father = father
        self.name = name
        # 目录列表
        self.folder = []
        # 文件列表
        self.file = []
           
root = Folder(father=None, name='root')
cur = root
f = Folder
path = 'root'
disk = 1000
flag = 0

def applydisk(size):
    #申请磁盘空间
    global disk
    disk = disk - int(size)
    if disk < 0:
        print("磁盘空间不够无法分派")
    else:
        print("磁盘空间分配成功")
        print("已分配{0:}个磁盘空间,还剩{1:}个磁盘空间".format(int(size),disk))

def releasedisk(size):
    global disk
    disk = disk + int(size)
    if disk>1000:
        print("磁盘空间出现错误拒绝释放")
    else:
        print("磁盘空间释放成功")
        print("还剩{0:}个磁盘空间".format(disk))

def edit(name, size):
    #创建文件
    global cur
    if name in cur.file:
        return print('存在同名文件,新建文件失败!')
    cur.file.append({name:size})
    applydisk(size)
    return print('新建文件成功!')

def md(name):
    # 创建目录
    global cur, path
    if name in cur.folder:
        return print('存在同名文件夹,新建文件夹失败!')
    folder = Folder(father=cur, name=name)
    cur.folder.append(folder)
    return print('新建文件夹成功!')

def delete(name):
    # 删除文件
    global flag
    global cur
    for i in cur.file:
        for key, value in i.items():
            if key == name:
                cur.file.pop(cur.file.index(i))
                flag = 1
        if flag == 1:
            flag = 0
            releasedisk(value)
            return print('删除文件成功!')
    return print('文件不存在,删除文件失败!')

def rd(name):
    # 删除目录
    global cur
    for i in cur.folder:
        if i.name == name:
            cur.folder.pop(cur.folder.index(i))
            return print('删除文件夹成功!')
    return print('文件夹不存在,删除文件夹失败!')

def cd(name):
    # 改变当前目录
    global cur, path
    if name == '':
        if cur.father != None:
            path = path[:(len(path)-len(cur.name))-1]
            cur = cur.father
    else:
        for i in cur.folder:
            if i.name == name:
                cur = i
                path = path + '/' + name
                return
        return print('找不到指定文件夹!')

def dir():
    # 列文件目录
    global cur
    for i in cur.file:
        for key ,value in i.items():
            print(key+"(文件类型)")

def dirall():
    # 列出全体文件目录
    global cur
    dir()
    for i in cur.folder:
        print(i.name+"(文件夹类型)")

def stordis():
    #显示文件存储表
    global cur
    print("="*23)
    print("|{:^16}|".format("文件存储表"))
    print("="*23)
    for i in cur.file:
        for key, value in i.items():
            print("|{0:^10}|{1:^10}|".format(key, value))
            print("="*23)

if __name__ == '__main__':
    print("进入模拟文件系统")
    while True:
        print(path, end='>')
        order = input().split(' ')
        if order[0] == 'edit':
            try:
                edit(order[1], order[2])
            except:
                print('格式错误:edit FileName size')
        elif order[0] == 'md':
            try:
                md(order[1])
            except:
                print('格式错误:md FileName')
        elif order[0] == 'delete':
            try:
                delete(order[1])
            except:
                print('格式错误:delete FileName')
        elif order[0] == 'rd':
            try:
                rd(order[1])
            except:
                print('格式错误:rd DirectoryName')
        elif order[0] == 'cd':
            try:
                cd(order[1])
            except:
                print('格式错误:cd DirectoryName/cd ..')
        elif order[0] == 'dir':
            dir()
        elif order[0] == 'dirall':
            dirall()
        elif order[0] == 'stordis':
            stordis()
        elif order[0] == 'exit':
            break
        else:
            print('{}不是正确的命令'.format(order[0]))
    print("退出模拟文件系统")

六、测评结果

结果

七、总结评价

通过设计一个“文件系统”,从中我能更深理解文件系统的层次结构和内部实现,并可以熟悉文件系统 create、open、close、read/write 等基本操作,实现文件保护的同时,运用操作系统的所学知识加入自己设计的操作系统,由此实现对文件系统的创新。
有利于熟悉软件开发环境及调试过程,熟悉所学语言中的数据类型、数据结构、语句结构、语法结构、编程思想,熟悉面向对象程序设计范型的功能抽象与数据抽象,感受编程之美;有利于掌握面向对象程序设计、面向过程编程的基本思想与基本方法,熟练实际问题转化为计算机问题的思想方法,掌握理论结合实践的多元化编程思想,掌握理论应用于实践,提高学研成果转化的能力;有利于巩固和加深对操作系统理论课程中知识的理解,提高对所学知识的综合运用能力;有利于培养个人查阅参考资料、手册的自学能力,通过独立思考深入研究问题,学会自己分析、解决问题。
完整课程设计报告见以下链接:
模拟文件系统课程设计报告

八、参考文献

[1]周涛著.面向交易过程的电子商务信任研究[M].北京:人民邮电出版社.2011.
[2]王敏著.信息安全工程实践[M].西安:西安电子科技大学出版社.2017.
[3]王瑞锦主编;李冬芬,朱国斌,张凤荔编著.信息安全工程与实践[M].北京:人民邮电出版社.2017.
[4]谢小权等编著.大型信息系统信息安全工程与实践[M].北京:国防工业出版社.2015.
[5]匡松等编著.操作系统[M].北京:北京工业大学出版社.2006.
[6]汤小丹等编著.计算机操作系统(第四版)[M].西安:西安电子科技大学出版社.2017.

有问题欢迎各位大佬指出,欢迎关注,一起学习

  • 15
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
1. 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 2. 编写管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: (1) 盘块大小1k (2) 空闲盘块的管理:Linux位图法 (3) 结构:超级块, i结点区, 根目录区 3. 该simdisk管理程序的功能要求如下: (1) info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) newfile …: 建立文件。 (7) cat …: 打开文件。 (8) copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统模拟Linux文件系统间的文件拷贝,host文件系统文件命名为<host>…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy <host>D:\data\sample\test.txt /test/data 或者:simdisk copy <host>D:sample\test.txt /test/data (9) del …: 删除文件:删除指定文件,不存在时给出出错信息。 (10) check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
模拟Linux文件系统。在任一OS下,建立一个文件,把它假象成一张盘,在其中实现一个简单模拟Linux文件系统 在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。 2. 编写管理程序对此空间进行管理,以模拟Linux文件系统,具体要求如下: (1) 要求盘块大小1k 正规文件 (2) i 结点文件类型 目录文件 (共1byte) 块设备 管道文件 物理地址(索引表) 共有13个表项,每表项2byte 文件长度 4byte 。联结计数 1byte (3)0号块 超级块 栈长度50 空闲盘块的管理:成组链接 ( UNIX) 位示图法 (Linux) (4)每建一个目录,分配4个物理块 文件名 14byte (5)目录项信息 i 结点号 2byte (6)结构: 0#: 超级块 1#-20#号为 i 结点区 20#-30#号为根目录区 3. 该管理程序的功能要求如下: (1) 能够显示整个系统信息,源文件可以进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) 建立文件(需给出文件名,文件长度)。 (7) 打开文件(显示文件所占的盘块)。 (8) 删除文件:删除指定文件,不存在时给出出错信息。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S1XmKl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值