简单多用户文件系统设计_第1页
简单多用户文件系统设计_第2页
简单多用户文件系统设计_第3页
简单多用户文件系统设计_第4页
简单多用户文件系统设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 简单多用户文件系统设计数学与计算机学院课程设计说明书课 程 名 称: 操作系统课程设计 课 程 代 码: 题 目: 简单多用户文件系统设计 年级/专业/班: 学 生 姓 名: 学 号: 开 始 时 间: 2011 年 12 月 12 日完 成 时 间: 2011 年 12 月 26 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(45)总 分(100)指导教师签名: 年 月 日教师评语操作系统原理课程设计任务书学院名称: 专业: 年级: 一、设计题目 简单多用户文件文件系统设计文件数据操作处理二、主要内容本课程设计完成一

2、个简单多用户文件系统,加深理解文件系统的内部功能及内部实现。三、具体要求在WINDOWS系统环境下设计一个简单的二级文件系统。要求做到以下几点:(1) 可以实现下列几条命令:adduser增加用户login用户登录exit注销登录rmuser删除用户passwd改变用户口令chown改变文件拥者chmod改变文件权限dir列文件目录cp拷贝文件rename重新命名文件rm删除文件create创建文件open打开文件close关闭文件read读文件write写文件 简单多用户文件系统设计(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。(4) 要求该同学配

3、合统组其他同学一起完成总体设计,并自己单独完成文件数据操作处理有关命令(adduser、login、exit、open、close、read、write)的实现。四、主要技术路线提示(1) 要求利用结构化或面向对象的方法完成系统的设计; (2) 要求在设计的过程中,建立清晰的层次关系; (3) 在系统的设计中,尽量采用面向对象的机制。(4) 开发环境:Windows XP 或Windows 2000(5) 编程语言建议采用C+,也可以采用其他语言。(6) 数据处理方法:a) 首先应确定文件系统的数据结构:用户注册、主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找

4、和修改。b) 用户创建的文件,可以编号存储于磁盘上。如 file0,file1,file2 并以编号作为物理地址,在目录中进行登记。五、进度安排 共计2周共计20学时,4学时作需求分析,后16学时编写调试程序并完成报告。六、完成后应上交的材料1.课程设计报告(纸质报告和电子文档)2.源程序(电子文档)七、推荐参考资料1 张尧学、 史美林 计算机操作系统教程 ( 第二版 ) 清华大学出版社 2000年8月2 汤子瀛等 计算机操作系统 西安电子科技大学出版社 2001年 3 尤晋元、史美林 Windows 操作系统原理 机械工业出版社 2001年 4 周长林、左万历 计算机操作系统教程 高等教育出

5、版社 2002年 5 郑阿奇 Visual C+ 实用教程(第二版) 电子工业出版社 2004年6月6 陈向群 操作系统教程 北京大学出版社 2001年9月指导教师 签名日期 年 月 日系 主 任 审核日期 年 月 日目 录1.引言11.1问题的提出11.1.1简单多用户文件文件系统设计文件数据操作处理11.1.2主要设计思路11.2任务与分析11.2.1任务11.2.2分析22.设计方案32.1总体方案的设计32.2模块化42.1.1创建文件模块功能说明和流程图42.1.2打开文件模块功能说明和流程图52.1.3写文件模块功能说明和流程图52.1.4读文件模块功能说明和流程图62.1.5关闭

6、文件模块功能说明和流程图82.1.6添加用户功能说明和流程图92.1.7用户登录功能说明和流程图103.主要模块代码103.1添加用户adduser模块113.2用户登录login模块123.3创建文件create模块133.4打开文件open模块153.5写文件write模块173.6读文件read模块193.7关闭文件close模块203.8注销登录logout模块214.测试22结 论26参考文献27摘 要 在现在计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故平时总是不它们以文件的形式存放在外存中,需要时再随时将他们调入内存。如果由用户直接管理外存上得文件,不仅

7、要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须呢能保持数据的安全性和一致性。显然,这是用户所不能胜任、也不愿意承担的工作。于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提供系统资源的利用率。关键词:计算机 文件管理 多用户 简单多用户文件系统设计1. 引言1.1 问题的提出文件管理系统是操作系统的主要功能,采用文件管理是为了方便用户和保证文件的安全性。在文件管理中采用二级文件目录进行管理。系统中建立一个主

8、文件目录,主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包含用户名和指向该用户目录文件的指针。这样在查找时就不会出现不同的用户能够查看到所有的用户文件而只能够看见自己目录下的文件。同时采用二级文件目录进行管理能够提高检索文件的速度,在不同的用户目录下也能够使用相同的文件名。1.1.1 简单多用户文件文件系统设计文件数据操作处理本系统为简单多用户文件管理系统。用户可以根据所注册的用户名登陆来对文件或是文件进行操作。多用户功能可以满足不同用户不同的需求同时也起到了很好的保密作用。 文件系统为用户提供了按名存取的功能以使得用户能透明地存储访问文件。为了实现按名存取文件需要对文件存储设备进

9、行合理的组织分配对存储在文件存储设备上的文件进行保护保密和提供共享的手段。另外文件系统还要提供检索文件或文件中记录的手段文件系统就是完成上述功能的一组软件和数据结构的集合。模拟一个文件管理系统要完成对文件的基本操作文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件创建更改目录列出目录内容等信息。系统建立了文件目录树存储文件系统中的所有文件。对于用户名下的文件用文件目录树的分枝来存贮。采用命令行操作界面很直观也方便用户进行操作用户只要按照操作界面所显示的命令来操作就行了。因为存在着同一个目录下不能有同名文件的问题。所以在进行文件的基本操作时要考虑到在已经有的文件中是否有同名文件有的话则

10、输出提示信息。1.1.2 主要设计思路首先系统要完成初始化的任务建立起整个系统等待用户注注册成功后用户登录模块对用户的用户名进行验证如果用户登录成功则系统进入等待用户输入的状态用户选择相应指令后系统按照即定方式处理用户请求用户退出后系统转入登录模块等待下一位用户的登录。1.2 任务与分析1.2.1 任务实现下列几条命令:27adduser增加用户login用户登录exit注销登录rmuser删除用户passwd改变用户口令chown改变文件拥有者chmod改变文件权限dir列文件目录cp拷贝文件rename重新命名文件rm删除文件create创建文件open打开文件close关闭文件read读

11、文件write写文件1.2.2 分析(1) 要求利用结构化或面向对象的方法完成系统的设计; (2) 要求在设计的过程中,建立清晰的层次关系; (3) 在系统的设计中,尽量采用面向对象的机制。(4) 开发环境:Windows XP 或Windows 2000(5) 编程语言建议采用C+,也可以采用其他语言。(6) 数据处理方法:a) 首先应确定文件系统的数据结构:用户注册、主目录、子目录及活 动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。b) 用户创建的文件,可以编号存储于磁盘上。如 file0,file1,file2 并以编号作为物理地址,在目录中进行登记。2. 设计方

12、案2.1 总体方案的设计图 0“多用户文件管理系统”模拟流程2.2 模块化2.1.1 创建文件模块功能说明和流程图功能说明:创建文件create 文件名 文件属性流程图:开始 查该用户的UFDUFD有该 文件?文件?是否在UFD和UOF中找空登记栏显示:同名文件 不能建立返回在UFD和UOF中登记文件名,记录长度、文件属性找一磁盘空闲块i:=找到的块号在UFD登记栏中文件地址:=i在该用户的UOF表中登记 状态:=建立 写指针:=i在磁盘上建立该文件显示建立成功返回 图 1“建立文件”模拟流程2.1.2 打开文件模块功能说明和流程图功能说明:打开文件open 文件名 操作类型流程图:开始查用户

13、的UFDUFD中有该文件?否是显示:文件不存在,不能打开查用户的UOF返回UOF中有该文件? 是 否 文件属性与操作类型相符该文件为“建立”状态? 否显示:操作不合法,不能打开 是 是登记UOF:文件名、记录长度、文件属性状态:=“打开” 并打开磁盘上文件,读指针:=UFD中文件地址写指针:= UFD中文件地址显示: 文件已打开,并打开磁盘上文件显示:正在建立 不能打开 否返回返回显示:“打开”成功返回 图 2 “打开文件”模拟算法2.1.3 写文件模块功能说明和流程图功能说明:写文件write 文件名 写入的内容 长度在运用write命令进行写的时候,文件必须是被打开的,否则文件将不能够进行

14、写操作。同时也要注意将要进行写操作的文件的属性,如果文件属性为只读则写操作也会失败。流程图:开始查用户的UOFUOF中有该文件? 是 否显示:文件尚未建立或打开,不能写该文件为“建立”状态 否(打开状态) 返回文件属性为只读 “只读”? 是 否 是把记录信息写到“写指针”指出的物理块号(写入磁盘中)显示:操作不合法不能写顺序修改? 否找出存放指定记录的块号返回 是找一空闲填文件链接字,修改“写指针”取出“写指针”指出的块号把修改信息写入找到的物理块中(写入磁盘中)。修改“写指针”显示:“写文件”成功 返回 图3: “写文件”模拟算法2.1.4 读文件模块功能说明和流程图功能说明:读文件read

15、 文件名 长度在用read读取文件内容时要注意文件的属性,如果文件属性为只写属性,这该文件不能够执行read命令。流程图:开始查该用户的UOF 文件已经打开? 是 否显示:文件未打开不能读从读指针得到当前起始地址按读长度把信息读出传达室给用户(从磁盘文件中读取数据并显示)返回修改“读指针”显示:“读文件” 成功返回 图4 “读文件”模拟算法2.1.5 关闭文件模块功能说明和流程图功能说明:关闭文件close 文件名 流程图:开始 查用户的UOF文件为“建立”状态? 置文件结束标志文件为打开状态? 是消除该文件在UOF中的登记栏 否显示:文件已关闭显示:“关闭文件”成功返回 图5 “关闭文件”模

16、拟算法2.1.6 添加用户功能说明和流程图功能说明:添加用户adduser 用户名 密码流程图:图6 “添加用户”模拟算法2.1.7 用户登录功能说明和流程图功能说明:用户登录login 用户名 密码流程图: 图7 “用户登录”模拟算法3. 主要模块代码结构体的定义:typedef struct mfd char username14;/用户名14B char password14; / 密码B int ufd_id; /该用户的UFD所在的物理块号(2B)MFD;typedef struct ufd char filename14; /文件名B; int mode; /文件权限-readon

17、ly;1-writeonly;2-read/write int length; /文件长度(总块数) int addr;/该文件的第个文件块对应的物理块号UFD; typedef struct uof char filename14; /文件名B; int mode; /文件权限-readonly;1-writeonly;2-read/write int length; /文件长度(总块数) int addr;/该文件的第个文件块对应的物理块号 int state;/0建立,打开 int readptr; int writeptr;UOF; typedef struct diskint id;

18、char flag;/0空闲,已分配int next;DISK;本次程序设计一共实现了15个模块adduser增加用户login用户登录exit注销登录passwd改变用户口令chown改变文件拥有者chmod改变文件权限dir列文件目录cp拷贝文件rename 重新命名文件rm删除文件create 创建文件open打开文件close关闭文件read读文件write写文件3.1 添加用户adduser模块void adduser()char user20,pass20;a:cout<<"请输入用户名和密码:"cin>>user>>pass

19、;int m=0; if(strcmp(mfdlistfindmfd(user).username,"")=0)strcpy(mfdlistfindmfd(user).username,user);strcpy(mfdlistfindmfd(user).password,pass);for(int i=2;i<18;i+)if(disklisti.flag='0')break; disklisti.flag='1' mfdlistfindmfd(user).ufd_id=i;for(int j=0;j<16;j+)strcpy(u

20、fdlistj.filename,"");elsecout<<"用户存在,请重新输入!"<<endl;goto a;initial_ufd(user);for(int k=0;k<16;k+)strcpy(uoflistk.filename,"");back_mfd();back_ufd();/return;3.2 用户登录login模块void login(char user,char pass)int i=0,id1=-1,m=0;while(1)if(strcmp(mfdlistfindmfd(us

21、er).username,user)=0)strcpy(cur_user,user);id1=i;break;else cout<<"重新输入用户名:" cin>>user;while(1)if(strcmp(mfdlistfindmfd(user).password,pass)!=0)cout<<"密码错误n"cout<<"重新输入密码:"cin>>pass;cout<<'n'else break;initial_ufd(user);/初始化用户

22、打开文件表;for(int k=0;k<16;k+)strcpy(uoflistk.filename,"");3.3 创建文件create模块/创建文件void create(char filename,int mod)int i=0,id1=-1,j=0,id2=-1;/判断文件属性是否正确if(mod<0|mod>2)cout<<"文件属性不合法,请输入02的数字!n"return;/在ufdlist中查找for(;i<16;i+)if(strcmp(ufdlisti.filename,filename)=0)id

23、1=i;if(id1!=-1)/在ufdlist找到cout<<"该文件已经存在,不能建立重名文件!n"return;else/在ufdlist中找到空条目id1=-1;for(i=0;i<16;i+)if(strcmp(ufdlisti.filename,"")=0)id1=i;break;if(id1=-1)/ufdlist中没有空闲cout<<"ufdlist中没有空闲!n"return;else/在uoflist中找到空条目for(;j<16;j+)if(strcmp(uoflistj.fi

24、lename,"")=0)id2=j;break;if(id2=-1)/uoflist中没有空闲cout<<"uoflist中没有空闲!n"return;elseif(mod!=0&&mod!=1&&mod!=2)cout<<"文件读写属性错误,不能创建文件!n"return;/填写ufd相关信息strcpy(ufdlistid1.filename,filename);ufdlistid1.mode=mod;ufdlistid1.length=0;ufdlistid1.addr=

25、getdisk();disklistufdlistid1.addr.flag='1'/置文件结束标志; ofstream output_file;output_file.open("disk.txt",ios:binary|ios:ate);output_file.seekp(ufdlistid1.addr*513,ios:beg);output_file.put('0');output_file.close();/填写uof相关信息strcpy(uoflistid2.filename,filename);uoflistid2.length=

26、0;uoflistid2.addr=ufdlistid1.addr;uoflistid2.mode=mod;uoflistid2.state=-1;uoflistid2.readptr=uoflistid2.writeptr=0;/不知读写指针赋值是否正确cout<<"创建文件"<<filename<<"成功!n"back_disklist();back_mfd();back_ufd();3.4 打开文件open模块/打开文件void open(char filename,int mod)int i=0,id1=-1,

27、j=0,id2=-1;for(;i<16;i+)if(strcmp(ufdlisti.filename,filename)=0)id1=i;if(id1=-1)cout<<"该文件不存在,不能打开!n"return;else/在uoflist中查找for(;j<16;j+)if(strcmp(uoflistj.filename,filename)=0)id2=j;if(id2!=-1)/在uoflist中找到if(uoflistid2.state=-1)cout<<"文件已经打开!n"uoflistid2.state=

28、1;elsecout<<"文件正在建立不能打开!n"return;else/没有在uoflist中找到if(ufdlistid1.mode!=mod)cout<<"文件属性不合法!不能打开文件!n"return;else/一下找到uoflist中的一个空表项登记该文件信息for(i=0;i<16;i+)if(strcmp(uoflisti.filename,"")=0)break;strcpy(uoflisti.filename,ufdlistid1.filename);uoflisti.state=1;

29、uoflisti.length=ufdlistid1.length;uoflisti.mode=ufdlistid1.mode;uoflisti.addr=ufdlistid1.addr;uoflisti.readptr=0;uoflisti.state=1;cout<<"打开文件成功!n"ifstream input_file;input_file.open("disk.txt",ios:binary|ios:ate);input_file.seekg (ufdlistid1.addr*513,ios:beg); int address1=

30、ufdlistid1.addr;/文件开始盘块号;char c;input_file.get(c);int x=0;while(c!='0')/查找文件末尾,写指针定义为相对最后的盘块的偏移量; if(c!='n')x+;else input_file.seekg (address1*513,ios:beg); x=0;if(disklistaddress1.next !=0)address1=disklistaddress1.next ;input_file.get(c); uoflisti.writeptr=x;return;3.5 写文件write模块/将

31、buffer中的nbytes写入到写指针指定的位置。void write(char filename,char buffer,int nbyte)int id;ofstream outfile;for(int i=0;i<16;i+) if(strcmp(uoflisti.filename,filename)=0)id=i;break;elsecout<<"该文件不存在!n"return;if(uoflistid.state!=1)cout<<"该文件没有打开!n"return;if(uoflisti.mode=0)cout

32、<<"文件只读!n"return;outfile.open("disk.txt",ios:binary|ios:ate);if(!outfile)cout<<"open file disk.txt error!n"return;int address;/记录文件最后的盘块号;address=uoflisti.addr;while(disklistaddress.next!=0)address=disklistaddress.next;outfile.seekp(address*513+uoflisti.writ

33、eptr,ios:beg); long cur_pos;for(int j=0;j<nbyte;j+)cur_pos=outfile.tellp();if(cur_pos+1)%513!=0)outfile.put(bufferj);uoflisti.length +;elsedisklistaddress.next=getdisk();outfile.seekp(disklistaddress.next*513,ios:beg);j-;for(int k=0;k<16;k+)if(strcmp(ufdlistk.filename ,filename)=0)break;ufdlis

34、tk.length =uoflisti.length;outfile.put('0');uoflisti.writeptr=(uoflisti.writeptr+nbyte)%513;cout<<"当前文件读指针位置为"<<uoflisti.writeptr<<endl;cout<<"成功写入文件!n"back_disklist();back_mfd();back_ufd();outfile.close();return;3.6 读文件read模块/将文件当前读指针开始的nbytes 读入b

35、uffer 字符串数组中void read(char filename,char buffer, int nbyte)int i=0,id=-1,block,offset;ifstream infile;for(;i<16;i+)if(strcmp(uoflisti.filename,filename)=0)id=i;if(uoflisti.mode=1)cout<<"文件只读!n"return;if(id=-1)cout<<"该文件还没有打开,不能读出!n"return;block=uoflistid.addr;offse

36、t=uoflistid.readptr;infile.open("disk.txt",ios:binary|ios:ate);if(!infile)cout<<"open file disk.txt error!n"return;infile.seekg(block*513+offset,ios:beg);long cur_addr=0;int index=0;for(i=0;i<nbyte;i+)if(cur_addr+1)%513!=0)infile.get(bufferi);if(bufferi='0')break

37、;elseblock=disklistblock.next ;if(block=0)break;index=disklistblock.next-block;infile.seekg(block*513,ios:beg);i-;bufferi='0'uoflistid.readptr=index*513+i+uoflistid.readptr;cout<<"成功读取文件内容如下:"<<buffer<<endl;infile.close();3.7 关闭文件close模块/关闭文件void close(char filena

38、me)int i=0,id=-1;ofstream output_file;for(;i<16;i+)if(strcmp(uoflisti.filename,filename)=0)id=i;if(id!=-1)if(uoflistid.state=0)/状态为建立 /此处设置文件结束标志output_file.open("disk.txt",ios:binary|ios:ate);if(!output_file)cout<<"open disk.txt error!nCannot close the file!n"return;out

39、put_file.seekp(uoflistid.addr*513+uoflistid.writeptr,ios:beg);output_file<<'0'if(uoflistid.state=0|uoflistid.state=1)strcpy(uoflistid.filename,"");cout<<"文件关闭成功!n"return;elsecout<<"该文件已经关闭!n"return;else/UOF表中没有该文件cout<<"没有该文件!n"return;3.8 注销登录logout模块/用户登出void logout()b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论