操作系统原理文件管理.docx
《操作系统原理文件管理.docx》由会员分享,可在线阅读,更多相关《操作系统原理文件管理.docx(36页珍藏版)》请在冰豆网上搜索。
操作系统原理文件管理
计算机科学技术学院
操作系统原理
课程设计报告
题目:
文件管理系统
专业:
网络工程
班级:
网络09-1
姓名:
邵岩
学号:
21
指导老师:
***
2011年12月
操作系统原理课程设计任务书
一、题目:
文件系统管理
二、设计要求
(1)鲁建成负责设计与实现。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。
(4)所设计的程序应有输入、输出。
(5)按要求写出课程设计报告,并于设计结束后1周内提交。
其主要内容包括:
封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:
带中文注释的程序清单、参考文献。
报告一律用A4纸打印,中文字体为宋体,西文字体用TimeNewRoma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。
总体设计应配合软件总体模块结构图来说明软件应具有的功能。
详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
三、课程设计工作量
由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。
四、课程设计工作计划
2007年6月18日,指导教师讲课,学生根据题目准备资料;
2007年6月19日,进行总体方案设计;
2007年6月20日~2007年6月25日,完成程序模块并通过独立编译;
2007年6月26日~2007年6月27日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;
2007年6月27日~2007年6月29日,验收、撰写报告;
2007年6月29日下午,验收或总结。
指导教师签章:
教研室主任签章
操作系统原理课程设计指导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2007年7月10日
一概述
1.课程设计的目的
1.理解重要数据结构的意义
2.掌握文件系统的工作原理
3.通过本次课程设计加深文件系统内部功能及内部实现的理解
2.课程设计的要求
1.需要的基本知识:
文件:
一组带标志的在逻辑上有完整意义的信息项的序列,这个标识为文件名。
文件系统:
操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新。
提供安全可靠的共享和保护手段,并且方便用户使用。
2.技能:
具有用C语言编程的能力,懂得文件系统调用处理的算法及一些操作系统文件系统的实现的基本思想。
3.尚未掌握的知识点:
高速缓存管理和磁盘管理算法
4.参阅操作系统原理书籍中文件管理的相关知识。
5.老师提出的要求:
在理解文件系统的层次结构,掌握高速缓存管理和磁盘管理的基本思想和算法的基础上,掌握文件系统的系统调用处理算法和运用,分析流行操作系统文件系统的实现的基本思想,尝试设计简单的文件系统
3.课程设计的主要设计思想
在任一OS下,建立一个大文件,把它假想成一张盘,在其中实现一个简单的模拟UNIX(LINUX)文件系统。
本次文件系统具有以下的功能:
1、初始化
2、建立文件(需给出文件名,文件长度)
3、建立子目录
4、打开文件(显示文件所占的盘块)
5、删除文件
6、删除目录
7、显示目录(即显示目录下的信息,包括文件、子目录等)
8、显示整个系统信息
二总体方案设计
2.1算法的整体思路
进入UNIX文件系统界面,提示有初始化,查看当前目录文件列表,查看文件,查看系统信息,创建目录、文件,删除目录、文件,进入当前目录的指定目录,返回上一级目录,显示帮助命令和退出文件模拟12项功能,根据各个命令的提示命令,输入命令提示符,运行各个动能。
2.2主要特点
此课程设计的功能完善,由于学习过在LINUX的环境编程,此课程设计仿照LINUX环境,命令符并未改变,这样可以使同学们很快的熟悉在此程序的环境中练习。
2.3我所承担的设计工作是整个文件系统。
以下是整体框图。
整体框图
N
Y
图2.3框图
三详细设计
3.1所完成的具体功能
初始化,查看当前目录文件列表,查看文件,查看系统信息,创建目录、文件,删除目录、文件,进入当前目录的指定目录,返回上一级目录,显示帮助命令和退出文件模拟12项功能。
3.2程序流程图
3.2.1Format()
1.超级块初始化
图3.2.1.1
2.信息初始化
图3.2.1.2
3.存储空间初始化
图3.2.1.3
4.将空闲块的信息用成组链接的方法写进每组的最后一个块中
图3.2.1.4
3.2.2Callback(intlength)
图3.2.2
3.2.3Allot(intlength)
图3.2.3
3.2.4create_file(charfilename[],intlength)
图
图3.2.4
3.2.5del_file(charfilename[])
图3.2.5
3.2.6del_dir(charfilename[])
图3.2.6
3.2.7voiddisplay_curdir()
图3.2.7
3.2.8display_dir(charfilename[])
图3.2.8
3.2.9voidopen_file(charfilename[]
图3.2.9
四程序的调试与运行结果说明
经过调试,程序运行一切正常。
运行结果如下
进入界面
建立目录,建立文件,查看,进入子目录等功能界面
五课程设计总结
此次的课程设计从总体上来看,功能比较齐全,并能准确的模拟简单的UNIX文件系统。
但是由于时间原因和经验的知识的匮乏,踏还是存在不少功能上的不足和不完善。
在登录正规的文件系统时,都会有用户登录界面和退出登录的界面,但是此文件系统课程设计中就缺少这一功能。
这一问题需要有用户帐号和密码。
解决这一个问题,就要加入一个代码,即登录代码和退出代码。
代码如下:
intlogin(uid,passwd)
unsignedshortuid;
char*passwd;
{inti,j;
for(i=0;i{if((uid==pwd[i].p_uid)&&(!strcmp(passwd,pwd[i].password))){for(j=0;jif(user[j].u_uid==0){break;}if(j==USERNUM){printf("\ntoomuchuserinthesystem,pleasewaittologin\n");return0;}else{user[j].u_uid=uid;user[j].u_gid=pwd[i].p_gid;user[j].u_default_mode=DEFAULTMODE;}break;}}if(i==PWDNUM){printf("\nincorrectpassword\n");return0;}elsereturn1;}intlogout(uid)/*logout*/unsignedshortuid;{inti,j,k,sys_no;structinode*inode;for(k=0;kif(uid==user[k].u_uid){i=k;break;}if(k==USERNUM){printf("\nnosuchauser\n");returnNULL;}for(j=0;j{if(user[i].u_ofile[j]!=SYSOPENFILE+1){/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/sys_no=user[i].u_ofile[j];inode=sys_ofile[sys_no].f_inode;iput(inode);sys_ofile[sys_no].f_count--;user[i].u_ofile[j]=SYSOPENFILE+1;}}return1;} 六后记在老师和同学们的帮助下,顺利完成了本次的课程设计。通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。在编程过程中我们遇到了一些难题和困难。对于一些技术难题给予了我们点拨和指导。从而使我们的程序得到了顺利完成。此外,我还要感谢一直帮助我的同学们!最后,还请大家对我们的程序给予批评和指正! 七附录/*HELLO.C--Hello,world*/#include"stdio.h"#include#include#includeintphysic[300];/*文件地址缓冲区*/intstyle=1;/*文件的类型*/charcur_dir[10]="c";/*当前目录*/structcommand{charcom[10];}cmd[12];structblock{intn;/*空闲的盘快的个数*/intfree[50];/*存放空闲盘快的地址*/inta;/*模拟盘快是否被占用*/}memory[200];structblock_super{intn;/*空闲的盘快的个数*/intfree[50];/*存放进入栈中的空闲块*/intstack[50];/*存放下一组空闲盘快的地址*/}super_block;structnode/*i结点信息*/{intfile_style;/*i结点文件类型*/intfile_length;/*i结点文件长度*/intfile_address[100];/*i结点文件的物理地址*/}i_node[64]; structdir/*目录项信息*/{charfile_name[10];/*文件名*/inti_num;/*文件的结点号*/chardir_name[10];/*文件所在的目录*/}c[64];voidformat()/*格式化*/{inti,j,k;super_block.n=50;for(i=0;i<50;i++)/*超级块初始化*/{super_block.free[i]=i;/*存放进入栈中的空闲块*/super_block.stack[i]=50+i;/*存放下一组的盘块*/}for(i=0;i<64;i++)/*i结点信息初始化*/{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;/*文件地址*/}i_node[i].file_length=-1;/*文件长度*/i_node[i].file_style=-1;/*文件类型*/}for(i=0;i<64;i++)/*根目录区信息初始化*/{strcpy(c[i].file_name,"");c[i].i_num=-1;strcpy(c[i].dir_name,"");}for(i=0;i<200;i++)/*存储空间初始化*/{memory[i].n=0;/*必须有这个*/memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}}for(i=0;i<200;i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/{/*存储空间初始化*/if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<200){memory[i].free[j]=k;/*下一组空闲地址*/memory[i].n++;/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/k++;}else{memory[i].free[j]=-1;}}memory[i].a=0;/*标记为没有使用*/continue;/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/}for(j=0;j<50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf("已经初始化完毕\n");printf("欢迎进入UNIX文件模拟系统\n\n");}voidwrite_file(FILE*fp)/*将信息读入系统文件中*/{inti;fp=fopen("system","wb");for(i=0;i<200;i++){fwrite(&memory[i],sizeof(structblock),1,fp);}fwrite(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fwrite(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fwrite(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidread_file(FILE*fp)/*读出系统文件的信息*/{inti;fp=fopen("system","rb");for(i=0;i<200;i++){fread(&memory[i],sizeof(structblock),1,fp);}fread(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fread(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fread(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidcallback(intlength)/*回收磁盘空间*/{inti,j,k,m,q=0;for(i=length-1;i>=0;i--){k=physic[i];/*需要提供要回收的文件的地址*/m=49-super_block.n;/*回收到栈中的哪个位置*/if(super_block.n==50)/*注意当super_block.n==50时m=-1;的值*/{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息*/}super_block.free[m]=physic[i];/*将下一个文件地址中的盘块号回收到栈中*/super_block.n++;}}voidallot(intlength)/*分配空间*/{inti,j,k,m,p;for(i=0;i{k=50-super_block.n;/*超级块中表示空闲块的指针*/m=super_block.free[k];/*栈中的相应盘块的地址*/p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/{printf("内存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1;/*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
{if((uid==pwd[i].p_uid)&&(!
strcmp(passwd,pwd[i].password)))
{
for(j=0;jif(user[j].u_uid==0){break;}if(j==USERNUM){printf("\ntoomuchuserinthesystem,pleasewaittologin\n");return0;}else{user[j].u_uid=uid;user[j].u_gid=pwd[i].p_gid;user[j].u_default_mode=DEFAULTMODE;}break;}}if(i==PWDNUM){printf("\nincorrectpassword\n");return0;}elsereturn1;}intlogout(uid)/*logout*/unsignedshortuid;{inti,j,k,sys_no;structinode*inode;for(k=0;kif(uid==user[k].u_uid){i=k;break;}if(k==USERNUM){printf("\nnosuchauser\n");returnNULL;}for(j=0;j{if(user[i].u_ofile[j]!=SYSOPENFILE+1){/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/sys_no=user[i].u_ofile[j];inode=sys_ofile[sys_no].f_inode;iput(inode);sys_ofile[sys_no].f_count--;user[i].u_ofile[j]=SYSOPENFILE+1;}}return1;} 六后记在老师和同学们的帮助下,顺利完成了本次的课程设计。通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。在编程过程中我们遇到了一些难题和困难。对于一些技术难题给予了我们点拨和指导。从而使我们的程序得到了顺利完成。此外,我还要感谢一直帮助我的同学们!最后,还请大家对我们的程序给予批评和指正! 七附录/*HELLO.C--Hello,world*/#include"stdio.h"#include#include#includeintphysic[300];/*文件地址缓冲区*/intstyle=1;/*文件的类型*/charcur_dir[10]="c";/*当前目录*/structcommand{charcom[10];}cmd[12];structblock{intn;/*空闲的盘快的个数*/intfree[50];/*存放空闲盘快的地址*/inta;/*模拟盘快是否被占用*/}memory[200];structblock_super{intn;/*空闲的盘快的个数*/intfree[50];/*存放进入栈中的空闲块*/intstack[50];/*存放下一组空闲盘快的地址*/}super_block;structnode/*i结点信息*/{intfile_style;/*i结点文件类型*/intfile_length;/*i结点文件长度*/intfile_address[100];/*i结点文件的物理地址*/}i_node[64]; structdir/*目录项信息*/{charfile_name[10];/*文件名*/inti_num;/*文件的结点号*/chardir_name[10];/*文件所在的目录*/}c[64];voidformat()/*格式化*/{inti,j,k;super_block.n=50;for(i=0;i<50;i++)/*超级块初始化*/{super_block.free[i]=i;/*存放进入栈中的空闲块*/super_block.stack[i]=50+i;/*存放下一组的盘块*/}for(i=0;i<64;i++)/*i结点信息初始化*/{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;/*文件地址*/}i_node[i].file_length=-1;/*文件长度*/i_node[i].file_style=-1;/*文件类型*/}for(i=0;i<64;i++)/*根目录区信息初始化*/{strcpy(c[i].file_name,"");c[i].i_num=-1;strcpy(c[i].dir_name,"");}for(i=0;i<200;i++)/*存储空间初始化*/{memory[i].n=0;/*必须有这个*/memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}}for(i=0;i<200;i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/{/*存储空间初始化*/if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<200){memory[i].free[j]=k;/*下一组空闲地址*/memory[i].n++;/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/k++;}else{memory[i].free[j]=-1;}}memory[i].a=0;/*标记为没有使用*/continue;/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/}for(j=0;j<50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf("已经初始化完毕\n");printf("欢迎进入UNIX文件模拟系统\n\n");}voidwrite_file(FILE*fp)/*将信息读入系统文件中*/{inti;fp=fopen("system","wb");for(i=0;i<200;i++){fwrite(&memory[i],sizeof(structblock),1,fp);}fwrite(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fwrite(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fwrite(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidread_file(FILE*fp)/*读出系统文件的信息*/{inti;fp=fopen("system","rb");for(i=0;i<200;i++){fread(&memory[i],sizeof(structblock),1,fp);}fread(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fread(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fread(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidcallback(intlength)/*回收磁盘空间*/{inti,j,k,m,q=0;for(i=length-1;i>=0;i--){k=physic[i];/*需要提供要回收的文件的地址*/m=49-super_block.n;/*回收到栈中的哪个位置*/if(super_block.n==50)/*注意当super_block.n==50时m=-1;的值*/{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息*/}super_block.free[m]=physic[i];/*将下一个文件地址中的盘块号回收到栈中*/super_block.n++;}}voidallot(intlength)/*分配空间*/{inti,j,k,m,p;for(i=0;i{k=50-super_block.n;/*超级块中表示空闲块的指针*/m=super_block.free[k];/*栈中的相应盘块的地址*/p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/{printf("内存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1;/*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
if(user[j].u_uid==0)
break;
}
if(j==USERNUM)
{printf("\ntoomuchuserinthesystem,pleasewaittologin\n");
return0;
else
user[j].u_uid=uid;
user[j].u_gid=pwd[i].p_gid;
user[j].u_default_mode=DEFAULTMODE;
if(i==PWDNUM)
{printf("\nincorrectpassword\n");
return1;
intlogout(uid)/*logout*/
{inti,j,k,sys_no;
structinode*inode;
for(k=0;kif(uid==user[k].u_uid){i=k;break;}if(k==USERNUM){printf("\nnosuchauser\n");returnNULL;}for(j=0;j{if(user[i].u_ofile[j]!=SYSOPENFILE+1){/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/sys_no=user[i].u_ofile[j];inode=sys_ofile[sys_no].f_inode;iput(inode);sys_ofile[sys_no].f_count--;user[i].u_ofile[j]=SYSOPENFILE+1;}}return1;} 六后记在老师和同学们的帮助下,顺利完成了本次的课程设计。通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。在编程过程中我们遇到了一些难题和困难。对于一些技术难题给予了我们点拨和指导。从而使我们的程序得到了顺利完成。此外,我还要感谢一直帮助我的同学们!最后,还请大家对我们的程序给予批评和指正! 七附录/*HELLO.C--Hello,world*/#include"stdio.h"#include#include#includeintphysic[300];/*文件地址缓冲区*/intstyle=1;/*文件的类型*/charcur_dir[10]="c";/*当前目录*/structcommand{charcom[10];}cmd[12];structblock{intn;/*空闲的盘快的个数*/intfree[50];/*存放空闲盘快的地址*/inta;/*模拟盘快是否被占用*/}memory[200];structblock_super{intn;/*空闲的盘快的个数*/intfree[50];/*存放进入栈中的空闲块*/intstack[50];/*存放下一组空闲盘快的地址*/}super_block;structnode/*i结点信息*/{intfile_style;/*i结点文件类型*/intfile_length;/*i结点文件长度*/intfile_address[100];/*i结点文件的物理地址*/}i_node[64]; structdir/*目录项信息*/{charfile_name[10];/*文件名*/inti_num;/*文件的结点号*/chardir_name[10];/*文件所在的目录*/}c[64];voidformat()/*格式化*/{inti,j,k;super_block.n=50;for(i=0;i<50;i++)/*超级块初始化*/{super_block.free[i]=i;/*存放进入栈中的空闲块*/super_block.stack[i]=50+i;/*存放下一组的盘块*/}for(i=0;i<64;i++)/*i结点信息初始化*/{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;/*文件地址*/}i_node[i].file_length=-1;/*文件长度*/i_node[i].file_style=-1;/*文件类型*/}for(i=0;i<64;i++)/*根目录区信息初始化*/{strcpy(c[i].file_name,"");c[i].i_num=-1;strcpy(c[i].dir_name,"");}for(i=0;i<200;i++)/*存储空间初始化*/{memory[i].n=0;/*必须有这个*/memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}}for(i=0;i<200;i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/{/*存储空间初始化*/if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<200){memory[i].free[j]=k;/*下一组空闲地址*/memory[i].n++;/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/k++;}else{memory[i].free[j]=-1;}}memory[i].a=0;/*标记为没有使用*/continue;/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/}for(j=0;j<50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf("已经初始化完毕\n");printf("欢迎进入UNIX文件模拟系统\n\n");}voidwrite_file(FILE*fp)/*将信息读入系统文件中*/{inti;fp=fopen("system","wb");for(i=0;i<200;i++){fwrite(&memory[i],sizeof(structblock),1,fp);}fwrite(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fwrite(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fwrite(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidread_file(FILE*fp)/*读出系统文件的信息*/{inti;fp=fopen("system","rb");for(i=0;i<200;i++){fread(&memory[i],sizeof(structblock),1,fp);}fread(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fread(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fread(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidcallback(intlength)/*回收磁盘空间*/{inti,j,k,m,q=0;for(i=length-1;i>=0;i--){k=physic[i];/*需要提供要回收的文件的地址*/m=49-super_block.n;/*回收到栈中的哪个位置*/if(super_block.n==50)/*注意当super_block.n==50时m=-1;的值*/{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息*/}super_block.free[m]=physic[i];/*将下一个文件地址中的盘块号回收到栈中*/super_block.n++;}}voidallot(intlength)/*分配空间*/{inti,j,k,m,p;for(i=0;i{k=50-super_block.n;/*超级块中表示空闲块的指针*/m=super_block.free[k];/*栈中的相应盘块的地址*/p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/{printf("内存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1;/*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
if(uid==user[k].u_uid)
i=k;
if(k==USERNUM)
{printf("\nnosuchauser\n");
returnNULL;
for(j=0;j{if(user[i].u_ofile[j]!=SYSOPENFILE+1){/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/sys_no=user[i].u_ofile[j];inode=sys_ofile[sys_no].f_inode;iput(inode);sys_ofile[sys_no].f_count--;user[i].u_ofile[j]=SYSOPENFILE+1;}}return1;} 六后记在老师和同学们的帮助下,顺利完成了本次的课程设计。通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。在编程过程中我们遇到了一些难题和困难。对于一些技术难题给予了我们点拨和指导。从而使我们的程序得到了顺利完成。此外,我还要感谢一直帮助我的同学们!最后,还请大家对我们的程序给予批评和指正! 七附录/*HELLO.C--Hello,world*/#include"stdio.h"#include#include#includeintphysic[300];/*文件地址缓冲区*/intstyle=1;/*文件的类型*/charcur_dir[10]="c";/*当前目录*/structcommand{charcom[10];}cmd[12];structblock{intn;/*空闲的盘快的个数*/intfree[50];/*存放空闲盘快的地址*/inta;/*模拟盘快是否被占用*/}memory[200];structblock_super{intn;/*空闲的盘快的个数*/intfree[50];/*存放进入栈中的空闲块*/intstack[50];/*存放下一组空闲盘快的地址*/}super_block;structnode/*i结点信息*/{intfile_style;/*i结点文件类型*/intfile_length;/*i结点文件长度*/intfile_address[100];/*i结点文件的物理地址*/}i_node[64]; structdir/*目录项信息*/{charfile_name[10];/*文件名*/inti_num;/*文件的结点号*/chardir_name[10];/*文件所在的目录*/}c[64];voidformat()/*格式化*/{inti,j,k;super_block.n=50;for(i=0;i<50;i++)/*超级块初始化*/{super_block.free[i]=i;/*存放进入栈中的空闲块*/super_block.stack[i]=50+i;/*存放下一组的盘块*/}for(i=0;i<64;i++)/*i结点信息初始化*/{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;/*文件地址*/}i_node[i].file_length=-1;/*文件长度*/i_node[i].file_style=-1;/*文件类型*/}for(i=0;i<64;i++)/*根目录区信息初始化*/{strcpy(c[i].file_name,"");c[i].i_num=-1;strcpy(c[i].dir_name,"");}for(i=0;i<200;i++)/*存储空间初始化*/{memory[i].n=0;/*必须有这个*/memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}}for(i=0;i<200;i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/{/*存储空间初始化*/if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<200){memory[i].free[j]=k;/*下一组空闲地址*/memory[i].n++;/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/k++;}else{memory[i].free[j]=-1;}}memory[i].a=0;/*标记为没有使用*/continue;/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/}for(j=0;j<50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf("已经初始化完毕\n");printf("欢迎进入UNIX文件模拟系统\n\n");}voidwrite_file(FILE*fp)/*将信息读入系统文件中*/{inti;fp=fopen("system","wb");for(i=0;i<200;i++){fwrite(&memory[i],sizeof(structblock),1,fp);}fwrite(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fwrite(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fwrite(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidread_file(FILE*fp)/*读出系统文件的信息*/{inti;fp=fopen("system","rb");for(i=0;i<200;i++){fread(&memory[i],sizeof(structblock),1,fp);}fread(&super_block,sizeof(structblock_super),1,fp);for(i=0;i<64;i++){fread(&i_node[i],sizeof(structnode),1,fp);}for(i=0;i<64;i++){fread(&c[i],sizeof(structdir),1,fp);}fclose(fp);}voidcallback(intlength)/*回收磁盘空间*/{inti,j,k,m,q=0;for(i=length-1;i>=0;i--){k=physic[i];/*需要提供要回收的文件的地址*/m=49-super_block.n;/*回收到栈中的哪个位置*/if(super_block.n==50)/*注意当super_block.n==50时m=-1;的值*/{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息*/}super_block.free[m]=physic[i];/*将下一个文件地址中的盘块号回收到栈中*/super_block.n++;}}voidallot(intlength)/*分配空间*/{inti,j,k,m,p;for(i=0;i{k=50-super_block.n;/*超级块中表示空闲块的指针*/m=super_block.free[k];/*栈中的相应盘块的地址*/p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/{printf("内存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1;/*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
{if(user[i].u_ofile[j]!
=SYSOPENFILE+1)
{/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/
sys_no=user[i].u_ofile[j];
inode=sys_ofile[sys_no].f_inode;
iput(inode);
sys_ofile[sys_no].f_count--;
user[i].u_ofile[j]=SYSOPENFILE+1;
return1;}
六后记
在老师和同学们的帮助下,顺利完成了本次的课程设计。
通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。
在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。
此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。
通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。
感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。
另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。
在编程过程中我们遇到了一些难题和困难。
对于一些技术难题给予了我们点拨和指导。
从而使我们的程序得到了顺利完成。
此外,我还要感谢一直帮助我的同学们!
最后,还请大家对我们的程序给予批评和指正!
七附录
/*HELLO.C--Hello,world*/
#include"stdio.h"
#include
intphysic[300];/*文件地址缓冲区*/
intstyle=1;/*文件的类型*/
charcur_dir[10]="c";/*当前目录*/
structcommand
charcom[10];
}cmd[12];
structblock
intn;/*空闲的盘快的个数*/
intfree[50];/*存放空闲盘快的地址*/
inta;/*模拟盘快是否被占用*/
}memory[200];
structblock_super
intfree[50];/*存放进入栈中的空闲块*/
intstack[50];/*存放下一组空闲盘快的地址*/
}super_block;
structnode/*i结点信息*/
intfile_style;/*i结点文件类型*/
intfile_length;/*i结点文件长度*/
intfile_address[100];/*i结点文件的物理地址*/
}i_node[64];
structdir/*目录项信息*/
charfile_name[10];/*文件名*/
inti_num;/*文件的结点号*/
chardir_name[10];/*文件所在的目录*/
}c[64];
voidformat()/*格式化*/
inti,j,k;
super_block.n=50;
for(i=0;i<50;i++)/*超级块初始化*/
super_block.free[i]=i;/*存放进入栈中的空闲块*/
super_block.stack[i]=50+i;/*存放下一组的盘块*/
for(i=0;i<64;i++)/*i结点信息初始化*/
for(j=0;j<100;j++)
i_node[i].file_address[j]=-1;/*文件地址*/
i_node[i].file_length=-1;/*文件长度*/
i_node[i].file_style=-1;/*文件类型*/
for(i=0;i<64;i++)/*根目录区信息初始化*/
strcpy(c[i].file_name,"");
c[i].i_num=-1;
strcpy(c[i].dir_name,"");
for(i=0;i<200;i++)/*存储空间初始化*/
memory[i].n=0;/*必须有这个*/
memory[i].a=0;
for(j=0;j<50;j++)
memory[i].free[j]=-1;
for(i=0;i<200;i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/
{/*存储空间初始化*/
if((i+1)%50==0)
k=i+1;
if(k<200)
memory[i].free[j]=k;/*下一组空闲地址*/
memory[i].n++;/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/
k++;
memory[i].a=0;/*标记为没有使用*/
continue;/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/
memory[i].n=0;
printf("已经初始化完毕\n");
printf("欢迎进入UNIX文件模拟系统\n\n");
voidwrite_file(FILE*fp)/*将信息读入系统文件中*/
inti;
fp=fopen("system","wb");
for(i=0;i<200;i++)
fwrite(&memory[i],sizeof(structblock),1,fp);
fwrite(&super_block,sizeof(structblock_super),1,fp);
for(i=0;i<64;i++)
fwrite(&i_node[i],sizeof(structnode),1,fp);
fwrite(&c[i],sizeof(structdir),1,fp);
fclose(fp);
voidread_file(FILE*fp)/*读出系统文件的信息*/
fp=fopen("system","rb");
fread(&memory[i],sizeof(structblock),1,fp);
fread(&super_block,sizeof(structblock_super),1,fp);
fread(&i_node[i],sizeof(structnode),1,fp);
fread(&c[i],sizeof(structdir),1,fp);
voidcallback(intlength)/*回收磁盘空间*/
inti,j,k,m,q=0;
for(i=length-1;i>=0;i--)
k=physic[i];/*需要提供要回收的文件的地址*/
m=49-super_block.n;/*回收到栈中的哪个位置*/
if(super_block.n==50)/*注意当super_block.n==50时m=-1;的值*/
{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/
memory[k].free[j]=super_block.free[j];
super_block.n=0;
memory[k].n=50;
memory[k].a=0;
if(m==-1)
m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址
的信息*/
super_block.free[m]=physic[i];/*将下一个文件地址中的盘块号回收到栈中*/
super_block.n++;
voidallot(intlength)/*分配空间*/
inti,j,k,m,p;
for(i=0;i{k=50-super_block.n;/*超级块中表示空闲块的指针*/m=super_block.free[k];/*栈中的相应盘块的地址*/p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/{printf("内存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1;/*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
k=50-super_block.n;/*超级块中表示空闲块的指针*/
m=super_block.free[k];/*栈中的相应盘块的地址*/
p=super_block.free[49];/*栈中的最后一个盘块指向的地址*/
if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/
printf("内存不足,不能够分配空间\n");
callback(length);
if(super_block.n==1)
memory[m].a=1;/*将最后一个盘块分配掉*/
physic[i]=m;
for(j=0;j{super_block.free[j]=memory[m].free[j];super_block.n++;}continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/}physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/memory[m].a=1;super_block.n--;}}voidcreate_file(charfilename[],intlength)/*创建文件*/{inti,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
super_block.free[j]=memory[m].free[j];
continue;/*要跳过这次循环,下面的语句在IF中已经执行过*/
physic[i]=m;/*栈中的相应盘块的地址写进文件地址缓冲区*/
memory[m].a=1;
super_block.n--;
voidcreate_file(charfilename[],intlength)/*创建文件*/
inti,j;
if(strcmp(filename,c[i].file_name)==0)
printf("文件已经存在,不允许建立重名的文件\n");
return;
if(c[i].i_num==-1)
c[i].i_num=i;
strcpy(c[i].file_name,filename);
strcpy(c[i].dir_name,cur_dir);/*把当前目录名给新建立的文件*/
i_node[i].file_style=style;
i_node[i].file_length=length;
allot(length);
for(j=0;j{i_node[i].file_address[j]=physic[j];}break;}}}voidcreate_dir(charfilename[])/*创建目录*/{style=0;/*0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/}voiddel_file(charfilename[])/*删除文件*/{inti,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
i_node[i].file_address[j]=physic[j];
voidcreate_dir(charfilename[])/*创建目录*/
style=0;/*0代表文件类型是目录文件*/
create_file(filename,4);
style=1;/*用完恢复初值,因为全局变量,否则*/
voiddel_file(charfilename[])/*删除文件*/
k=c[i].i_num;
for(j=0;j{physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length);/*调用回收函数*/for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/{i_node[k].file_address[j]=-1;/*地址恢复初值*/}strcpy(c[i].file_name,"");/*文件名恢复初值*/c[i].i_num=-1;/*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1;/*文件长度恢复*/i_node[k].file_style=-1;/*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件\n");}}voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/{inti,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){
physic[j]=i_node[k].file_address[j];
callback(i_node[k].file_length);/*调用回收函数*/
for(j=0;j<100;j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/
i_node[k].file_address[j]=-1;/*地址恢复初值*/
strcpy(c[i].file_name,"");/*文件名恢复初值*/
c[i].i_num=-1;/*目录项的I结点信息恢复初值*/
strcpy(c[i].dir_name,"");/*目录项的文件目录信息恢复初值*/
i_node[k].file_length=-1;/*文件长度恢复*/
i_node[k].file_style=-1;/*文件类型恢复初值*/
if(i==64)
printf("不存在这个文件\n");
voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/
for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/
k=c[i].i_num;/*找到目录名字*/
if(strcmp(c[i].file_name,filename)==0&&strcmp(cur_dir,filename)!
=0&&(i_node[k].file_style)==0)
for(j=0;j<64;j++)
if(strcmp(filename,c[j].dir_name)==0)
printf("目录不为空不能直接删除\n");
if(j==64)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1