- 学习操作系统文件管理机制的相关知识
- 设计一个简单多用户文件系统
- 要求系统具有分级文件目录、文件分权限操作、用户管理等
- 模拟文件管理的工作过程,加深理解文件系统的内部功能及内部实现机制
- 对所采用的算法、程序结构和主要函数过程以及关键变量进行详细的说明
- 提供关键程序的清单、源程序及可执行文件和相关的软件说明
- 对程序的调试过程所遇到的问题进行回顾和分析,对测试和运行结果进行分析
- 总结软件设计和实习的经验和体会,进一步改进的设想
所有实体均封装成类,使用时将类实例化即可。由于类中包含的属性和方法较多,因此本模块的数据结构仅展示类的声明及符合google风格的python标准注释规范的类头部注释,相关属性介绍和接口介绍都在注释中给出。类的继承在类声明中给出,继承的属性若无变化则在子类中不再重复解释其功能,所有方法与属性均为公有属性。
① 用户User:
class User():
用户类,包含用户名和用户权限
@attribute name: 用户名
@attribute authority: 用户权限,只能是r、w和x三者的组合
权限r: 可读权限,默认每个用户都有,可以读取文件目录
权限w: 可写权限,可以读、增、删、改文件,不可执行文件
权限x: 可执行权限,除拥有上述权限外还可执行文件
② 文件控制块FCB:
class FCB():
文件控制块,存储文件/文件夹的相关信息
@attribute user: 当前操作用户,User对象
@attribute parent: 父级目录对象,根节点无父级目录,Folder对象
@attribute name: 当前文件/文件夹对象的名称,字符串
@attribute author: 当前文件/文件夹对象的拥有者,字符串
@attribute date: 当前文件/文件夹对象的最后修改时间,字符串
@attribute path: 从根节点至当前文件/文件夹对象的路径,字符串
@method get_config: 获取当前路径下的配置文件config.txt
@method update_config: 更新当前路径下的配置文件config.txt
@method rename: 重命名当前对象的name
@method back: 获取父目录的文件列表
③ 文件夹Folder(继承FCB):
class Folder(FCB):
文件夹实例,继承FCB,附加部分特性
@attribute children: 存放文件夹下的文件,列表
@attribute _type: 文件类型为“文件夹”,字符串
@method get_children: 获取当前文件夹下的所有子文件
④ 文件File(继承FCB):
class File(FCB):
文件实例,继承FCB,附加部分特性
@attribute _type: 文件类型,由文件后缀决定,字符串
@attribute size: 文件大小,单位为b,整型
⑤ 根节点Root(继承Folder):
class Root(Folder):
根节点,继承Folder,附加部分特性
@method load: 初始化装载,完成对root节点的children的初始化
⑥ 控制程序OSManager:
class OSManager():
控制程序
@attribute user: 正在操作的用户,User实例
@attribute main_board: 当前显示目录的节点列表,列表
@attribute here: 当前节点位置,为Root/Folder/File实例对象
@method ls: 展示当前目录下属于当前用户的所有文件
@method cd_in: 进入下一级 或 运行目标程序
@method cd_back: 返回上一级
@method rename: 重命名,若用户有w权限则调用文件/文件夹本身的方法
@method mkdir_or_touch: 创建文件夹/文件,若用户有w权限则调用系统api创建
@method delete: 删除文件/文件夹,若用户有w权限则调用系统api删除
窗体中的控件也为类的成员变量,但在此省略,仅展示相关控件调用的功能函数。
① 文件管理系统的主窗体MainWindow:
class MainWindow():
文件管理系统的主窗体(GUI),
显示当前用户、当前文件路径、当前路径下的文件及文件详细信息,
提供双击鼠标左键打开文件夹或运行程序、单击鼠标右键重命名文件功能,
提供可以新建或删除文件或文件夹的按钮,实现在模拟文件系统中的增删改查,
实现针对不同用户不同权限的可视化操作。
本类的所有方法均调用后端OSManager的方法
@method get_win: 获取当前窗体实例
@method ls: 展示当前目录下属于当前用户的所有文件
@method cd_in: 双击鼠标左键 - 进入下一级 或 运行目标程序
@method ca_back: 点击返回按钮 - 返回上一级
@method refresh: 刷新当前文件列表
@method mkdir: 新建文件夹,默认文件名为当前系统时间
@method touch: 创建新文件,默认创建文本文件,文件名为当前系统时间
@method f_delete: 删除文件,向后端传入选中的对象,
然后根据后端返回的状态码判断操作完成与否并输出
@method rename: 单击鼠标右键,重命名文件或文件夹
@method show: 绑定表格上的事件,运行窗口
② 文件管理系统的登录窗口LoginWindow:
class LoginWindow():
文件管理系统的登录窗口(GUI),生成窗体,在输入框内输入用户名和密码,
若用户名和密码匹配成功则销毁当前窗体,进入主界面(即生成MainWindow)
@method show: 运行窗体
@method login: 登录,若用户名和密码匹配成功则进入主界面
管理员操作封装Admin:
class Admin():
管理员操作,包括登录和对用户信息的增删改查
@attribute user_info: 存储用户信息,字典,format: {用户名:[密码,权限]}
@method login: 登录验证,返回登录成功与否的结果
@method update_user_info_file: 更新用户数据文件user_info.txt
@method new_user: 创建一个新用户
@method del_user: 删除一个已有用户
@method edit_user: 修改一个现有用户的密码和权限,不可重命名
@method view: 查看现有用户的详细信息
可通过当前节点的parent属性获取父节点对象,然后拼接父节点的路径path、名字name来获取获取父节点的实际路径parent_path,在该路径下调用系统api,即os.walk来获取文件/文件夹的目录,再将parent_path和“/config.txt”拼接获取父目录的config.txt文件,读取该文件可以获得父目录层级中的文件的拥有者。
由于本系统中规定,在同一级目录下(树的同一层下),无论是文件还是文件夹,都不能同名。因此,可以通过在前端点击文件目录表项获取的文件名target_name,以此在当前节点(必为Folder)的children列表中寻找与target_name同名的文件。
若该文件为Folder类型,则将控制程序OSManager的当前节点here更新为子节点,当前目录节点列表main_board更新为子节点的列表,即当前节点的children列表。
若该文件为File类型,则调用系统的start命令执行之。
在起始时,目录树只有根节点和与根节点直接相连的第一层节点。理论上目录树在用户登录成功后至退出程序时应该始终存在,每个节点都是一个Root、Folder或File对象,但事实上对象中存储的信息会在当前目录发生变化的时候变化,因此实际存在的只有当前节点、其父节点和其子节点。无论是用户双击某一文件夹时,在该文件夹节点下回生成其子节点,还是用户点击返回按钮返回上一级目录,会找到当前节点的父节点,目录树会完成一次更新。
与Windows和Linux系统相比,本模拟系统中存在一些值得注意的异同,如下:
- 重命名文件时需在GUI上选择目标文件,然后单机鼠标右键,弹出输入框,重新键入文件名后,单击输入框右侧的“OK”按钮,提交修改。
- 一切皆文件,故同级目录下的文件与文件夹不可同名。
- 新建文件或文件夹时,默认名称为当前系统时间,格式为“年-月-日-时-分-秒”,若为文件,则默认新建的文件类型为txt。
- 用户权限在用户被创建时就应该被指定,权限只能为“r”、“w”和“x”三者的组合,且至少包含“r”。其中,“r”为可读权限,“w”为可修改(包括增、删和改)权限,“x”为允许执行可执行文件的权限。
- 资源配置文件config.txt不允许在本系统内被包括root在内的任何人修改、删除或查看,以防造成目录树节点的配置信息混乱。