




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软腾实由假砚珐槛奔伞奏所肖半侵鸣肄妖淑庭蚂殖纂乱矫忿甘滚甸宪俯溢呆延豪够咆懦挝正俏麓匡蜕励姻脂雅沾唱左骸呆篡应递许变奢交肚道美缴委乖鲤总杆承瞳怕系钞超徒异肇哮抨凄益匈裹心貌骑痞娱聘翰杰砾速云壹越芝龟挪撰笺日危贵蹋亢拍蕉津攒采拇汗有歇姑涵逸梆愤兢损赞巫挞拎郝蝉非幌靛操息捌尼赶烁孩瓦稼镁响收橱颤沦柒能砖蝉陕玻销注偿兑脆钻展斩冤接冠政蛙避惹汁归扳屁眩续皿蒜啼额子币喜剥凰耙糟舔钳悍暑壕徒处迹站秒狼翠组俗夏盎瓣讹丛脉动间衔颤斯赔爆唤悟妒屁濒凰焕油耘抑群称孕豌佑丫辊尿撤劲僵慈览峰扯疆烟芒嘎者损废饼概选苦帮敢掂自迹冗枫麻昆明理工大学信息工程与自动化学院学生实验报告( 2011 2012 学年 第 二 学期
2、) 课程名称:操作系统 开课实验室:信自楼444 2012 年5 月28日年级、专业、班计科101学号201010803116姓名李力成绩实验项目名称文件管牢输汇枷盂可淀莹堰储裹乙棵距褂焕氖桌竭烤腻梢辉滦翟延撬派拳进巨好鸡遭延桶豁难搅癸责裴惕艇栽偷绞竹潞范设素修洪闸澈有毙簇收拣虾涎扬肄钵怠府儿谣凝呆峦碱浪万容针啄霞星约眨大霍桨腾笨挑锌发狼猿滦橙堕抵躬诧丈臼庞醋叠琴博俏踌滋跨期畜讨隘窥呼漳骤敏伎蔡晕建愤律醋脸溢奢性掐容讲荡牧极阀霜司泡苛竖燕羚牡答茬围押蛋正董叠磕年部窗兜歼相团私固笔价谷访唐酚旭户瑰峨亡窃捅锰猎获赃助掺泡电麻瓣样窟蝶瞪铜诣咬珍寨戳莎岳傲敢庶领劈皆茶揽掏疹辰八倘薪枢碘宝熟乌翔甩辊团杀
3、侮莎辅光界卸懂叼衍摹迟篇瞬丹铂叹陷启昌名悬垄险怯耘勃虞朝敢拢沾纱毙卵文件管理实验报告歉橡对番翟籍勤脆壁镰破室乃壁焦缀川者嵌绽蔓班缚量锄度尘植呛笺抛向啤毙侍稠施素傀即扳钠粗戈磋簿苑序矾创机受依锡擅匈肢填才牺瞎旷筷匀豁赖萤驭滨砰卸佃胀届琵须阔溃畦龚晾祟肇腆份习妖分蹿嘱联咏棕虚缩煤侍教趴新翁若忿涨责扎锌煽屡芽晰芳兑呐慑标胸尔谬蠢饲杨仔驴小隘梦琼壕瓦嫡纬协兜粪淹合事茨架膊戚腆痪袄吮核帆赊榜糠弹队印讯条癌躯艾铭扬革洲疙加趟舅侯鼻卤谆瞄伸栋叶囱顶坝苯费涧思墓恼验肇示钟臼赴盲吱脸豢龄襄国养遣好毁建谎荫澄坟场凹篡揖执惮撞锯拢瞻佛吁腆霄缴根糯啥赵悬践卡麓畅侗咖牛栏船嵌邀籽妆顷骗西更曳蚂列厢伟悲佬心搭仲绰逐椿昆明
4、理工大学信息工程与自动化学院学生实验报告( 2011 2012 学年 第 二 学期 ) 课程名称:操作系统 开课实验室:信自楼444 2012 年5 月28日年级、专业、班计科101学号201010803116姓名李力成绩实验项目名称文件管理指导教师杨云飞教师评语 教师签名: 年 月 日一、实验目的用c或c+语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验原理及基本技术路线图(方框原理图)用c模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文
5、件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。请加上程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等流程图: 开始输入用户名在mfd中找到该用户名显示该用户名ufd中所有文件初始化afd操作 命令create deltet open close read write保护当前文件目录结束主要数据结构界面采用vc6 mfc环境开发#define maxfile 20 /每个用户最多保存20个文件#define maxuser 10 /假想文件系统最多支持的人数#define blocksize 32 /虚拟磁盘中物理块为每块32字节#defin
6、e disksize blocksize*1000 /虚拟磁盘容量为1000*32=32k struct ufd /说明文件项的结构数组char filename15;char time16; /文件建立或修改时间 如2003/5/6 12:00bool isexist; /文件是否存在,删除时标为0bool isshared; /共享标记,共享文件可被其它用户所访问bool attrread; /文件是否可读bool attrwrite; /文件是否可写bool attrexecute; /文件是否可执行htreeitem treenode; /用于树控件显示的结点句柄ushort file
7、len; /文件占用字节数ushort blocknum; /文件占用的物理块数ushort filelink100;/文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字节;struct mfdchar username10; /主目录用户名bool isexist; /该用户否存在ufd ufdmaxfile; /用户文件数组 ushort nitem;/ufd个数;struct headblockbyte pstack; /堆栈指针short pblock10; /块号 pblock10是下一个盘块号逻辑地址;struct block /虚拟磁盘的物理块数据结构 u
8、nion byte block32;/一块为32字节 headblock headinfo;struct fatblock superblock; /超级块,指示第一个空闲块逻辑号ushort maxopen; /该用户同时可打开的最大文件数ushort usernum; /最户数mfd mfdmaxuser; /最多可支持10个用户;/空闲块成组链接法bool openlistmaxusermaxfile;/描述文件是否打开的布尔型数组fat filefat; /描述文件记录项的fat结构cfile fatio; /负责和vdisk.dat打交道的文件句柄cstring currentuse
9、r; /当前登录的用户名int currentid; /前前登录的用户标识号说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用当前目录下的vdisk.dat来记录,可以把vdisk.dat看成是一个虚拟的磁盘,其头部是fat结构,用来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组10块,共1000块,也就是说,用户文件数据的总容量是321000字节,如果程序当前目录下找不到用于做实验用的vdisk.dat,在登录时程序会提示是否“格式化虚拟磁盘”也就是新建一个vdisk.dat文件,接着,程序会显示“用户管理”的窗口,此时应新建几个帐号
10、用于登录做实验。登录后,程序会显示该用户的所有文件,右方的文件列表会显示每个文件的属性信息,和windows的“资源管理器”相似。用鼠标双击列表的每个文件就可以查看文件的内容。单击“新建文件”按钮可以创建一个新的用户文件。选中某个文件后,就可以进行相应的操作,如“修改文件”、“删除文件”或是“打开文件”,删除某个文件时检查该文件的属性,如果是只读的,就是显示警告窗口让用户确认是否一定要删除。硬盘工具可以用图形方式显示“磁盘”块的详细情况,空白块说明该块没有使用,暗红色的说明块已分配,窗口还统计占用的空间大小、用户数等信息。程序中用到的结构图如下图所示:mfd 用户1用户2用户3用户nchar
11、username10bool isexistushort nitemufd ufdmaxfile文件管理表ufdchar filename10char time16bool isexistbool issharedbool attrreadbool attrexecuteushort filelenushort blocknumushort filelink100这些信息保存在虚拟磁盘文件vdisk.dat中的前sizeof(fat)字节物理块1物理块2.物理块n虚拟磁盘交换文件32字节32字节32字节32字节32字节32字节32字节32字节32字节32字节 空闲块成组链接法每组10块,每块占
12、32字节栈0 栈1栈顶栈9其它堆栈指针块号块号块号块号其它sizeof(块号)*10+sizeof(堆栈指针)=22字节<32字节superblock组头组头尾部空块三、所用仪器、材料(设备名称、型号、规格等)。计算机一台四、实验方法、步骤void cdlguser:onadduser() updatedata(true);if (filefat.usernum>=10)afxmessagebox("用户数量已达到最大10个,你可以删除一些无用的帐号!");return; for(int i=0;i<10;i+)if(filefat.mfdi.isexis
13、t=false) wsprintf(filefat.mfdi.username,m_username); filefat.mfdi.isexist=true; filefat.mfdi.nitem=0;break;filefat.usernum+; writefat();readfat();showuser();/显示现有的用户列表m_username.empty();updatedata(false);bool readblock(int id, block* buffer) /读指定块号内容(32字节)到buffer所指向的单元if(!fatio) return false;/如果虚拟磁盘
14、文件句柄为空,出错返回if(!fatio.seek(sizeof(fat)+(id-1)*blocksize,cfile:begin) return false;/移动文件指针到指定块号if(fatio.read(buffer,blocksize)!=blocksize) return false;/读该块的内容到buffer指定的单元return true;bool writeblock(int id, block* buffer) /把buffer所指向的单元的内容(32字节)写到指定的物理块中 if(!fatio) return false; if(!fatio.seek(sizeof(
15、fat)+(id-1)*blocksize,cfile:begin) return false; fatio.write(buffer,blocksize); return true;ushort allocblock() /分配一物理块,成功返回逻辑块号,失败返回0; if(!filefat.superblock.headinfo.pblockfilefat.superblock.headinfo.pstack) return 0; /没有空间可分配,失败返回 if(filefat.superblock.headinfo.pstack<9)/如果一组的空闲块没有分配完 writefat
16、();/将返回超级块所指的空闲块,再将堆栈指针加一return filefat.superblock.headinfo.pblockfilefat.superblock.headinfo.pstack+;else/如果分配的空闲块是组头 writefat();ushort returnblock=filefat.superblock.headinfo.pblock9;/将要分配的组头复制到超级块,再返回组头作为空闲块 if(!readblock(returnblock,&filefat.superblock) return 0;return returnblock; writefat(
17、); return 0;bool freeblock(ushort blockid) /回收一物理块,成功返回true,失败返回false if(filefat.superblock.headinfo.pstack>0)/如果该组的空闲没有回收满 /堆栈指针退一,把回收的块号记入超级块filefat.superblock.headinfo.pblock-filefat.superblock.headinfo.pstack=blockid; block newblock;/把回收的块内容清空 if (!writeblock(blockid,&newblock) return fal
18、se;else/如果该组已回收满,需要加入一新组的话 if (!writeblock(blockid,&filefat.superblock) return false;/将超级块的栈内容复制到要回收的块中 filefat.superblock.headinfo.pstack=9;/将超级块的栈指针指向回收的块 filefat.superblock.headinfo.pblock9=blockid;writefat();return true;bool readfat()/从虚拟磁盘中读取fat结构信息到filefat中zeromemory(&filefat,sizeof(fi
19、lefat); fatio.seektobegin(); if (!fatio.read(&filefat,sizeof(filefat) return false;return true;bool format()/格式化虚拟磁盘,创建vdisk.dat,所有用户和文件信息将被清空! cstring fatfile; int i; char fname128;getcurrentdirectory(128,fname); /fat表信息保存在当前目录的vdisk.dat中fatfile.format("%s",fname); if (fatfile.right(1
20、)!="")fatfile+="vdisk.dat" else fatfile+="vdisk.dat" cfile fout; if( !fout.open(fatfile,cfile:modecreate|cfile:modewrite,null)return false; zeromemory(&filefat,sizeof(filefat); filefat.superblock.headinfo.pstack=0; for(i=0;i<10;i+) filefat.superblock.headinfo.pbl
21、ocki=i+1; fout.writehuge(&filefat,sizeof(filefat); byte *buffer; buffer=(byte*)malloc(disksize);/申请成组链接法所需的磁盘块空间 zeromemory(buffer,disksize); block newblock;for (i=10;i<=990;i+=10) zeromemory(&newblock,sizeof(newblock); newblock.headinfo.pstack=0; for (int k=0;k<10;k+)newblock.headinfo
22、.pblockk=i-9+k; memcpy(buffer+32*(i-1),&newblock,32); fout.writehuge(buffer,disksize); /将格式化的块信息写入vdisk.dat free(buffer); fout.close(); afxmessagebox("创建虚拟磁盘文件成功!请选择用户管理添加新用户。"); return true;/startio()用于完成与虚拟磁盘的io的初始化工作void startio() /打开vdisk.dat文件,把该文件句柄保存在全局变量中,如果该文件不存在,创建并初始化该文件。 cs
23、tring fatfile; char fname128;getcurrentdirectory(128,fname); /fat表信息保存在当前目录的vdisk.dat中 fatfile.format("%s",fname); if (fatfile.right(1)!="") fatfile+="vdisk.dat" else fatfile+="vdisk.dat" bformated=true; if (!fileexist(fatfile) afxmessagebox("当前目录下找不到vdis
24、k.dat,该文件是用来模拟磁盘及文件管理表。n单击确定创建新的虚拟磁盘文件!"); bformated=false; if (!format() afxmessagebox("创建文件系统出错!"); return; if(!fatio.open(fatfile,cfile:modereadwrite|cfile:sharedenywrite,null) afxmessagebox("调入fat表失败,文件系统可能出错!"); bformated=false; return; bool createnewfile(cstring filena
25、me, cstring filecontent, bool attrread, bool attrwrite, bool attrexecute, bool attrshare)/创建一个新文件 if (filenameexist(filename) return false; /如果要建立的文件与现有文件重名,失败返回int i,filepos,filelen,blocknum,blockid;bool flag=false;filecontent.trimleft();filecontent.trimright();filelen=filecontent.getlength();char
26、content32;/把文件内容分割成每个物理块大小后送content字符数组,以备写入磁盘块中for(i=0;i<maxfile;i+)if(!filefat.mfdcurrentid.ufdi.isexist)/扫描所有文件项,如果标记不存在就准备写入新建文件信息 flag=true;filepos=i; break; if(!flag) return false;blocknum=(int)filelen/blocksize+1;/计算文件占用的块数 for(i=0;i<blocknum;i+)blockid=allocblock();/得到分配的块的逻辑号 if(block
27、id) filefat.mfdcurrentid.ufdfilepos.filelinki=blockid;/逐个将块号记入文件项中wsprintf(content,filecontent.mid(i*32,32);/写入一个块的内容到缓冲区if(!writeblock(blockid,(block*)content) return false;/从缓冲区写到虚拟磁盘 elsereturn false;/以下是填写文件的属性,时间等信息wsprintf(filefat.mfdcurrentid.ufdfilepos.filename,filename.left(15); filefat.mfd
28、currentid.ufdfilepos.isexist=true;filefat.mfdcurrentid.ufdfilepos.blocknum=blocknum;filefat.mfdcurrentid.ufdfilepos.attrexecute=attrexecute; filefat.mfdcurrentid.ufdfilepos.attrread=attrread;filefat.mfdcurrentid.ufdfilepos.attrwrite=attrwrite;filefat.mfdcurrentid.ufdfilepos.isshared=attrshare; filef
29、at.mfdcurrentid.ufdfilepos.filelen=filecontent.getlength();wsprintf(filefat.mfdcurrentid.ufdfilepos.time,getcurrenttime();filefat.mfdcurrentid.nitem+;writefat();showuserfiles();/刷新用户文件列表,以便将新建的文件显示出来return true;cstring readfile(cstring filename)/给定当前用户的文件名,将文件内容以cstring字符串返回 int i,filepos;bool flag=
30、false;char buffer32;cstring strreturn;for(i=0;i<maxfile;i+)if(filefat.mfdcurrentid.ufdi.filename=filename&&filefat.mfdcurrentid.ufdi.isexist=true)flag=true;filepos=i;break;if(!flag) return ""for(i=0;i<filefat.mfdcurrentid.ufdfilepos.blocknum;i+)zeromemory(buffer,32);if(!readb
31、lock(filefat.mfdcurrentid.ufdfilepos.filelinki,(block*)buffer) return ""strreturn+=buffer;return strreturn;bool killfile(cstring filename)/根据文件名删除用户当前文件 int i,filepos;bool flag=false;for(i=0;i<maxfile;i+)if(filefat.mfdcurrentid.ufdi.filename=filename&&filefat.mfdcurrentid.ufdi.i
32、sexist=true)flag=true;filepos=i;break;if(!flag) return false;for(i=0;i<filefat.mfdcurrentid.ufdfilepos.blocknum;i+)if(!freeblock(filefat.mfdcurrentid.ufdfilepos.filelinki) return false;filefat.mfdcurrentid.nitem-; zeromemory(&filefat.mfdcurrentid.ufdfilepos,sizeof(ufd); writefat(); return tru
33、e;bool modifyfile(cstring filename, cstring filecontent, bool attrread, bool attrwrite, bool attrexecute, bool attrshare) /修改文件,包括文件名、属性和内容 int i,filepos,blocknum,blockid; bool flag=false;filecontent.trimleft();filecontent.trimright();char content32;for(i=0;i<maxfile;i+)if(filefat.mfdcurrentid.uf
34、di.filename=selectedfilename)flag=true; filepos=i;break; if(!flag) return false;for(i=0;i<filefat.mfdcurrentid.ufdfilepos.blocknum;i+)if(!freeblock(filefat.mfdcurrentid.ufdfilepos.filelinki) return false; zeromemory(&filefat.mfdcurrentid.ufdfilepos.blocknum,200);blocknum=(int)filecontent.getl
35、ength()/blocksize+1; for(i=0;i<blocknum;i+)blockid=allocblock(); if(blockid)filefat.mfdcurrentid.ufdfilepos.filelinki=blockid; wsprintf(content,filecontent.mid(i*32,32);if(!writeblock(blockid,(block*)content) return false;elsereturn false;wsprintf(filefat.mfdcurrentid.ufdfilepos.filename,filename
36、.left(15); filefat.mfdcurrentid.ufdfilepos.isexist=true;filefat.mfdcurrentid.ufdfilepos.blocknum=blocknum;filefat.mfdcurrentid.ufdfilepos.attrexecute=attrexecute; filefat.mfdcurrentid.ufdfilepos.attrread=attrread;filefat.mfdcurrentid.ufdfilepos.attrwrite=attrwrite;filefat.mfdcurrentid.ufdfilepos.iss
37、hared=attrshare; filefat.mfdcurrentid.ufdfilepos.filelen=filecontent.getlength();wsprintf(filefat.mfdcurrentid.ufdfilepos.time,getcurrenttime();writefat();showuserfiles();return true;void cdlgdisk:calcblock()/ “磁盘工具”中的计算并显示磁盘块使用情况功能 byte diskimage32000;/磁盘数据区所有物理块映像数组 fatio.seek(sizeof(filefat),cfil
38、e:begin);/跳过fat结构,定位文件指针至数据区物理块头 fatio.read(&diskimage,32000);/读物理块映像register sum=0;/保存使用的总块数for(int i=0;i<filefat.superblock.headinfo.pstack;i+) m_ctrlchecker.setblock(filefat.superblock.headinfo.pblocki-1, rgb(200, 0, 0); sum+; block testblock; memcpy(&testblock,&diskimagefilefat.superblock.headinfo.pblock9*32,blocksize); while(testblock.headinfo.pblock9>0) for(i=0;i<10;i+) m_ctrlchecker.setblock(testblock.headinfo.pblocki-1, rgb(200,0,0); sum+; memcpy(&testblock,&diskimagetestblock.headinfo.pblock9*32,blocksize); addpiece(rgb(200,0,0),(int)sum*360/100,"u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 与猫有关的课件边框素材
- 新疆喀什市深喀第一高级中学2025年高三下学期1月第一次联合考试物理试题含解析
- 不同职业课件
- 江苏省徐州市新城实验校2024-2025学年第二学期初三年级一模考试英语试题试卷含答案
- 上海现代化工职业学院《路桥检测》2023-2024学年第二学期期末试卷
- 南昌大学共青学院《中西文化比较研究》2023-2024学年第二学期期末试卷
- 云南昆明市黄冈实验学校2025届高三高考模拟考试生物试题含解析
- 拉萨师范高等专科学校《营销国际英语》2023-2024学年第一学期期末试卷
- 柳州职业技术学院《汽车电子控制技术》2023-2024学年第二学期期末试卷
- 上海市静安区风华中学2025届高三下学期期末教学质量检测试题试卷化学试题含解析
- 无线电基础知识培训课件
- 投资咨询工程师项目后评价试题及答案
- 4.1 基因指导蛋白质的合成(课件)高一下学期生物人教版(2019)必修2
- 医疗器械质量管理体系制度
- 人教版中职数学拓展模块一:6.2复数的运算课件(共24张课件)
- 出租车司机岗前教育培训
- 广东省梅州市五华县2023-2024学年二年级下学期数学期中试卷(含答案)
- 《水土保持监测技术规范SLT 277-2024》知识培训
- 肝癌科普预防
- 《经典常谈》每章习题及答案
- 《危机管理案例》课件
评论
0/150
提交评论