版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、昆明理工大学信息工程与自动化学院学生实验报告(2011 2012学年第学期)年级、专业、班计科101学号201010803116姓名李力成绩实验项目名称文件管理指导教师杨云飞开课实验室:信自楼444课程名称:操作系统年5月28日2012教师签名: 年 月、实验目的用C或C+语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验原理及基本技术路线图(方框原理图)用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复
2、 制、移动等功能,并对文件有一定的存取权限控制。请加上程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等流程图:C开始)I输入用户名I在MFD中找该用户名显示该用户名 UFD中所有文件I初始化AFD I*REATE I DELTET OpEN CLOSE rRAd , WR|TEIFIF保护当前文件目录结束主要数据结构界面采用VC6 MFC环境开发每个用户最多保存 20个文件 假想文件系统最多支持的人数 虚拟磁盘中物理块为每块#defi ne MAXFILE 20 II#defi ne MAXUSER 10 II#defi ne BLOCKSIZE 32 /#defi ne D
3、ISKSIZE BL0CKSIZE*1000 II32字节虚拟磁盘容量为 1000*32=32Kstruct UFD II说明文件项的结构数组char FileName15;char Time16; bool IsExist;/节;struct MFDbool IsShared;bool AttrRead;bool AttrWrite;/bool AttrExecute; IIHTREEITEM treeNode; IIUSHORT FileLe n; IIUSHORT BlockNum; IIUSHORT FileL in k100;II文件建立或修改时间女n 2003/5/6 12:00文
4、件是否存在,删除时标为0共享标记,共享文件可被其它用户所访问文件是否可读文件是否可写文件是否可执行用于树控件显示的结点句柄文件占用字节数文件占用的物理块数文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字char UserName10; II bool IsExist; IIUFD ufdMAXFILE; II USHORT nltem;/UFD主目录用户名 该用户否存在用户文件数组 个数;struct HEADBLOCKBYTE p Stack; IISHORT p Block10;/堆栈指针块号P Block10是下一个盘块号逻辑地址;struct BLOCK II
5、虚拟磁盘的物理块数据结构unionBYTE block32;HEADBLOCK Headl nfo;/ 一块为32字节;struct FATBLOCK Sup erBlock; USHORT Max Open; USHORT UserNum;/MFD MfdMAXUSER; /超级块,指示第一个空闲块逻辑号 该用户同时可打开的最大文件数 最户数最多可支持10个用户;/空闲块成组链接法bool Open ListMAXUSERMAXFILE; FAT FileFAT;CFile FATIO;CStri ng Curre ntUser;Int Curre ntID;/描述文件是否打开的布尔型数组描
6、述文件记录项的 FAT结构负责和VDISK.DAT打交道的文件句柄 当前登录的用户名前前登录的用户标识号说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用当前目录下的 VDISK.DAT来记录,可以把 VDISK.DAT看成是一个虚拟的磁盘,其头部是FAT结构,用来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组10块,共1000块,也就是说,用户文件数据的总容量是32 * 1000字节,如果程序当前目录下找不到用于做实验用的VDISK.DAT,在登录时程序会提示是否 “格式化虚拟磁盘”也就是新建一个VDISK.DAT文件,接着,程序会显
7、示“用户管理”的窗口,此时应新建几个帐号用于登录做实验。登录后,程序会显示该用户的所有文件,右方的文件列表会显示每个文件的属性信息,和WINDOW的 “资源管理器”相似。用鼠标双击列表的每个文件就可以查看文件的内容。单击“新建文件”按钮可以创建一个新的用 户文件。选中某个文件后,就可以进行相应的操作,如“修改文件”、“删除文件”或是“打开文件”,删除某个文件时检查该文件的属性,如果是只读的,就是显示警告窗口让用户确认是否一定要删除。硬盘工具可以用图形方式显示“磁盘”块的详细情况,空白块说明该块没有使用,暗红色的说明块已分配, 窗口还统计占用的空间大小、用户数等信息。程序中用到的结构图如下图所示
8、:MFDchar UserName10bool IsExist文件管理表USHORT nitemUFDUFD ufdMAXFILEchar FileName10用户1用户2用户3用户nchar Time16bool IsExistbool IsSharedbool AttrRead物理块1物理块2 物理块nJb这些信息保存在虚拟磁盘文件VDISK.DAT 中的前 sizeof(FAT)字节bool AttrExecuteUSHORT FileLenUSHORT BlockNumUSHORT FileLink10032字节32字节32字节32字节32字节32字节32字节32字节32字节32字节虚
9、拟磁盘交换文件T每组10块,每块占32字节0 栈J.栈顶F栈9其它堆栈指针块号1块号11块号11块号其它sizeof(块号)*10+sizeof(堆栈指针)=22字节32字节空闲块成组链接法三、所用仪器、材料(设备名称、型号、规格等)计算机一台四、实验方法、步骤void CDlgUser:OnAddUser()UpdateData(true);if (FileFAT.UserNum=10)AfxMessageBox( 用户数量已达到最大 10 个,你可以删除一些无用的帐号 !); return;for(int i=0;i10;i+)if(FileFAT.Mfdi.IsExist=false)w
10、sprintf(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;if(!FATIO.Se
11、ek(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) if(!FATIO) return false;if(!FATIO.Seek(sizeof(FAT)+(id-1)*BLOCKSIZE,CFile:begin
12、) return false; FATIO.Write(buffer,BLOCKSIZE);return true;USHORT AllocBlock()/ 把 buffer 所指向的单元的内容 (32 字节) 写到指定的物理块中/ 分配一物理块 , 成功返回逻辑块号,失败返回0;if(!FileFAT.SuperBlock.HeadInfo.pBlockFileFAT.SuperBlock.HeadInfo.pStack) return 0;/ 没有空间可分配,失败返回如果一组的空闲块没有分配完if(FileFAT.SuperBlock.HeadInfo.pStack0)/ /回收一物理块,
13、成功返回TRUE失败返回FALSE如果该组的空闲没有回收满堆栈指针退一,把回收的块号记入超级块FileFAT.SuperBlock.HeadInfo.pBlock-FileFAT.SuperBlock.HeadInfo.pStack=BlockID; BLOCK newBlock;/ 把回收的块内容清空if (!WriteBlock(BlockID,&newBlock) return false;else/如果该组已回收满,需要加入一新组的话if (!WriteBlock(BlockID,&FileFAT.SuperBlock) return false;/FileFAT.SuperBlock
14、.HeadInfo.pStack=9;/FileFAT.SuperBlock.HeadInfo.pBlock9=BlockID;将超级块的栈内容复制到要回收的块中将超级块的栈指针指向回收的块WriteFAT(); return true;bool ReadFAT()ZeroMemory(&FileFAT,sizeof(FileFAT);FATIO.SeekToBegin();if (!FATIO.Read(&FileFAT,sizeof(FileFAT) return false; return true;bool Format()CString FATFile;int i;char fnam
15、e128;GetCurrentDirectory(128,fname); /FATFATFile.Format(%s,fname);/从虚拟磁盘中读取 FAT结构信息到FileFAT中/ 格式化虚拟磁盘,创建 VDISK.DAT, 所有用户和文件信息将被清空!表信息保存在当前目录的 VDISK.DAT 中if (FATFile.Right(1)!=)FATFile+=VDISK.DAT;elseFATFile+=VDISK.DAT;CFile fout;if( !fout.Open(FATFile,CFile:modeCreate|CFile:modeWrite,NULL) return fa
16、lse;ZeroMemory(&FileFAT,sizeof(FileFAT);FileFAT.SuperBlock.HeadInfo.pStack=0; for(i=0;i10;i+)FileFAT.SuperBlock.HeadInfo.pBlocki=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)
17、ZeroMemory(&newBlock,sizeof(newBlock); newBlock.HeadInfo.pStack=0; for (int k=0;k10;k+) newBlock.HeadInfo.pBlockk=i-9+k; memcpy(Buffer+32*(i-1),&newBlock,32);将格式化的块信息写入 VDISK.DATfout.WriteHuge(Buffer,DISKSIZE); /free(Buffer);fout.Close();AfxMessageBox( 创建虚拟磁盘文件成功 ! 请选择用户管理添加新用户。 );return true;/Start
18、IO() 用于完成与虚拟磁盘的 IO 的初始化工作void StartIO() / 打开 VDISK.DAT 文件,把该文件句柄保存在全局变量中,如果该文件不存在,创建并初始化该文件。 CString FATFile; char fname128;表信息保存在当前目录的 VDISK.DAT 中GetCurrentDirectory(128,fname); /FATFATFile.Format(%s,fname);if (FATFile.Right(1)!=)FATFile+=VDISK.DAT;elseFATFile+=VDISK.DAT;bFormated=true;if (!FileExi
19、st(FATFile)n 单击确定创建新的AfxMessageBox( 当前目录下找不到 VDISK.DAT, 该文件是用来模拟磁盘及文件管理表。 虚拟磁盘文件 !);bFormated=false;if (!Format()AfxMessageBox( 创建文件系统出错 !); return;if(!FATIO.Open(FATFile,CFile:modeReadWrite|CFile:shareDenyWrite,NULL) 调入 FAT 表失败,文件系统可能出错 !);AfxMessageBox( bFormated=false;return;bool CreateNewFile(CS
20、tring FileName, 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.Get
21、Length();content 字符数组,以备写入磁盘块中char Content32;/ 把文件内容分割成每个物理块大小后送 for(i=0;iMAXFILE;i+)扫描所有文件项, 如果标记不存在就准备写入新建文件信息 if(!FileFAT.MfdCurrentID.ufdi.IsExist)/flag=true;FilePos=i;break; if(!flag) return false;BlockNum=(int)FileLen/BLOCKSIZE+1;/ 计算文件占用的块数 for(i=0;iBlockNum;i+)得到分配的块的逻辑号BlockID=AllocBlock();
22、/ if(BlockID)FileFAT.MfdCurrentID.ufdFilePos.FileLinki=BlockID;/ 逐个将块号记入文件项中 wsprintf(Content,FileContent.Mid(i*32,32);/ 写入一个块的内容到缓冲区 if(!WriteBlock(BlockID,(BLOCK*)Content) return false;/从缓冲区写到虚拟磁盘else/return false;以下是填写文件的属性,时间等信息wsprintf(FileFAT.MfdCurrentID.ufdFilePos.FileName,FileName.Left(15);
23、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.IsShared=AttrSh
24、are;FileFAT.MfdCurrentID.ufdFilePos.FileLen=FileContent.GetLength();wsprintf(FileFAT.MfdCurrentID.ufdFilePos.Time,GetCurrentTime();FileFAT.MfdCurrentID.nItem+;WriteFAT();ShowUserFiles();/ 刷新用户文件列表,以便将新建的文件显示出来 return true;CString ReadFile(CString FileName)int i,FilePos;/ 给定当前用户的文件名,将文件内容以Cstring 字符串
25、返回bool flag=false;char Buffer32;CString strReturn; for(i=0;iMAXFILE;i+) if(FileFAT.MfdCurrentID.ufdi.FileName=FileName&FileFAT.MfdCurrentID.ufdi.IsExist=tr ue)flag=true;FilePos=i;break;if(!flag) return ; for(i=0;iFileFAT.MfdCurrentID.ufdFilePos.BlockNum;i+)ZeroMemory(Buffer,32); if(!ReadBlock(FileFA
26、T.MfdCurrentID.ufdFilePos.FileLinki,(BLOCK*)Buffer) return ; strReturn+=Buffer;return strReturn;bool KillFile(CString FileName)/int i,FilePos; bool flag=false; for(i=0;iMAXFILE;i+) if(FileFAT.MfdCurrentID.ufdi.FileName=FileName&FileFAT.MfdCurrentID.ufdi.IsExist=true) 根据文件名删除用户当前文件flag=true;FilePos=i
27、;break; if(!flag) return false;for(i=0;iFileFAT.MfdCurrentID.ufdFilePos.BlockNum;i+)if(!FreeBlock(FileFAT.MfdCurrentID.ufdFilePos.FileLinki) return false;FileFAT.MfdCurrentID.nItem-;ZeroMemory(&FileFAT.MfdCurrentID.ufdFilePos,sizeof(UFD); WriteFAT();return true;bool ModifyFile(CString FileName, CStr
28、ing 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;iMAXFILE;i+)if(FileFAT.MfdCurrentID.ufdi.FileName=SelectedFileName)flag=true; FileP
29、os=i;break;if(!flag) return false;for(i=0;iFileFAT.MfdCurrentID.ufdFilePos.BlockNum;i+) if(!FreeBlock(FileFAT.MfdCurrentID.ufdFilePos.FileLinki) return false;ZeroMemory(&FileFAT.MfdCurrentID.ufdFilePos.BlockNum,200);BlockNum=(int)FileContent.GetLength()/BLOCKSIZE+1; for(i=0;iBlockNum;i+)BlockID=Allo
30、cBlock();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.Left(15);FileFAT.MfdCurrentID.ufdFilePos.IsExist=true;File
31、FAT.MfdCurrentID.ufdFilePos.BlockNum=BlockNum;FileFAT.MfdCurrentID.ufdFilePos.AttrExecute=AttrExecute;FileFAT.MfdCurrentID.ufdFilePos.AttrRead=AttrRead;FileFAT.MfdCurrentID.ufdFilePos.AttrWrite=AttrWrite;FileFAT.MfdCurrentID.ufdFilePos.IsShared=AttrShare;FileFAT.MfdCurrentID.ufdFilePos.FileLen=FileCont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大数据就业指导参考模版
- 2026 六年级下册音乐《学唱友谊地久天长》课件
- SYB与就业指导师认证
- 临潼地区就业服务
- 音像行业深度洞察-竞争格局与市场趋势分析
- 迈向未来的交通:电动汽车的发展与前景-电动汽车制造商的销售经理
- 老板别再逼员工假笑了
- 2026 四年级下册道法《家乡的小河流》课件
- 2026道德与法治六年级活动园 友善待人
- 2026年消防设施操作员(中级监控)真题题库高频重点提升【全优】附答案详解
- 2024年四川嘉州金石能源有限公司招聘笔试参考题库附带答案详解
- ISO 15609-1 2019 金属材料焊接工艺规程和评定-焊接工艺规程-电弧焊(中文版)
- 公寓保洁服务方案
- 《锥套锁紧钢筋连接接头》
- 沈阳航空航天大学硕士研究生复试政审表
- 土木工程毕业设计答辩ppt
- 高光谱遥感技术与应用讲座课件
- 电感、电容对交流电的影响
- 防己种植技术粉防己亩产量种植技术多篇
- RB/T 119-2015能源管理体系机械制造企业认证要求
- JJG 693-2011可燃气体检测报警器
评论
0/150
提交评论