操作系统实验报告 文件管理系统源程序.docx
- 文档编号:11734621
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:52
- 大小:191.16KB
操作系统实验报告 文件管理系统源程序.docx
《操作系统实验报告 文件管理系统源程序.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 文件管理系统源程序.docx(52页珍藏版)》请在冰豆网上搜索。
操作系统实验报告文件管理系统源程序
操作系统实验报告
题目:
文件管理系统
班级:
2011年12月21日
一、实践内容
1.1实验内容
通过一个简单的二级文件系统设计,加深对文件系统的内部功能以及内部实现的理解。
要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现以下几条命令,用输入命令来模拟用户程序中调用的文件操作:
Login用户登录
用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。
正确则登陆成功,当前目录设定到当前用户文件夹下。
format格式化
初始化超级块,初始化主目录,初始化管理员admin目录,初始化用户目录,初始化用户passwd文件。
create创建文本文件
查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请硬盘空间,申请失败则结束。
将文件内容写入硬盘空间。
修改当前目录的结构,修改超级块。
cdir创建文件夹
查找当前目录下是否有同名文件,是则退出,否则,申请硬盘空间,申请失败则结束。
将文件夹内容写入硬盘空间。
修改当前目录的结构,修改超级块,写入模拟硬盘。
readedit
读取和追加文本文件
Read
查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。
Edit
调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个硬盘分配空间则申请分配空间,失败则退出,申请成功则保存文件。
access(文件名)
权限判断,先判断当前目录是否有该文件,在当前目录的硬盘空间找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。
如果是该用户创建的则有读写权限如果当前用户是管理员组的也具有读写权限如果该文件是用户可查看文件则都具有权限。
cd
进入子目录或上级目录,查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的目录,将当前目录指向该目录。
attr(文件名)
查看文件或者文件夹的属性,先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的空间和目录。
将其全部显示出来。
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
#include
#include
usingnamespacestd;
/*---------常变量------*/
constunsignedintBLOCK_SIZE=512;//块长
constunsignedintDATA_BLOCK_NUM=512;//数据块数量
constunsignedintDINODE_START=4*BLOCK_SIZE;//inode起始位置
constunsignedintDINODE_SIZE=512;//inode大小
constunsignedintDINODE_NUM=512;//inode数量
constunsignedintDATA_START=(2+DINODE_NUM)*BLOCK_SIZE;//数据区的开始地址
constunsignedintACCOUNT_NUM=10;//用户数量
constunsignedintDIRECTORY_NUM=12;//每个目录最多允许拥有的子目录和文件
constunsignedshortFILE_NAME_LENGTH=20;//最大文件名长度
/**************************
inode结构体
**************************/
/*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;/*数据块块地址编号*/
};
/*————————————————————————
超级块结构
————————————————————————*/
structsuper_block{
unsignedshorts_inodes_count;/*文件系统中inode的总数*/
unsignedshorts_free_inodes_count;/*空闲的inode总数*/
unsignedshorts_blocks_count;/*块总数*/
unsignedshorts_r_blocks_count;/*保留块总数*/
unsignedshorts_free_blocks_count;//空闲块总数
unsignedshorts_log_block_size;/*block的大小*/
//unsignedshorts_free_blocks_group[GROUPNUM];//新增一个数组来记录每个数据块组中的空闲数据块计数
//unsignedshorts_first_data_block;/*第一个数据block*/
//unsignedshorts_blocks_per_group;/*每blockgroup的block数量*/
//unsignedshorts_inodes_per_group;/*每blockgroup的inode数量*/
};
/*————————————————————————
账户信息
————————————————————————*/
structuser{
unsignedshortuser_id;//用户ID
unsignedshortuser_access;//权限1为管理员0为平民
stringusername;//用户名
stringpassword;//密码
};
/*————————————————————————
文件、目录项结构
————————————————————————*/
structdirectory{
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];//当前目录
/**********************
函数声明
********************/
boolFormat(void);//此函数用于格式化
boolinstall(void);//此函数用于装载虚拟硬盘的数据
intFindFile(stringfilename);//次函数用于查找当前文件夹是否有该文件
boolaccess(structinode*pinode);//权限判断
intmain(){
voidlogin(void);//此函数用于用户登陆
voidshowMenu(void);//此函数用于显示功能菜单
boolonAction(void);//此函数用于用户选择功能并执行
charformat_bool;
/**************初始化************/
cout<<"系统已启动,是否初始化所有数据?
\tY/N"< while(true){ cin>>format_bool; if(format_bool=='y'||format_bool=='Y'){ if(! Format())return0; break; } elseif(format_bool=='n'||format_bool=='N'){ cout<<"不初始化不能开始! "< continue; } else{ cout<<"请输入Y或者N"< continue; } } cout<<"初始化成功! "< /********转载虚拟硬盘数据***********/ if(! install()){ cout<<"加载失败,无效的硬盘格式"< //main(); return0; } elsecout<<"加载disk成功! "< cur_Path=cur_dir[1].name+"\\root"; /*******登陆**********/ login(); /**显示菜单**/ showMenu(); /**显示当前路径**/ cout< while(onAction()); return0; } /*此函数用于格式化*/ boolFormat(){ //创建文件 f_stream=fopen(diskName,"wb+"); if(f_stream==NULL){ cout<<"创建文件失败"< returnfalse; } //初始化超级块 superBlock.s_inodes_count=DINODE_NUM;/*文件系统中inode的总数*/ 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;/*block的大小*/ //超级块放第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 if(i<2+ACCOUNT_NUM)bk_bitmap[i]=1; elsebk_bitmap[i]=0; } //初始化block位图 for(inti=0;i if(i<2+ACCOUNT_NUM)di_bitmap[i]=1; elsedi_bitmap[i]=0; } //位示图存放与第2.3块 fseek(f_stream,BLOCK_SIZE*2,SEEK_SET); fwrite(&di_bitmap,BLOCK_SIZE,1,f_stream);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统实验报告 文件管理系统 源程序 操作系统 实验 报告 文件 管理 系统