模拟简单二级文件管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计
模拟简单二级文件管理系统
*名:***
学号:
系别:计算机学院
专业:网络工程
年级:16级
指导教师:
2019年05 月11 日
一、课程设计项目介绍(含项目介绍及设计目的)
1、设计目的:
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
2、项目介绍:
为LINUX 设计一个简单的二级文件系统。本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。
二、总体设计(含系统的总体结构、原理框图或各模块介绍等)
1、系统总体结构图:
2、模块介绍
(1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。
(2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。
(3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。接着设置磁盘i节点缓冲区,DIEMPTY表示空闲,设计成第1盘块存储用户名表,第2盘块用于存储根目录,第3盘块用于根目录下的子目录。
(4)、空闲盘块分配、回收函数:首先排除磁盘已满,无空闲盘块,或者已经是栈底的情况,接着设置栈指针下移一位,则空闲盘块少1。如果是空闲盘块堆栈已满状态,则把空闲盘块数据写入缓冲区,栈指针指向栈底,缓冲区内容写入新回收的盘块。最后是回收盘块,回收完毕后空闲盘块多1。
(5)、节点分配和释放函数:若没有空闲磁盘i节点,则显示相应提示信息;若空闲磁盘i节点栈空,则分为空闲磁盘i节点数可装满空闲i节点栈和剩下的空闲磁盘i节点不能装满栈区两种情况来考虑。接着初始化磁盘i节点、分配内存i节点,并从磁盘i节点读取数据到内存i节点。
三、详细设计(数据结构、流程图、关键代码段及注释等)
1、主函数流程图:
2、数据块的分配流程图:
3、浏览目录流程图:
4、创建目录流程图:
5、关键代码段及注释
1、主函数:
struct hinode hinode[NHINO]; //查找内存i节点的hash表struct filsys filsys; // 超级块数据结构
struct user user[USERNUM]; //用户打开表数据结构
struct file sys_ofile[SYSOPENFILE]; //系统打开表数据结构
struct direct cur_direct[NOFILE]; //目录数据结构路径
unsigned short cur_dir_id; //当前目录指针
char cur_path_name[DIRSIZ];
FILE *fd; //本系统的所有文件指针
2、命令解释层函数:
char input_buf[20]; //命令行输入缓冲区
static char str[20];
int over; //命令行结束标记
int fd1;
int i,j;
// 命令解释层函数
int cmdexp()
{
over = 0;
printf("[%s@localhost%s]$ ", user[user_id].u_name, cur_path_name);
getcmd();
//显示当前目录
if(( strcmp( input_buf, "dir" ) == 0 ) || ( strcmp( input_buf, "l" ) == 0 ) || ( strcmp( input_buf, "ls" ) == 0 )) {
_dir();
clearbuf();
return 0;
}
if( strcmp( input_buf, "cd" ) == 0 )
{
getcmd(); //取得命令
chdir ( input_buf ); //改变当前目录用函数
clearbuf();
return 0;
}
// 创建目录(建立子目录)
if(( strcmp( input_buf, "mkdir" ) == 0 ) ||( strcmp( input_buf, "md" ) == 0 )) {
if( over )
{
printf( "请在mkdir后输入要创建的目录名\n" );
clearbuf();
return 0;
}
getcmd();
if( input_buf[0] == '\0' )
{
printf( "请在mkdir后输入要创建的目录名\n" );
clearbuf();
return 0;
}
mkdir( input_buf );
while(!over)
{
getcmd();
if( input_buf[0] != '\0' )
mkdir( input_buf );
}