操作系统实验报告 文件管理系统源程序文档格式.docx
《操作系统实验报告 文件管理系统源程序文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 文件管理系统源程序文档格式.docx(52页珍藏版)》请在冰点文库上搜索。
![操作系统实验报告 文件管理系统源程序文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/d7501a7c-eef8-40ca-b64b-b4a50c7aa8ff/d7501a7c-eef8-40ca-b64b-b4a50c7aa8ff1.gif)
Del
删除文件或目录。
查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。
提示用户是否删除,确认则删除文件,修改当前文件夹目录和硬盘空间结构,修改超级块,写入模拟硬盘。
Dir
列文件目录(列出文件名、物理地址、保护码和文件长度)
2.实验原理
文件系统管理中用到的数据结构有:
(1)首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如:
file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
3、实验要求
(1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
(2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
(4)文件保护简单使用了三位保护码:
允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
二、实验的目的及意义
课程设计目的使学生熟悉文件管理系统的设计方法;
加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
三、详细设计
3.1功能设计
Help显示命令帮助
dir显示当前目录下的文件和文件夹
logout注销
exit退出系统
create[文件名]创建文本文件
cdir[目录名]创建文件夹
read[文件名]读取一个文件最多可同时读取五个
close[文件名]关闭一个文件
edit[文件名]编辑一个文件
cd[目录名]进子目录或者上级目录
attr[文件名]显示该文件的属性
del[文件名]删除文件
rename[文件名]重命名
3.2结构设计
1)总设计结构图
2)目录结构示意图
3)流程图
编辑功能流程图创建文件流程图
删除文件功能流程图
3.3核心算法
boolFormat(void);
//格式化
boolinstall(void);
//装载虚拟硬盘的数据
voidlogin(void);
/用户登陆
voidshowMenu(void);
//显示功能菜单
boolonAction(void);
//用户选择功能并执行
voidshowDir();
//显示当前文件夹里面文件的信息
voidlogout();
//注销
voidcreateFile(stringstr);
//创建文件
voidcreateDir(stringstr);
//创建文件夹
boolread(stringstr);
//读取文件
voideditFile(stringstr);
//编辑文件
intvisit(stringstr);
//打开一个文件夹
voidattrib(stringstr);
//显示文件属性
voidDelete(stringstr);
//删除一个文件
intrename(stringstr);
//重命名一个文件
3.4数据结构
/*---------常变量------*/
constunsignedintBLOCK_SIZE=512;
//块长
constunsignedintDATA_BLOCK_NUM=512;
//数据块数量
constunsignedintDINODE_START=4*BLOCK_SIZE;
//inode起始位置
constunsignedintDINODE_SIZE=512;
//inode大小
constunsignedintDINODE_NUM=32;
//inode数量
constunsignedintDATASTART=(2+DINODE_NUM)*BLOCK_SIZE;
//数据区的开始地址
constunsignedintACCOUNT_NUM=10;
//用户数量
/*inode结构体*/
structinode{
unsignedshortdi_tag;
/*inode标识*/
unsignedshortdi_number;
/*关联文件数,当为0时表示删除文件,如一个目录至少包含两个文件:
"
."
和"
.."
*/
unsignedshortdi_mode;
/*存取模式:
0为目录,1为文件*/
unsignedshortdi_userID;
/*当前inode所属用户0为根目录ID,一次下去是管理员目录、用户目录*/
unsignedshortdi_access;
/*访问权限0为不允许普通用户访问(公共目录),1为允许普通用户访问*/
unsignedshortdi_size;
/*文件大小,目录没有大小,值为0*/
unsignedshortdi_ctime;
/*创建时间*/
unsignedshortdi_mtime;
/*最后一次修改时间*/
unsignedshortdi_block[DATA_BLOCK_NUM];
/*数据块块地址编号*/
};
/**超级块***/
structsuper_block{
unsignedshorts_inodes_count;
/*文件系统中inode的总数*/
unsignedshorts_blocks_count;
/*数据块总数*/
unsignedshorts_r_blocks_count;
/*保留块总数*/
unsignedshorts_free_blocks_count;
//空闲块总数
unsignedshorts_free_inodes_count;
/*空闲的inode总数*/
unsignedshorts_log_block_size;
/*block的大小*/
/**账户信息**/
structuser{
unsignedshortuser_id;
//用户ID
unsignedshortuser_access;
//权限
stringusername;
//用户名
stringpassword;
//密码
/**文件/目录结构**/
structdirectory{
stringname;
/*目录名*/
unsignedshortd_ino;
/*目录号*/
四、调试分析
4.1运行环境
编译平台:
MicrosoftVisualStudio2010
运行平台:
win7/xp
4.2调试分析
五、缺点及改进
5.1实验缺点
由于对Linux的文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化或者放开的方法。
在写程序的开始,也没有做详细的规划,而且是四个人分工协作,因此在程序的结构上有些混乱。
在后期做了一些调整,但是整体还是有缺陷的。
另外,程序只是很简单的模拟了Linux的文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,难免会出现一些Bug,另外,我们整体在写的时候是用的C++的写法,但是在编写的时候,又混用了c的一些方法,所以,整个程序更加混乱,给阅读理解带来非常大的困难。
5.2实验改进
首先,我们先要把一些原理知识搞清楚,其次,做一个统一的项目规划,做好一些定义的声明,结构再清晰一些。
更深层次的模拟Linux文件管理系统,将一些函数的考虑更加严谨、全面,多次调试,减少一些bug。
尽量用规范的C++语言才编写,注清函数功能,便于相互分享调用阅读。
六、实验总结
本实验是模拟Linux文件管理系统,而我们平时很少接触到Linux系统,只是在书上学了一些理论的皮毛,纸上得来总觉浅,因此在开始做的时候,感觉无从下手,只能去网上去查找一些相关知识,以及看老师给的例子,并且和其他组就行讨论,这个时间花了一天半的时间,但是成果不是很好,很多地方都不明白。
但是时间紧迫,我们就边做边理解、讨论,这样造成一个非常大的困难,不知道从哪里下手,只能模仿着做,加深理解。
在两天的仓促的时间里面,我们做出了一个简单可行的模拟文件系统,虽然问题不少,但是在时间的允许下,我们还是不错的。
在编程中,我们遇到了很多以前没有遇到的问题和知识,在通过相互讨论,上网查询等方法后,我们解决了大部分的问题,对C++语言的理解也加深了很多,对一个项目的需求也理解很多,一个合理的规划会提高不少效率。
七、参考文献
《C++程序设计》清华大学出版社谭浩强
《算法与数据结构(第二版)》高等教育出版社张乃孝
《操作系统教程(第四遍)》高等教育出版社孙钟秀
8.2源程序
#include<
iostream>
string>
stdio.h>
usingnamespacestd;
constunsignedintDINODE_NUM=512;
constunsignedintDATA_START=(2+DINODE_NUM)*BLOCK_SIZE;
constunsignedintDIRECTORY_NUM=12;
//每个目录最多允许拥有的子目录和文件
constunsignedshortFILE_NAME_LENGTH=20;
//最大文件名长度
/**************************
inode结构体
**************************/
unsignedshortdi_number;
unsignedshortdi_block;
/*————————————————————————
超级块结构
————————————————————————*/
unsignedshorts_inodes_count;
unsignedshorts_free_inodes_count;
/*空闲的inode总数*/
unsignedshorts_blocks_count;
/*块总数*/
unsignedshorts_r_blocks_count;
unsignedshorts_free_blocks_count;
unsignedshorts_log_block_size;
//unsignedshorts_free_blocks_group[GROUPNUM];
//新增一个数组来记录每个数据块组中的空闲数据块计数
//unsignedshorts_first_data_block;
/*第一个数据block*/
//unsignedshorts_blocks_per_group;
/*每blockgroup的block数量*/
//unsignedshorts_inodes_per_group;
/*每blockgroup的inode数量*/
账户信息
//用户ID
//权限1为管理员0为平民
文件、目录项结构
stringname;
/*目录、文件名*/
stringcontent;
/*文件数据,目录则没有数据*/
unsignedshortd_ino;
/*目录、文件号*/
/*----变量--------*/
unsignedshortdi_bitmap[DINODE_NUM];
//硬盘inode节点位图1表示已使用0表示未使用
unsignedshortbk_bitmap[DATA_BLOCK_NUM];
//数据块block位图
structsuper_blocksuperBlock;
//超级块
structuseraccount[ACCOUNT_NUM];
//共创建ACCOUNT_NUM个账户
FILE*f_stream;
//文件指针
structinode*cur_inode;
//inode当前目录指针
structinode*inode_temp;
//inode临时指针
constchardiskName[30]="
ext2forlinux.disk"
;
//模拟硬盘的文件名
structdirectorydir_buf[DIRECTORY_NUM];
//目录数组,每个目录最多允许有12个项(子目录或者文件)
stringcur_Path;
//cmd的头表示所在哪个文件夹
//inti_lock=0;
//inode位图锁可能会多线程
//intb_lock=0;
//block位图锁
structuser*cur_user;
//当前用户
structdirectorycur_dir[DIRECTORY_NUM];
//当前目录
/**********************
函数声明
********************/
//此函数用于格式化
//此函数用于装载虚拟硬盘的数据
intFindFile(stringfilename);
//次函数用于查找当前文件夹是否有该文件
boolaccess(structinode*pinode);
//权限判断
intmain(){
voidlogin(void);
//此函数用于用户登陆
voidshowMenu(void);
//此函数用于显示功能菜单
boolonAction(void);
//此函数用于用户选择功能并执行
charformat_bool;
/**************初始化************/
cout<
<
系统已启动,是否初始化所有数据?
\tY/N"
endl;
while(true){
cin>
>
format_bool;
if(format_bool=='
y'
||format_bool=='
Y'
){
if(!
Format())return0;
break;
}
elseif(format_bool=='
n'
N'
cout<
不初始化不能开始!
continue;
else{
请输入Y或者N"
}
}
初始化成功!
/********转载虚拟硬盘数据***********/
if(!
install()){
cout<
加载失败,无效的硬盘格式"
//main();
return0;
elsecout<
加载disk成功!
cur_Path=cur_dir[1].name+"
\\root"
/*******登陆**********/
login();
/**显示菜单**/
showMenu();
/**显示当前路径**/
cur_Path;
while(onAction());
return0;
}
/*此函数用于格式化*/
boolFormat(){
//创建文件
f_stream=fopen(diskName,"
wb+"
);
if(f_stream==NULL){
创建文件失败"
returnfalse;
//初始化超级块
superBlock.s_inodes_count=DINODE_NUM;
superBlock.s_free_inodes_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;
/*空闲的inode总数初始化时,主目录和账户信息各占一块,10个用户10块*/
superBlock.s_blocks_count=DATA_BLOCK_NUM;
superBlock.s_free_blocks_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;
//空闲块总数主目录/10个用户/账户信息共占用12个
superBlock.s_log_block_size=BLOCK_SIZE;
//超级块放第1个物理块,第0个为引导
fseek(f_stream,BLOCK_SIZE,SEEK_SET);
fwrite(&
superBlock,BLOCK_SIZE,1,f_stream);
//fprintf(f_stream,"
thisissuperblock"
//测试
//初始化dinode位图block位图
for(inti=0;
i<
DATA_BLOCK_NUM;
i++){
if(i<
2+ACCOUNT_NUM)bk_bitmap[i]=1;
elsebk_bitmap[i]=0;
//初始化block位图
DINODE_NUM;
2+ACCOUNT_NUM)di_bitmap[i]=1;
elsedi_bitmap[i]=0;
//位示图存放与第2.3块
fseek(f_stream,BLOCK_SIZE*2,SEEK_SET);
di_bitmap,BLOCK_SIZE,1,f_stream);