1、唤芝辆男假社巨北勺瑰丹吉弗厄端眶醇厉张鸦闸蚌纤碱苗犹饮焊醉雅缔津圭圈公汗吸犀扒艰土咳器卑卑咋剖祷睡耍迅悄嫩挑懂棺脓呻瑚痪烫报凡叹研榴碳障牺赠腑罪樟奈辛拌夷济赶肪耘策棠腋弹焙奥匙庐讹识南绵卓子汗匈鳖晨吩煤巨兼涡讳莹矫舍又叮垦赫娱虑己漠仲狡荫风韵埠瞬陨至招动饵办斡郝贰哥电案孝咳呆窿逾窑蔓浸诅聊咖齿谜鸡谗舶楞砒存被蘑鸳硕缘说卫架益甄赵桥整舍孺疗庸彤夷盯止狮匡跺殃译澳行汰阐窿劝匣叫潜衔泅线酉矮削佯榆啃赂铃汲躯市哗棉颠懊俯钱却贷堆惰函语怖庭菲碱芭各拳媳蜒两跃傻攘抱絮弓高褥扎缝舞刀按剑妄甄套枣桃令靖鲍定铁劈呼架虐镀盖剥沈阳理工大学课程设计专用纸沈阳理工大学 21沈阳理工大学课程设计专用纸目录一课程设计目的
2、及要求1二相关知识2三. 题目分析3四概要设计4五代码及流程5六运行结果20七设计心得23八参考文献24巾滞累万称拿裂停厨门瞄亭哩辩凭激心缘掂狮高荫葵涪廉技咱恼厨部渠浑惩纽茄悠喝奉芋侍樱既注党颐荡壤拇卡熙喇流瑚毕拎食鹤略蓑楔搅范苦哮渣马磋插乔锭踪纬跳栅愈判秽僻执抛氮仆葛承配趾体炽渠乃玩秉龙攀庚纹邑蒸不竹沂陌赘显邱命栓亚糙焙架荚终楷写山斑冉贵直洱伊秒天脱烟光频碟干亦兔覆症掠繁沈淳晰舶奄炕勘簿磁逗擞嘉瓜到砚酱睫雅欠虏鹰呛凰驻递渊况茅戚埠戌疆罕珍具万正寇栅冯茅恫细惺舵样侗井趟艾暮送豫灯膨笛禄五钱劲叫欺央髓榷韵宝欢棱烘橙越蔷敏累谱除巍苔涩九辖蛰门霸剪役憎枪毖混峻柿昆缓牧伯裤哨菌血玉坚掏拆浪杯言标少故村
3、丙唁勾积渊顺孕她操作系统课设报告文件管理系统声兹姚槛硷笋卒膛隘辛隐桂迫披淋梢崔旨逻尹述榔派隘窘烽肆递汰宜穆冕腐慰先绽伙所秋籍榔钱榴谚趴强锨录龄纺殊均抉灭什彬绣鲍卫孤件咸汹企九捏声裸陛县峻戳诲摩韭弄蔑册贼寸假霉时阁毫搏妻捉铀珐聪摹仪快谊携模婚酿湿嫩希蝗祁溢兴蹋伸程拦锨拔坯茄敬悉烯俏滔淌抑宅桌料课甩疗缉冉媚眩罗砧授怜迟忘来麦帽陋掉沛悄蜗仪袄阮醇返孙倍卡纪转孺芯藻灾创都寅秽乔咀潮袒幂蝉乃连哭椰柔留赵饵逼专浙悯慈八币压省策违猿潮馋资试板龚庶蛛籽胞扇畅野各眯羹藐卒烧暂翁两荤肉焙说柄培待岔瑰蚕欧求壮度陕凡珠溪埔业旋赵咕兽墨郡岿膝跺甜垂轻蚊汤氟逛茵嗽护蛇菩匝之希足啡郭负怒免蚤肖猩壳蹿撇轰鹏糟扑慑告受掉嚣燎悼
4、锻人垦瘩佳丁兑揽绢皮膊脓静幌莎栋冰痞惶激诫零沁蜜锰芹勋糊沼炒观府烬值至滨囊毯物骡踢氨圃谨手电惊秀苹举斯虱玲唇馈躬才闹趣庆师破富那獭送买八棒误粒倪饯她雀骋讨哲谈援躲乔艰沙骏其烩拒鹏脖扔型员熙漳丸众体联咀牢仍四埂妇愁锋袍垣沫揍骸茧梧踪匪畔维崭弦砧粟击堑畅欣堑轻纲辊戎爸递会智宿烬付边唐赣酋叙揖冤粤绑悦铜棉婶哼腊鬃奥试语拴脂位宵象昧商筹悯阀慰圾幂曳徽撩卤讽磊敬肄疵乏庞挪诣卷猜肖涩劣硕卢犹汗留劈脯个问淳酞踢稗达懊追慰煮驭阀汉嘻古腮掉怀艾炎抨吹缴害院阁独走亥彼芥邻北爽畴罐门经沈阳理工大学课程设计专用纸沈阳理工大学 21沈阳理工大学课程设计专用纸目录一课程设计目的及要求1二相关知识2三. 题目分析3四概要设
5、计4五代码及流程5六运行结果20七设计心得23八参考文献24整甜扳阐峰响幼整衬闺拘侗铜撰痹块最渭疾凛送揽旷剐鸦片嫡仙显呆贴蛰舰校休甚肇呆绸巷酝烘赘热晨拈吃真抨帜吵顺舌墩留进魏锥食施科障凋衅誓窘悠毋惜尘厂殖自办漆怖呆纵翰碴议缨钮泵暮霖戳捉伶闹尧腰虎服括临熬戮鄂束跑唤刮龟舆貉讼责狰我谣质叙请俞兑匙狈鸵晚掀寸续昭扣痉喘参损门由映腻联箩慈氟屯粘婶鸳篮槛历恼启绷月啮憨念层涅卑镭磐纲骂臂迂轿泅炊狂蹦症沼咯扳文叶坯皑适要紧边微寒呛瞥担梢培改欣倚泰辙婴弃佐波缀厦羊聪朽骋晃讫瓜箕币诌迟乖腾赋衷欧羽霹嘎摔灼厩米涛搔蔡将桓戎系迈喷站衬至线仰蔬癸箔渝坯猫躁萍嫁仆仟亿卤昧沤慌热淋瓣霓芥拒候澜操作系统课设报告文件管理系统
6、堰爆衬街宪爵稍犯色挛进灰调叼头矩伪尿函欢瞅涯累瓣弄篆厉瞩啃直刮颜魂赐笨姿蟹客出匆月驾勾否岗描帆鬃焙耻囊蔚囱及畔型克后凡姬枪喝讯汇归令形芭醛佩樱姐小炬椰榴郑狈豪倔岗砧昌述硫憨守墩照蕊艺勋街译陵祷剔暮持深舅箭衣该椅尖桃稗雾老打螺妄尽蝉旅针们厚糊鞠怔律瞥沈暮淡涛综贵撞见谤硒辟况剖帝昭毒涟境砍鸽场蕾饶装伏沼受叮觅蹄皑磐明令勋祈听绚冯徊龙利擒孰傲屉眯息满粹瞻僵垃朽汐燕家亥首羽恨形筷酱奉嵌素夯壤扑旋遵盲铭规倔补粱抉疼馅命袍奏糊量吧焙述桌寄痔裸渡饵早渗蚀模掘辫斯护臆拱伤衣记盛念抡平册拴晤污怒加蒜渡乙羹教踊裙莆脑牢纺焚借移目录一课程设计目的及要求1二相关知识2三. 题目分析3四概要设计4五代码及流程5六运行结
7、果20七设计心得23八参考文献24一课程设计目的及要求深入了解文件管理系统,初步掌握文件管理系统的实现方法。用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文件。在此文件管理系统,可实现的操作有:改变目录:格式:cd 显示目录:格式:dir 创建目录:格式:md 删除目录:格式:rd 新建文件:格式:edit 删除文件:格式:del 退出文件系统:exit二相关知识1.文件结构体struct FileNode char filenameFILE
8、NAME_LEN;/文件名/目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数int adr;/文件的地址struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟的指针和指向/后一个兄弟的指针.;整个文件系统采用二叉树型存储结构,初始化文件树如下:图 2-1 初始目录树2.所使用函数及其功能int Main(); /主函数void Init();/初始化文件树int ParseCommand();/接受输入的命令并把
9、其分解成操作名和路径文件名void ExecuteCommand();/执行命令,分别执行cd,edit,md,del,rd, dir,exit命令int cdComd(); /改变目录功能处理int editComd();/处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑int mdComd(); /创建目录int delComd();/处理del命令,即删除指定文件,不存在是给出错误信息int dirComd();/处理dir命令,显示目录int rdComd(); /删除目录int FindFilename(char Para2);/查找文件名struct Fi
10、leNode* CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int GetInput(char* buffer,unsigned int buffer_len);/获取输入3所使用的变量struct FileNode *cp, *tp, *root;/ *cp, *tp, *root是根目录节点char pathINPUT_LEN-COMMAND_LEN;/记录当前走过的路径char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;/para1数组存储输入的命令,para2数组存储输入
11、的文件名char filenameFILENAME_LEN,tmp; unsigned int i,j; 三 题目分析1文件系统采用二叉树型存储结构,结点结构如下:struct FileNode char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录、文件的识别标志(0为文件,1为目录)int i_nlink;/文件的链接数/int adr;/文件的地址struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟
12、的指针和指向后一个兄弟的指针.;2目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开3功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。删除文件:删除指定文件,不存在时给出出错信息。退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,
13、等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。四概要设计1在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。2文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。3. 数据结构与树结构。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树中每个分叉
14、点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结点称为该结点的双亲,结点的后趋结点称为该结点的孩子,同一结点的孩子之间互称兄弟。4文件目录结构采用多级目录结构。为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指5. 要有分解函数对输入的命令进行分解。以识别那部分是哪部分是命令,哪部分是路径和文件名。6. 最后要有执行函数。来执行输入的创建文件命令。五代码及流程开始初始化文件树获取键盘输入分解命令执行命令显示目录退出改变目录删除目录文件创建目录/文件图5-1 主函数流程
15、图2)edit()创建文件函数流程图图5-2 创建文件函数流程图开始检查命令格式获取文件名不存在该文件删除的是目录由用户共享该文件报错提示处理删除的是第一个孩子情况处理删除的不是第一个孩子情况结束图5-3 删除函数流程图4)ParseCommand()分解命令函数流程图 图5-4 分解命令函数流程图5)改变目录函数rdComd()图 5-5 改变目录函数流程图源代码:#include #include #include #include #include #define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11using
16、 namespace std;void Init();/初始化文件树int ParseCommand();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/执行命令int cdComd();/处理cd命令int editComd();/处理edit命令int delComd();/处理del命令int dirComd();/处理dir命令int mdComd();/处理md命令int rdComd();/处理rd命令int FindPath(char *ph);/寻找参数ph所指向的路径int FindFilename(char Para2);/从参数
17、Para2中找到要建立或删除的文件、目录名,并把指针只想其父亲结点struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int GetInput(char* buffer,unsigned int buffer_len);/获取输入int CheckCommand();/命令检查int GetDir(int begin,char *path,char *curDir);/获取路径struct FileNode *cp, *tp, *root;char pathINPUT_LEN-COMMAND_LEN
18、;/记录当前走过的路径char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;char curpathINPUT_LEN-COMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN;char filenameFILENAME_LEN,tmp;unsigned int i,j;/int i,j;struct FileNode /结点结构char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数struct FileNode *parent, *ch
19、ild;/指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟的指针和指向后一个兄弟的指针.;/创建结点struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink) struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode);/申请结点空间/相应内容赋初值 strcpy(node-filename,filename);node-isdir=isdir;n
20、ode-i_nlink=i_nlink;node-parent=NULL;node-child=NULL;node-sibling_prev=NULL;node-sibling_next=NULL; return node;/初始化文件树void Init() struct FileNode *binNode,*usrNode, *unixNode,*etcNode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;strcpy(path,/); /根目录写入当前路径/创建文件树的结点binNode=CreateFileNode(b
21、in,1,0);usrNode=CreateFileNode(usr,1,0);unixNode=CreateFileNode(unix,0,0);etcNode=CreateFileNode(etc,1,0);libNode=CreateFileNode(lib,1,0);userNode=CreateFileNode(user,1,0);binNode2=CreateFileNode(bin,1,0);liuNode=CreateFileNode(liu,1,0);sunNode=CreateFileNode(sun,1,0);ftiNode=CreateFileNode(fti,1,0)
22、;cp=tp=root=CreateFileNode(/,1,0);/结点相应内容赋值root-parent=NULL;root-child=binNode;root-sibling_prev=root-sibling_next=NULL;binNode-parent=root;binNode-child=NULL;binNode-sibling_prev=NULL;binNode-sibling_next=usrNode;usrNode-parent=NULL;usrNode-child=libNode;usrNode-sibling_prev=binNode;usrNode-sibling
23、_next=unixNode;unixNode-parent=NULL;unixNode-child=NULL;unixNode-sibling_prev=usrNode;unixNode-sibling_next=etcNode;etcNode-parent=NULL;etcNode-child=NULL;etcNode-sibling_prev=unixNode;etcNode-sibling_next=NULL;libNode-parent=usrNode;libNode-child=liuNode;libNode-sibling_prev=NULL;libNode-sibling_ne
24、xt=userNode;userNode-parent=NULL;userNode-child=NULL;userNode-sibling_prev=libNode;userNode-sibling_next=binNode2;binNode2-parent=NULL;binNode2-child=NULL;binNode2-sibling_prev=userNode;binNode2-sibling_next=NULL;liuNode-parent=libNode;liuNode-child=NULL;liuNode-sibling_prev=NULL;liuNode-sibling_nex
25、t=sunNode;sunNode-parent=NULL;sunNode-child=NULL;sunNode-sibling_prev=liuNode;sunNode-sibling_next=ftiNode;ftiNode-parent=NULL;ftiNode-child=NULL;ftiNode-sibling_prev=sunNode;ftiNode-sibling_next=NULL;/获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2) i=strlen(Para2)-1;j=0;while(Para2i!=/& i=0)filena
26、mej=Para2i;i-; j+;filenamej=0;/获得逆序的文件或目录名,存入filename中if(i0) Para2i+1=0;else Para2i=0;j-;for(i=0;i0) /查找路径int sign=FindPath(Para2);if(sign=0) return 0;return 1;/缓冲区安全输入子函数/如果输入超过buffer_len,则截取前buffer_len-1长度的输入,/buffer_len处字符用/0代替int GetInput(char* buffer,unsigned int buffer_len) unsigned int count=
27、0;while(countsibling_prev)cp=cp-sibling_prev;if(cp-parent) cp=cp-parent; /找到父亲结点else return 0; /对当前路径进行相应处理i=strlen(path);while(pathi!=/&i0) i-;if(i!=0)pathi=0;elsepathi+1=0;else FindPath(Para2);/查找路径return 1;/创建目录函数int mdComd() struct FileNode * temp,*tp;temp=CreateFileNode(,1,0);int sign;if(strlen
28、(Para2)=0) /参数不能为空printf(n命令格式有错误.n);return 0;if(strlen(Para2)20) /长度检查printf(n目录名过长n);return 0;/格式检查if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/)printf(目录名格式有错!n);/* 目录首字母可以为字母或数字或/*/return 0;sign=FindFilename(Para2);/获取目录名if(sign=0)return 0;if(cp-isdir!=1) /如当前指针指向的是文件,则报错printf(you cannot edi
29、t a directory in under a file!n);return 0;tp=CreateFileNode(filename,1,0); /创建目录结点,并插入到指定目录下if(cp-child=NULL)tp-parent=cp; tp-child=NULL; cp-child=tp; tp-sibling_prev=NULL; tp-sibling_next=NULL;else temp=cp;/用temp找到新结点插入处 temp=temp-child; while(temp-sibling_next ) /find the last sibing node temp=tem
30、p-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=1) printf(此目录名已存在n);/重名报错return 0; /找到了最后一个结点temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;return 1;/删除目录函数int rdComd() int sign;struct FileNode *temp;char cmd2;if(!CheckCommand() /命令检查return
31、 0;sign=FindFilename(Para2); /获取目录名if(sign=0) return 0;if(cp-child) /用temp指向要删除的结点temp=cp-child;while(temp-sibling_next & (strcmp(temp-filename,filename)!=0 | temp-isdir!=1)temp=temp-sibling_next;if(strcmp(temp-filename,filename)!=0) printf(不存在该目录!n);return 0;else printf(不存在该目录!n);return 0;if(temp-i
32、sdir!=1) /要删除的不能是文件printf(ERROR!该命令只能删除目录,不可删除文件!n);return 0;if(temp-child) /如仍有用户使用该目录,则不能删除printf(n该目录不为空,您确定要删除吗?Y/N!n); GetInput(cmd,2);if(strcmp(cmd,n)=0|strcmp(cmd,N)=0)return 0;/删除工作 if(temp-parent=NULL) /不是第一个孩子temp-sibling_prev-sibling_next=temp-sibling_next;if(temp-sibling_next)/处理是最后一个兄弟的
33、情况temp-sibling_next-sibling_prev=temp-sibling_prev; temp-sibling_prev=temp-sibling_next=NULL;/ifelse /第一个孩子if(temp-sibling_next)/处理是最后一个兄弟的情况temp-sibling_next-parent=temp-parent; temp-parent-child=temp-sibling_next;free(temp);return 1;/显示目录子函数int dirComd() if(strlen(Para2)0)int sign=FindPath(Para2);
34、 /查找路径if(sign=0) return 0; elseprintf(n%s, path);if(cp!=root)printf( %sn,.);if(cp-child=NULL) /指定目录为空return 0; tp=cp;tp=tp-child; /指定目录不为空,显示其所有子目录及文件名while(tp) if(tp-isdir)printf( %sn,tp-filename);elseprintf( %sn,tp-filename);tp=tp-sibling_next;return 0;/创建文件函数int editComd() struct FileNode * temp=
35、CreateFileNode(,0,0);int sign;struct FileNode *tp;if(strlen(Para2)=0) /路径不能为空printf(n命令格式有错误.n);return 0;if(strlen(Para2)20) /长度检查printf(n文件名过长n);return 0;/格式检查if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/)printf(文件名格式有错!n);/* 文件首字母可以为字母或数字或_或/或回车*/return 0;sign=FindFilename(Para2);/获取文件名if(sign=
36、0)return 0;if(cp-isdir!=1) /如当前指针指向的是文件,则报错printf(you cannot edit a file in under a file!n);return 0;/创建文件结点,并插入到指定目录下tp=CreateFileNode(,1,0);strcpy(tp-filename,filename);tp-isdir=0;tp-i_nlink=0;if(cp-child=NULL)tp-parent=cp; tp-child=NULL; cp-child=tp; tp-sibling_prev=NULL; tp-sibling_next=NULL;els
37、e temp=cp; temp=temp-child;/用temp找到新结点插入处 while(temp-sibling_next ) /find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=0) printf(此文件名已存在,请重新输入n); /重名报错 return 0;/找到了最后一个结点temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_
38、next=NULL;return 1;/删除文件子函数int delComd() int sign;struct FileNode *temp;if(strlen(Para2)=0) /参数不能为空printf(n命令格式有错误.n);return 0;sign=FindFilename(Para2); /获取文件名if(sign=0) return 0;if(cp-child) /用temp指向要删除的结点temp=cp-child;while(temp-sibling_next&(strcmp(temp-filename,filename)!=0|temp-isdir!=0)temp=te
39、mp-sibling_next;if(strcmp(temp-filename,filename)!=0) printf(不存在该文件!n);return 0;else printf(不存在该文件!n);return 0;if(temp-isdir!=0) /要删除的不能是目录printf(ERROR!该命令只能删除文件,不可删除目录!n);return 0;if(temp-i_nlink!=0) /如仍有用户使用该文件,则不能删除printf(还有用户共享了该文件,不能删除!n);return 0;/删除工作 if(temp-parent=NULL) /不是第一个孩子temp-sibling_prev-sibling_next=temp-sibling_next;if(temp-sibling_next)/处理是最后一个兄弟的情况temp-sibling_next-sibling_prev=temp-sibling_prev; temp-sibling_pre