Skip to content

SakuraSong001/BVFS

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 

Repository files navigation

BVFS

模拟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

i节点表结构

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时代表该文件是目录文件可以进行相关目录操作

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 93.8%
  • Makefile 6.1%
  • Other 0.1%