操作系统课程设计 模拟文件管理系统

一、课程设计目的

        理解操作系统文件系统的某些工作原理,学习文件操作命令的设计方法。通过实验,加深对操作系统文件系统某些问题的理解,归纳学习方法和思考方法,做到理论联系实际。养成分析问题、解决问题的能力,提高软件设计能力和逻辑思维能力。

二、课程设计要求

2.1 实验题目

模拟文件管理系统的设计

        设计实现一个简单的模拟文件管理系统,包括目录文件、普通文件,以及一些文件操作命令和目录操作命令(例如可以模仿DOS的有关命令)。具体要求如下列2.2和2.3。

2.2 初始目录结构

程序初始化时构造如下图所示的目录结构:

图中auto是(普通)文件(初始化时假设是空文件),其余都是子目录(目录文件)。

2.3 系统统操作命令简介

在模拟文件管理系统中,要求可以实现如下操作:

  1. 改变当前目录:cd [<目录名>]。当前目录(工作目录)转移到指定目录下。指定目录不存在时,给出错误信息。若命令中无目录名,则显示当前目录路径。
  2. 新建文件:edit <文件名> 。创建一个指定名字的新文件,即在目录中增加一目录项,不考虑文件的内容。对于重名文件给出错误信息。
  3. 删除文件:delfile <文件名>。删除指定的文件,即清除其目录项和回收其所占用磁盘空间。对于只读文件,删除前应询问用户,得到同意后方能删除。当指定文件正在使用时,显示“文件正在使用,不能删除”的信息,当指定文件不存在时给出错误信息。
  4. 显示目录:dir[ <目录名>[ <属性>]]。显示“目录名”指定的目录中文件名和第一级子目录名。若指定目录不存在,则给出错误信息。
  5. 创建目录:md <目录名>。在指定路径下创建指定目录,若没有指定路径,则在当前目录下创建指定目录。对于重名目录给出错误信息。
  6. 删除目录:rd <目录名>。若指定目录为空,则删除之,否则,给出“非空目录不能删除”的提示。不能删除当前目录。
  7. 文件改名:rename <原文件名> <新文件名>。将指定文件的名字改为“新文件名”。若原文件不存在,给出错误信息。若原文件存在,但正在使用,也不能改名,同样显示出错信息。应检查新文件名是否符合命名规则以及是否存在重名问题。

三、设计方案

本系统提供的参考程序在Python环境中开发,下面介绍课程设计设计方案。

3.1 系统分析

        模拟文件系统是指用软件实现对真实文件系统的模拟,它可以帮助开发人员了解文件系统的工作原理,并进行相关算法和结构的研究与验证。

        模拟文件系统通常由多个部分组成,分别完成不同的功能。具体来说,模拟文件系统可以分为以下几个部分:

  1. 文件管理:负责维护文件的属性信息,包括文件名、大小、创建时间等。
  2. 目录管理:负责维护文件目录的结构,包括文件的位置、父目录、子目录等。
  3. 存储管理:负责维护文件的实际存储,包括存储设备的选择、磁盘管理、缓存等。
  4. 访问控制:负责维护文件的访问权限,包括用户身份验证、权限管理、安全控制等。

        各个部分之间相互协调配合,共同完成文件系统的功能。例如,文件管理模块需要与目录管理模块进行交互,以确定文件的位置和结构。存储管理模块需要与文件管理模块进行交互,以确定文件的存储位置和大小。访问控制模块需要与其它模块进行交互,以确定用户的权限并控制文件的访问。

        但本次课程设计我们主要模拟的是一个简单的文件系统,在此文件管理系统,可实现的操作有:

改变目录:格式: cd <目录名>            

删除文件:格式: delfile <文件名>

显示目录:格式: dir <目录名>           

退出文件系统: exit

创建目录:格式 md <目录名>             

重命名文件:格式:rename<文件名>

删除目录:格式: rd <目录名>            

新建文件:格式; edit <文件名>

        首先,我们需要定义一个节点类,来表示一个目录或文件。它的实现方式是通过一个树结构来存储文件系统,每个节点都是一个 FileNode 对象,表示一个文件或目录。每个 FileNode 对象都有一个 name,表示文件名或目录名;一个 file_type,表示文件类型;以及一个 children,表示子文件或子目录。通过这种方式,可以模拟出一个文件管理系统。

# 定义一个根节点,树的根节点
class FileNode:
def __init__(self, name, file_type=None, children=None):
self.name = name
self.file_type = file_type
self.children = children

        接下来,我们可以定义一个文件管理类,用来实现文件管理系统的基本操作。其中包含了新建文件夹、更改目录、新建文件、删除文件夹和文件、显示当前目录内容等方法。文件管理系统类中的 cur_node 变量表示当前所在目录,其它方法通过对这个变量的操作来实现不同的文件管理操作。例如,调用 cd 方法可以更改当前目录,调用 dir 方法可以显示当前目录下的内容。

# 定义一个文件管理系统类
class FileManagerSystem:
def __init__(self):
# 定义一个根节点
self.cur_node = FileNode('C:\\', 'directory')

        在类的构造函数中,定义了根节点,其名称为 C:\,类型为文件夹,不包含任何子文件。这个根节点存储在类的 cur_node 属性中,并被其它方法使用,用于表每个文件管理操作方法都操作这个 cur_node 属性来实现对文件系统的操作。文件管理操作方法还会在必要时创建文件节点,例如,调用 md 方法时,会在当前目录下创建一个新的文件夹,并将文件夹的节点加入到当前目录的 children 属性中。

1. cd令令介绍

命令形式:cd [<目录名>]。命令功能:改变当前目录,即把指定目录变为当前目录(工作目录)。

        该方法会将对象的 cur_node 属性更改为指定 dir_name 的子节点。该方法首先检查 cur_node 是否有子节点,如果没有,它会打印一条消息,指出当前目录下没有子目录。如果 cur_node 有子节点,并且其中一个子节点的名称为指定的 dir_name,该方法会将 cur_node 属性设置为该子节点,并打印一条消息,指出当前目录已更改为指定的目录。如果 dir_name 未在 cur_node 的子节点中找到,该方法会打印一条错误消息。

2. del命令介绍

命令形式:dir <目录名>。命令功能:该方法将 adir_name作为其参数,它指定该方法应打印其内容的目录的名称。如果dir_name是None,该方法将打印当前目录的内容。否则,它将打印指定目录的内容。

        该方法首先检查是否dir_name是None。如果是,它检查当前目录是否有任何子目录(即子目录或文件)。如果没有,则打印一条消息,指示当前目录中没有子目录并返回。否则,它会打印当前目录的所有子目录的名称和文件类型。

        如果dir_name不是None,则该方法检查当前目录是否有任何子目录以及指定目录是否存在于当前目录中。如果不满足这些条件中的任何一个,该方法将打印一条错误消息并返回。否则,它会打印指定目录的所有子目录的名称和文件类型。

3. md命令介绍

命令形式:md <目录名>。命令功能: 该方法首先检查当前目录是否有子目录。

        如果没有,则会为当前目录创建一个空的字典,用于存储子目录。然后,它会在当前目录的字典中添加一个名为dir_name的项,并将其值设为一个新的FileNode对象,表示一个目录。最后,它会打印一条消息,指示目录已被创建。

        如果当前目录已经有子目录,则该方法会执行上述操作,在当前目录的字典中添加一个新的项,表示新的子目录。

4. rd命令介绍

命令形式:rd <目录名>。命令功能:删除子目录。

        该方法首先检查当前目录是否有子目录,并检查指定的目录是否存在于当前目录中。如果任何一个条件不满足,则会打印一条错误消息,并返回。

        如果指定的目录存在于当前目录中,该方法会检查该目录是否有子目录或文件。如果存在,则会打印一条消息,指示该目录中有子文件,无法删除。否则,它会从当前目录的字典中删除指定的目录,并打印一条消息,指示目录已被删除。

5. edit命令介绍

命令形式:edit <文件名>。命令功能:用于创建一个名为file_name的文件。

        该方法首先检查当前目录是否有子目录。如果没有,则会为当前目录创建一个空的字典,用于存储子目录。然后,它会在当前目录的字典中添加一个名为file_name的项,并将其值设为一个新的FileNode对象,表示一个文件。最后,它会打印一条消息,指示文件已被创建。

        如果当前目录已经有子目录,则该方法会执行上述操作,在当前目录的字典中添加一个新的项,表示新的文件。

6. delfile命令介绍

命令形式:delfile <文件名>。命令功能:用于删除一个名为file_name的文件。

        该方法首先检查当前目录是否有子目录,并检查指定的文件是否存在于当前目录中。如果任何一个条件不满足,则会打印一条错误消息,并返回。

        如果指定的文件存在于当前目录中,该方法会从当前目录的字典中删除指定的文件,并打印一条消息,指示文件已被删除。

7. rename命令介绍

命令形式:rename <原文件名> <新文件名>。功能:用于重命名一个名为file_name的文件。

        该方法首先检查当前目录是否有子目录,并检查指定的文件是否存在于当前目录中。如果任何一个条件不满足,则会打印一条错误消息,并返回。

        如果指定的文件存在于当前目录中,该方法会在当前目录的字典中添加一个新的项,其键为new_name,值为该文件的FileNode对象。然后,它会从当前目录的字典中删除指定文件的原来的项,并打印一条消息,指示文件已被重命名。

设计概念图如下:

        主函数,用于控制程序的执行。它会一直循环执行,直到用户输入exit命令为止。在每次循环中,它会提示用户输入操作,并将输入的命令分解为一个列表。然后,它会检查列表的第一个元素,以确定用户输入了哪种操作。根据用户输入的操作类型,它会调用相应的方法,并将操作参数作为参数传入。如果用户输入的操作名称为cd,则它会调用FileManagerSystem的cd方法,并将输入的目录名作为参数传入……

        主函数控制了程序的执行流程,并通过调用FileManagerSystem类中的方法来完成相应的文件系统操作。

3.2 系统代码实现

# 定义一个根节点,树的根节点
class FileNode:
def __init__(self, name, file_type=None, children=None):
self.name = name
self.file_type = file_type
self.children = children
# 定义一个文件管理系统类
class FileManagerSystem:
def __init__(self):
# 定义一个根节点
self.cur_node = FileNode('C:\\', 'directory')
# 改变目录
def cd(self, dir_name):
if self.cur_node.children is None:
print('当前目录下没有子目录')
return
if dir_name in self.cur_node.children:
self.cur_node = self.cur_node.children[dir_name]
print('已进入{}'.format(self.cur_node.name))
else:
print('路径错误')
# 显示当前目录
def dir(self, dir_name):
if dir_name is None:
if self.cur_node.children is None:
print('当前目录下没有子目录')
return
print('{:<15}{:<15}'.format('文件名', '文件类型'))
for name, node in self.cur_node.children.items():
print('{:<15}{:<15}'.format(name, node.file_type))
else:
if self.cur_node.children is None or dir_name not in self.cur_node.children:
print('路径错误')
else:
node = self.cur_node.children[dir_name]
if node.children is None:
print('当前目录下没有子目录')
return
print('{:<15}{:<15}'.format('文件名', '文件类型'))
for name, node in node.children.items():
print('{:<15}{:<15}'.format(name, node.file_type))
# 创建目录
def md(self, dir_name):
if self.cur_node.children is None:
self.cur_node.children = {}
self.cur_node.children[dir_name] = FileNode(self.cur_node.name + dir_name + '\\', 'directory')
print('已创建{}目录'.format(dir_name))
# 删除目录
def rd(self, dir_name):
if self.cur_node.children is None or dir_name not in self.cur_node.children:
print('路径错误')
elif self.cur_node.children[dir_name].children is not None:
print('当前目录下有子文件,不能删除')
else:
self.cur_node.children.pop(dir_name)
print('已删除{}目录'.format(dir_name))
# 新建文件
def edit(self, file_name):
if self.cur_node.children is None:
self.cur_node.children = {}
self.cur_node.children[file_name] = FileNode(self.cur_node.name + file_name, 'file')
print('已新建{}文件'.format(file_name))
# 删除文件
def delfile(self, file_name):
if self.cur_node.children is None or file_name not in self.cur_node.children:
print('路径错误')
else:
self.cur_node.children.pop(file_name)
print('已删除{}文件'.format(file_name))
# 重命名文件
def rename(self, file_name, new_name):
if self.cur_node.children is None or file_name not in self.cur_node.children:
print('路径错误')
else:
self.cur_node.children[new_name] = self.cur_node.children[file_name]
self.cur_node.children.pop(file_name)
print('已将文件{}改名为{}'.format(file_name, new_name))
# 退出文件系统
def exit(self):
print('退出文件管理系统')
# 测试
if __name__ == '__main__':
fms = FileManagerSystem()
while(True):
user_input = input('请输入操作: ')
user_input = user_input.strip().split()
operator = user_input[0]
if operator == 'cd':
fms.cd(user_input[1])
elif operator == 'dir':
dir_name = None
if len(user_input) == 2:
dir_name = user_input[1]
fms.dir(dir_name)
elif operator == 'md':
fms.md(user_input[1])
elif operator == 'rd':
fms.rd(user_input[1])
elif operator == 'edit':
fms.edit(user_input[1])
elif operator == 'delfile':
fms.delfile(user_input[1])
elif operator == 'rename':
fms.rename(user_input[1], user_input[2])
elif operator == 'exit':
fms.exit()
break
else:
print('操作不存在')

3.3 系统测试结果

      

    

四、课程设计总结与体会

代码分析:

        上述代码我首先定义了一个 FileNode 类,用于表示文件系统中的文件或目录。该类有三个属性:

  1. name:表示文件或目录的名称。
  2. file_type:表示文件或目录的类型,可以是 "file" 或 "directory"。
  3. children:表示文件或目录的子节点,如果是目录,则包含该目录中的文件和目录。

        接着,定义了一个 FileManagerSystem 类,用于模拟文件管理器的基本功能。该类有以下几个方法:

  1. __init__ 方法:初始化类的实例,并定义一个根节点,表示整个文件系统的根目  录。
  2. cd 方法:改变当前工作目录。
  3. dir 方法:显示当前工作目录下的文件和目录。
  4. md 方法:创建一个新的目录。
  5. rd 方法:删除一个目录。
  6. edit 方法:创建一个新的文件。
  7. del 方法:删除一个文件。

        总的来说,上述代码成功实现了一个简单的文件管理系统,用于模拟文件管理器的基本功能。但由于时间有限,仅能模拟文件管理器的基本功能,并没有实现更多的高级功能,但我今后会继续学习,争取做出完善的文件管理系统。

总结体会:

        模拟简单文件管理系统的课程设计是一个非常有益的实践项目,它可以帮助我们更好地理解操作系统的基本概念和原理,并培养我们的编码能力和解决问题的能力。

        在完成这个课程设计项目时,我们需要综合运用操作系统知识,包括文件系统、输入输出操作等。我们需要编写代码实现文件管理系统的基本功能。在实现这个项目的过程中,我们还需要了解文件管理系统的基本概念和结构,如文件和目录、目录树、文件名和路径等。我们还需要熟悉文件管理系统的基本操作,如打开、关闭、读取和写入文件,以及检索文件和目录的信息。在实际操作中,我们还要考虑到文件的空间管理、磁盘调度等问题,从而更好地模拟真实的文件管理系统。

        在完成这个项目的过程中,我们可能会遇到一些困难,比如说代码实现的问题、细节处理的问题等等。这些问题可以通过参考相关资料、查阅资料、讨论交流等方式来解决。同时,我们还需要善于总结,及时记录遇到的问题和解决方案,以便于日后查看、学习和借鉴。

        完成这个项目后,我们将能够更好地理解操作系统的基本概念和原理,并能够编写简单的文件管理系统代码。此外,我们还可以从实际的编码实践中获益,提高我们的编码技巧和解决问题的能力。

        总的来说,本次课程设计让我深入地了解到了操作系统的特征,学习到了文件管理系统的运行机制及各种算法以及电脑系统组成等知识,并且能够实际操作,更加深入地理解操作系统的原理,为今后更深入地研究和学习打下坚实的基础。

五、参考资料

[1]南京工业大学编著.操作系统原理实验指导书. 2016.

[2]汤小丹等编著.计算机操作系统(第四版)[M].西安:西安电子科技大学出版社.2017.

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值