1、存档资料 成绩: *课 程 设 计 报 告 书所属课程名称 操作系统 题 目 模拟文件系统 分 院 *分院 专业班级 学号 学生姓名 指导教师 2012 年 6 月 20 日 华东交通大学理工学院课程设计报告目录第1章 课程设计内容及要求.3第2章 需求分析.4第3章 系统设计及实现.5第4章 课程设计心得.16第5章 参考文献.17第1章 课程设计内容及要求课程设计题目:模拟文件系统课程设计内容及要求:通过本次实验,建立一个简单的模拟文件管理系统,理解用户界面和操作模拟管理在操作系统中的作用。本模拟文件管理系统实现文件的创建、文件的删除、文件目录的创建、删除文件目录、改变目录显示目录等功能。
2、本次课设由本人独立完成.第2章 需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1改变目录:cd 目录名,工作目录转到指定的目录下。cd . ,返回根目录下2创建文件:create 文件名,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。3删除文件:delete 文件名,删除指定的文件。4显示目录:ls 目录名,显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。5创建目录:mkdir 目录名,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。6删除目录:rmdir目录名,删除指定的
3、目录。7. 获得命令帮助 HELP 8. 退出文件系统 EXIT要考虑的特殊情况:1.各个命令对全路径和相对路径的支持A目录不存在时,给出错误信息B不能用cd 进入文件C相对路径的解析D路径中的空格剔除2.删除目录或文件时的问题A删除不存在的文件或目录,给出错误提示B删除目录时目录不为空; 如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除C进入到某个目录下,却要删除本目录或者上级目录第3章 系统设计及实现模拟文件系统处理流程如下:结束安装文件系统选择操作 否 是删除文件delete创建文件creat创建目录mkdir删除目录rmdir浏览目录ls结束文件
4、系统的几个主要数据结构:索引节点的数据结构:struct inode struct inode *i_forw; struct inode *i_back; char I_falg; unsigned int I_ino; unsigned int I_count; unsigned int di_addrNADDR; unsigned short di_number; unsigned short di_mode; unsigned short di_uid; unsigned short di_gid; unsigned short di_size;超级块的数据结构: struct fil
5、sysunsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_freeNICPREE;unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inodeNICINOD;unsigned int s_rinode;char s_fmod;有关目录的数据结构:struct dinodeunsigned short di_number;unsigned short di_mode;un
6、signed short di_uid;unsigned short di_gid;unsigned short di_size;unsigned int di_addrNADDR;struct directchar d_nameDIRSIZ;unsigned int d_ino;struct dirstruct direct ditectDIRNUM;int size;主要模块说明第 17 页 共 17 页创建文件 int get_file(int parent,char *file_name) /创建文件节点,成功则返回文件的索引号,失败返回-1int index;if(search(pa
7、rent,file_name,1,index)!=-1) /搜索在父目录下是否有同名文件存在,有则创建失败printf(File name repeated!n);return -1;for(int i=0;ifile_count; p-child_filetop=pos;p-file_count+;dir_change_flagparent+;return pos;int create(char *name) /创建文件的主调函数,前提是已经取得要创建文件的索引 /成功返回文件的索引号,否则返回-1int parent,p=0;parent=get_parent(name,p);if(par
8、ent=-1) /找不到父目录,输入错误,创建失败printf(Path name error!n);return -1;return create_file(parent,name+p); /开始创建文件创建目录int create_dir(int parent,char *dir_name) /在指定的目录下创建目录,如果成功则返回目录 /的索引号,否则返回-1if(dirparent.dir_count=8) /如果父目录已满,则创建失败printf(Parent directory is full!n);return -1;int pos=get_dir(parent,dir_name
9、); /开始创建目录if(pos=-1)printf(Create directory error!n);return -1;dir_node *p=&dirparent; /修改父目录的控制信息int top=p-dir_count; p-child_dirtop=pos;p-dir_count+;dir_change_flagparent+;return pos;int md(char *name) /创建目录的主调函数,它的参数只有用户输入 /如果创建成功,则返回目录的索引号,否则int parent,p=0; /返回-1parent=get_parent(name,p);if(pare
10、nt=-1) /父目录找不到,输入有误,创建失败printf(Path name error!n);return -1;return create_dir(parent,name+p); /开始创建目录删除文件void del_file(int pos) /删除文件,调用该函数的前提是已经取得要删除文件的索引号 return_block(pos); /释放磁盘块file_flagpos=0; fileflag_flagpos+;file_change_flagpos=0;int del_file(int parent,char *file_name) /在指定的目录下删除文件,删除成功则返回文
11、件的 /索引号,否则返回-1int del_pos,index;if(del_pos=search(parent,file_name,1,index)=-1)/搜索该文件是否存在,不存在则删除失败printf(The file to delete not exist!n);return -1;del_file(del_pos); /开始删除文件dir_node *p=&dirparent; /修改父目录的控制信息if(p-file_count=2)int top=p-file_count-1; p-child_fileindex=p-child_filetop;p-file_count-;di
12、r_change_flagparent+;return del_pos;int delfile(char *name) /删除文件的主调函数,前提是知道了删除文件的名字int parent,p=0;parent=get_parent(name,p);if(parent=-1)printf(Path name error!n);return -1;return del_file(parent,name+p);删除目录void del_dir(int pos) /删除指定的目录节点,该目录已经为空 dir_flagpos=0; dirflag_flagpos+;dir_change_flagpos
13、=0;void del(int pos) /删除一个指定目录及它下面的所有文件及所有目录 for(int i=0;idirpos.file_count;i+) /删除当前目录下的所有文件del_file(dirpos.child_filei);for(i=0;i=2) /修改父目录的控制信息int top=dirparent.dir_count-1;dirparent.child_dirindex=dirparent.child_dirtop;dirparent.dir_count-;dir_change_flagparent+;保存文件void savefile(int file_id) /
14、显式保存文件的核心函数if(fileflag_flagfile_id%2!=0) /如果创建或删除,需要写回磁盘write_bit(file_id,1);fileflag_flagfile_id=0;if(file_change_flagfile_id0) /如果控制信息被修改,需要写回磁盘write_inode(file_id,1);file_change_flagfile_id=0;for(int i=0;ifilefile_id.block_count;i+)int temp=filefile_id.blocki;if(blockflag_flagtemp%2!=0) /如果磁盘块被释放
15、或被占用,需要写回磁盘write_bit(temp,2);blockflag_flagtemp=0;保存目录void save_dir(int dir_id) /保存空目录函数if(dirflag_flagdir_id%2!=0) /如果删除或创建,需要写回磁盘write_bit(dir_id,0);dirflag_flagdir_id=0;if(dir_change_flagdir_id0) /如果控制信息被修改,需要写回磁盘write_inode(dir_id,0);dir_change_flagdir_id=0;void save(int dir_id) /保存一个目录及它下面的所有目录
16、及文件 /用了递归for(int i=0;idirdir_id.dir_count;i+)save(dirdir_id.child_diri);for(i=0;idirdir_id.file_count;i+)savefile(dirdir_id.child_filei);save_dir(dir_id);改变目录void paste(int dir_id) /用于设置当前路径if(dir_id=0)return;paste(dirdir_id.parent);strcat(curr_path,dirdir_id.dir_name);strcat(curr_path,/);int change
17、_dir(char *name) /改变工作目录,成功则返回该目 /录的索引号,否则返回-1int parent,p=0,pos,index;if(strcmp(name,/)=0)pos=0;else if(strcmp(name,.)=0)pos=curr_dir-parent;elseparent=get_parent(name,p);if(parent=-1)printf(Path name error!n);return -1;pos=search(parent,name+p,0,index);if(pos=-1) /如果该目录不存在,则失败printf(The dictory no
18、t exist!n);return -1;curr_path3=0;paste(pos);curr=pos; /改变当前目录及路径curr_dir=&dircurr; return curr; 显示当前目录下的文件和子目录信息void show_dir(int dir_id) /以下几个函数用于显示当前目录下面的目录和文件, /跟上面不同的是,它不能显示目录及文件之间的关系,printf(%s,dirdir_id.dir_name); /但它可以显示一些细节,如创建时间,文件for(int i=strlen(dirdir_id.dir_name);i20;i+)printf( );printf
19、();for(i=25;i30;i+)printf( );printf(%d-%.2d-%.2d%.2d:%.2d:%.2dn,dirdir_id.ctime.wYear,dirdir_id.ctime.wMonth,dirdir_id.ctime.wDay,dirdir_id.ctime.wHour,dirdir_id.ctime.wMinute,dirdir_id.ctime.wSecond);void show_file(int file_id) /显示一个文件printf(%s,filefile_id.file_name);for(int i=strlen(filefile_id.fi
20、le_name);i20;i+)printf( );printf();for(i=26;i30;i+)printf( );printf(%d-%.2d-%.2d%.2d:%.2d:%.2d,filefile_id.ctime.wYear,filefile_id.ctime.wMonth,filefile_id.ctime.wDay,filefile_id.ctime.wHour,filefile_id.ctime.wMinute,filefile_id.ctime.wSecond);for(i=0;i8;i+)printf( );int length=filefile_id.file_leng
21、th;printf(len: %d bytesn,length);void show(int dir_id) /显示目录及文件的核心函数,用了递归思想 for(int i=0;idirdir_id.file_count;i+)show_file(dirdir_id.child_filei);for(i=0;ifile_count); /统计文件数printf(n%d dirs.n,curr_dir-dir_count); /统计目录数获得系统的命令的帮助void help() /打印命令及解释printf(Commands: Explanation:nn);printf( exit -Exit
22、!n);printf( dir -Show files and directories!n);printf( mkf -Create a new file!n);printf( mkd -Create a new directory!n);printf( delf -Delete a file!n);printf( deld -Delete a directory!n);printf( cd -Change the current directory!n);printf( help -Print commands!n);系统实现相关截图:第4章 课程设计心得课程设计能反映出一个人的编程的综合能
23、力。它不仅要有好的编程功底 ,而且需要对课题有深刻的理解。这个设计的模拟文件系统基本上实现文件系统的部分命令。如format、cd、dir、mkf、mdd、delf、deld等。而且通过采用树型数据结构,以1兆为例可以最多显示64级目录,建立512个文件节点。但仍存在很大不足:没有按照面向对象思想设计程序结构,仍以函数为主,而不是对象为主;使用太多全局变量,浪费太多有用空间,而且存在安全隐患;系统函数多,程序的可读性比较差,使得整个程序显得清晰度不够。文件系统的测试用例还不够多,大量测试时还存在几个bug,特别是删除的文件和目录时有时候难以将控制信息和标志信息写入硬盘。总的来说,通过这次的操作
24、系统课程设计,试我对文件系统有了进一步的认识,理解。在温故C语言、数据结构的同时,对操作系统得文件管理这块内容收获了更多。虽然此次课程设计的工作量比较大,投入的时间和精力也很多,但我觉得非常值得。此外,我还充分体会到交流的重要性,通过与同学交流,获得了很多的帮助和设计灵感,使自己那禁锢的思维灵活起来,视野变得开阔,编程的效率自然就提高了。第6章 参考文献1 许日滨 计算机操作系统 M. 北京:北京邮电大学出版社,2008年1月2 孙英华 计算机操作系统习题解答与实验指导M 北京:北京邮电大学出版,2008年1月3致 谢感谢老师多日来的陪伴以及学校提供的机房等硬件设施,没有这些,这次可能不会这么顺利,再次感谢!