模拟macOS系统的文件管理,主要包含两个界面GUI,一个类似Finder的图形操作界面,方便熟悉Windows系统的用户使用本系统;CLI,一个类似Terminal的命令行操作界面,方便熟悉命令行,习惯unix系统的用户使用本系统。
- 刘元兴(组长)
- 系统基本框架
- CLI命令行界面实现
- 所有命令的在CLI界面中发射的信号函数
- 所有命令的在主界面中接收的槽函数
- 所有命令的CLI界面与主界面信号槽连接
- GUI图形界面实现
- 右键新建文件/文件夹
- 新建按钮
- 重命名按钮
- 删除按钮
- 动态添加控件显示文件/文件夹
- 前进/后退
- 点击文件夹进入文件夹
- 点击文件编辑文件
- 显示当前路径
- 文件管理
- 新建文件
- 修改文件
- 删除文件
- 文件重命名
- 显示文件内容
- 周浩(核心成员)
- 目录管理
- 新建目录
- 进入目录
- 删除目录
- 目录重命名
- 显示当前目录路径
- 显示当前目录文件夹及文件
- 用户管理
- 新建用户
- 用户登录login
- 用户权限控制
- 成组链接法
- iNode表界面设计实现
- iNI表格数据显示
- i节点数据显示
- MFD数据显示
- SFD数据显示
- 目录管理
- 李志博
- 系统写回机制
- GUI界面设计
- CLI界面高亮
- CLI输入命令提取判断
- vim编辑框设计实现
- 宋寅瑜
- 系统初始化
- 系统格式化format()
- 系统装载load()
- 管理员格式化sudoFormat()
- CLI界面设计
- 基本界面设计
- 窗口多开
- 窗口关闭
- 窗口切换
- help命令
- 系统初始化
-
基本功能 (模拟UNIX(或LINUX,或FAT)系统的文件管理功能)
- 多用户[Loke]
- 多级目录[Loke]
- 具有login
- 系统初始化
- 文件的创建
- 文件的打开
- 文件的读
- 文件的写
- 文件关闭
- 删除文件
- 创建目录
- 改变目录
- 列出文件目录
- 退出
- 格式化
-
扩展功能
- 显示存储情况
- 显示成组链接法工作原理
- 显示各块存储内容
- 图形界面
- 前进
- 后退
- 图标显示
- 详细信息显示
- 创建、删除、修改文件
- 显示当前目录、当前文件夹
- 快速链接
- 文本编辑器
- 命令行界面
- 操作窗口多开
- 操作窗口切换
- 多用户同时在线操作
- 显示存储情况
st=>start: 开始
e=>end: 结束
op=>operation: 选择界面
select=>condition: 图形界面?
g=>operation: 输入用户名密码登录
check=>condition: 用户名密码是否正确
login=>operation: 在命令行根据
提示进行login
check2=>condition: 判断login是否成功
并提示
o=>operation: 用户进行操作
o2=>operation: 输入命令
get=>operation: 通过槽函数和信号函数
对操作类型进行划分
send=>operation: 将参数和操作动作发送给主窗口
send2=>operation: 将参数和操作动作发送给主窗口
split=>operation: 提取命令中操作命令和目标文件夹
receive=>operation: 主窗口接受参数执行对应命令
receive2=>operation: 主窗口接受参数执行对应命令
rt=>operation: 返回执行命令结果
dis=>operation: 图形界面接收参数显示结果
rt2=>operation: 返回执行命令结果
dis2=>operation: 命令行界面接收参数显示结果
close=>condition: 没有关闭窗口
logout=>condition: 用户没有输入
logout命令
ex=>condition: 用户没有输入
exit命令
st->op->select
select(yes)->g
select(no)->login
login->check2
g->check
check(yes)->o
check(no)->g
check2(no)->login
check2(yes)->o2
get->send
o2->logout
logout(yes)->ex
logout(no)->login
ex(yes)->split->send2
ex(no)->e
send2->receive2
send->receive
receive->rt->dis->o
receive2->rt2->dis2->o2
o->close(yes)->get->send
close(no)->e
struct iNode {//i节点
int id;//节点号
int fileCount;//引用计数,表示有几个目录引用这个文件
int size;
//文件的大小,如果这是一个文件 这里表示文件所占的物理块个数,
//如果是一个目录,表示该目录下已经有的文件个数,用于判断是不是超过10个了
int fileMode;//文件类型,区分该i节点是文件(2)还是目录(1)还是用户, 1 means file, 0 means dir
int userId; //使用者ID
int userRight[DIRECTORYITEMNUM];//使用者权限
tTime time;
int diskAddress[DISKADDRESSNUM];
//如果这个i结点是一个文件,Addr数组表示文件各个物理块位置编号
//如果是一个目录,表示目录的各个文件or文件夹的SFD的下标,所以一个目录下最大有NADDR个文件/目录
//如果是NADDR,那么Inode[0]存放的是用户,addr存放的是NADDR个用户的主文件夹的i结点的下标???????
};
文件系统由每块1024字节的若干磁盘块组成。磁盘块由文件目录、磁盘i节点和超级块管理。采用成组链接法分配和回收block块。
该模块实现的功能有系统初始化和载入。系统初始化是指将已定义好的磁盘结构写入磁盘,包括用户信息、初始用户目录、超级块信息以及磁盘i位图和block块位图初始状态。系统安装是指将上次保存的文件系统重新读取出来。
该模块主要的数据结构包括磁盘块结构、i结点结构、超级块结构和目录项结构。
/*磁盘块结构*/
struct block//一个块占1KB
{
int n; //存放空闲盘快的个数
int free[50]; //存放空闲盘快的地址
int a; //盘快是否被占用标志
char content[1000];//快上每个字节存放的符号
}memory[20449];
/*超级块结构*/
struct block_super
{
int n; //空闲的盘快的个数
int free[50]; //存放进入栈中的空闲块
}super_block;
/*i结点结构*/
struct node //i结点信息
{
int file_style; //i结点 文件类型
int file_length; //i结点 文件长度
int file_address[100]; //文件占用的物理块号。
int limit;//打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开
int file_UserId;
} i_node[640];
/*目录项结构*/
struct dir //目录项信息
{
char file_name[10]; //文件名
int i_num; //文件的结点号
char dir_name[10]; //目录名或者说文件所在目录
}root[640];
该模块包括用户登录和注销。用户通过正确的用户名和密码,即可登录系统。用户可以创建文件或目录,但是只能管理自己创建的文件或目录。
本系统中用户信息包括用户id、用户名、密码。具体定义如下所示。
string UserName[8] = {"user0", "user1", "user2", "user3", "user4", "user5","user6", "user7"};
string PassWord[8] = {"12345","12345","12345","12345","12345","12345","12345","12345"};
UserName数组下标即用户ID。
该模块包括i节点和block块的分配。本系统采用成组链接法对block块进行分配和回收。
该模块的主要数据结构用到磁盘块结构和超级快结构。
/*磁盘块结构*/
struct block//一个块占1KB
{
int n; //存放空闲盘快的个数
int free[50]; //存放空闲盘快的地址
int a; //盘快是否被占用标志
char content[1000];//快上每个字节存放的符号
}memory[20449];
/*
* superBlock
* size: 1024B
*/
struct superBlock {
int id;
int iNodeTotalNum;
int iNodeFreeNum;
//0-32
int dataBlockTotalNum;
int dataBlockFreeNum;
int iNodeFreeStack[INODEFREESTACKNUM];
int dataBlockFreeStack[DATABLOCKFREESTACKNUM];
//int superBlockFlag;
};
该模块采用成组链接法管理block块。将空闲块分成若干组,每50个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一个组的第二个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。将第一组放入超级快中。 分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的50块分完了,才进入第二组。 释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。
该模块包括文件的创建、文件的打开与关闭、文件的读、文件的写、文件的删除等功能。用户可以创建不重名的文件,如果发现重名文件,则系统不允许创建。文件的读命令将文件内容显示在屏幕上。文件的写命令能添加文件内容。文件的删除命令将文件删除。
该模块主要的数据结构包括磁盘块结构、i结点结构、超级块结构和目录项结构。
/*磁盘块结构*/
struct block//一个块占1KB
{
int n; //存放空闲盘快的个数
int free[50]; //存放空闲盘快的地址
int a; //盘快是否被占用标志
char content[1000];//快上每个字节存放的符号
}memory[20449];
/*超级块结构*/
struct block_super
{
int n; //空闲的盘快的个数
int free[50]; //存放进入栈中的空闲块
}super_block;
/*i结点结构*/
struct node //i结点信息
{
int file_style; //i结点 文件类型
int file_length; //i结点 文件长度
int file_address[100]; //文件占用的物理块号。
int limit;//打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开
int file_UserId;
} i_node[640];
/*目录项结构*/
struct dir //目录项信息
{
char file_name[10]; //文件名
int i_num; //文件的结点号
char dir_name[10]; //目录名或者说文件所在目录
}root[640];
该模块包括列出目录下文件、创建目录、打开目录、删除目录等功能。用户可以创建不重名的目录,如果发现重名目录,则系统不允许创建。列出文件目录命令将当前所在目录下的所有子目录及文件。打开目录命令能切换当前目录。删除目录时首先会判断所要删除的目录下是否有文件,如果有,则不允许删除,否则可将目录删除。
/*目录项结构*/
struct dir //目录项信息
{
char file_name[10]; //文件名
int i_num; //文件的结点号
char dir_name[10]; //目录名或者说文件所在目录
}root[640];
/*i结点结构*/
struct node //i结点信息
{
int file_style; //i结点 文件类型
int file_length; //i结点 文件长度
int file_address[100]; //文件占用的物理块号。
int limit;//打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开
int file_UserId;
} i_node[640];
I节点中的文件类型为0时代表该文件是目录文件,可以进行相关目录操作。