虚拟文件系统_第1页
虚拟文件系统_第2页
虚拟文件系统_第3页
虚拟文件系统_第4页
虚拟文件系统_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、虚拟文件系统学生课程设计报告2014 2015 学年 第 二 学期学 院 xxxxxxxxx专业软件工程学 号姓 名指导教师起止周周数1实习地点课程设计目的:1、理解文件系统功能2、完成对文件、目录及磁盘空间的管理并提供操作命令3、实现文件共享与保护课程设计要求:1、利用索引结点实现目录管理。2、建立一个树形目录系统,目录文件及索引结点均用结构数组表示。3、文件盘块采用fat方式,空指针用-1表示,并设空闲盘块指针 4、提供对文件、目录及磁盘空间的操作命令。进度安排及主要内容:第一周:完成用户登录,目录管理和文件管理第二周:成绩:一、概述1.1 本文的目的本文内容用于指导学生对课程设计报告的格

2、式和内容安排进行控制。学生在使用时,可直接用格式刷将本文对应部分的格式内容进行提取并加 载到目标位置;对于封面、页眉等部分,请直接修改相关文字。二、需求分析本次要实现虚拟文件系统,主要功能有用户登录、子目录的创建、删除、子目录中项的显示;文件的创建、打开、删除、关闭、对文件进行读写等。实现对目录和文件的基本操作和文件的共享与保护。三、技术方案本次课程设计用vs2013编写c+控制台程序模拟文件系统。系统初始时 需要登录,登录成功方能对文件进行操作。本虚拟文件系统采用两级目录,第一级目录对应用户账号,第二级目录对应用户下的文件。文件系统的数据结构包括主目录(虚拟 c 盘)、子目录及所含文件等。三

3、者都存放在磁盘中,方便进行操作。文件可以在目录中进行记录,表明文件所在目录。四、总体设计4.1 功能设计1、首次运行系统需要先格式化磁盘空间,申请一个内存为 1m 的磁盘 空间。2、用户登录,用户需输入正确的用户名和密码方能进入本系统进行文件和目录的操作。3、进入系统后可根据提示对文件和目录进行操作。4.2虚拟文件系统算法流程图算法流程图4-1五、详细设计5.1系统功能说明1、创建子目录:输入createdir目录名,即进行目录创建操作,若当前目录已满 或文件名已经存在则创建失败,返回失败信息。否则创建成功,并找到空闲 磁盘块,将该磁盘块设为已分配,填写目录项。2、删除子目录:removedi

4、r目录名,检查当前目录项中有无该目录,判断要删 除的目录有无子目录,如果有子目录将其释放,进行删除操作。3、更改当前目录:cd目录名,可以进入到子目录并回退上级目录。4、显示目录中项:showdir可以显示目录和文件,文件显示大小,目录显示 目 录。5、文件操作:创建文件、打开文件(创建时自动打开该文件),删除文件,关 闭文件、读文件、写文件、6、退出5.2 数据结构struct direct /*文件控制快信息*/ struct fcb char name9; /文件/目录名8位char property; /属性1位目录0位普通文件 intsize;文件/目录字节数、盘块数)int fir

5、stdisk; /文件/目录起始盘块号 intnext;/子目录起始盘块号intsign;/1是根目录0不是根目录directitem ms2;/* *size 8*/struct fatitemint item; /存放文件下一个磁盘的指针char em disk; /磁盘块是否空闲标志位0空闲 ;struct opentablestruct openttableitemchar name9; / 文件名int firstdisk; /起始盘块号int size; /文件的大小openitem mofnint cur_size; /当前打文件的数目;struct fatitem *fat;/

6、fat 表structdirect *root;/ 根目录structdirect *cur_dir; / 当前目录structopentable u_opentable; / 文件打开表5.3 方法函数void initfile();void format();void enter();void init();int create( char *name);int open( char *name);int close( char *name);int write( int fd, char *buf, int len);int read( int fd, char *buf);int de

7、l( char *name);int createdir( char *name);int removedir( char *name);void showdir();int cd( char *name);void print();void show();void login();5.4 全局变量#define mem d size024*1024/ 总磁盘空间为 m#define#define/磁盘块的大小k/磁盘块数目kdisksize 1024disk num024 #define fatsize disk_numsizeof (struct fatitem ) /fat 表大小根目录

8、起始盘块#define root_disk_noatsize disksize+1 号#define#define#define#define#defineroot_disk_sizeizeofdir_maxsiz曰024msd 6mofn4max write024*128(struct direct )/根目录大小/路径最大长度为kb 最大子目录数 最大文件深度为一 最大写入文字长度kbchar *username = ( char *)malloc( char password = ( char *)malloc(sizeof (char) * 100);sizeof (char) * 1

9、00);六、软件测试6.1格式化磁盘空间测试c:w i n dow ssyste m32cmd ,exedkkdat2015/7/9 16;22口at 文件1,024 kbdebug2015/7/9 15:2& 文件夹* kcsjoolcppdat 文件iz7/9 15t26c+ + source23 kblil kcsjool-vcxproj大小x .00 mbf7/7 14:58vc+ project5 kbr kcsjooi .vcxproj.filte修改臼期:2015/7/9 16:22nf7 14:28vc+ + project fil.2 kb口 4n a +-w+/7 1川疗立

10、6.2用户登录测试c:wi n dow ssy ste m 3 2c md,exe,还请输入用户1 root 请输入密码; root录成功i中录录 目录目录 前1:刖目 当鼻子 示建政除 下&创fs3虚拟文件系统一命令一s hdwdl irc reate dir 目录名】cd 目录名_remidvedir 【目呆三】i*ieadwi*ceexit6.3创建子目录测试c:wi n dow ssy ste m 3 2c md,exe录录 目录目录 一刖星刖目命令s how-dirc re ate div目录名-cd i目录名】-repwvedir 1 目录:七1close学廿日d:mjsersbe

11、nchao createdir j11建子目录成功,:usersbenchao _c:wi n dow ssy ste m 3 2c md,exe录作入显示当前目录中的项 人创建子目录目录命令showdirc re ate dir 目录名cd i目录名rewvedir 目录名】,、天团及close lis writeexit:misersbenchao createdir jj建子目录成功,:mjsersbenchao cd j:xjusers benchao%j.6.5创建文件测试c:wi n dow ssy ste m 3 2c md,exe目录目录 一aj-i halj- .命令s ho

12、w-dirc re ate div目录名-cd i目录名】-rbpt(ve(lir 目 吊:大 iclose学廿日d write:mjsersbenchao createdir j11建子目录成功,:mjsers benchao cd j:misers xbenchao %jcreate f ile3力建文件成功?:xjusers benchaomc:wi n dow ssy ste m 3 2c md,exe蚱 _ d 77、显7f当刖目录中的项 shodir、包建子 录createdir目录名.、更次当刖自录 目录名_删除子目录removedir目录名匕尸匚匚一 文文文文柢统 件系 文出

13、e i*e a t e牛名 jdel *茗- opevi lp心1口零 read - write e x it-users xbenchao createdir j巾建子目录成功tpmjenchaoi cr,eate f ilel m建文件成功,:misers bencliao sjopenile3rl*or:文件已经打开?:misersbenchao6.6写入文件测试fswc:wi in dow ssystem 32md,exe口除于自cii 名remduedir 1 目录二 jc- misersxbenchaoreatedir j创建子目录成功,c: misers benchao cd j

14、c: misersbenchaojcreate file3创建文件成功?c* qlset*3nnch.07整nfile3error:文件已经打开,c: mjsersbenchaojwrite造第人文件内容喳是文件3身入成亦c: misersbenchaoj6.7读文件测试6.9显示目录中项测试6.8返回上级目录测试口c:wi in dow ssystem 32cmd,exec:wi in dow ssystem 32cmd,exe录录iink目录刖目 wmn子 示建改除 乍s-创n政匚att- -i- - hl命令一 一一一一 )卷 jw wdl irci*eatedir目录名 jcd1目录名

15、 广-rein(3iy edii目 示:二 一 .id 丁 二.id 统 一 件屋一创1天1 c lose read writc exitcreate del t一一口 pxn ic: mjsersbenchao showdir内容名称类型(文件显示长度/目录显示目录j)n1目录】filfrz?m【目录】c: misersbenchao6.10读写权限测试c:wi in dow ssystem 32cmd,exeli.cidse i*tad write exit:号密心零 enchao showdii*内容名称ilez值二 weffben*rmocign f ilfrz 打开成亦c: mise

16、rsxbenchaoread您没有读取权限!c: usersbenchao.类型(文件显示长度目录显示目录内 目录目录七、总结本次课程设计我初步完成了虚拟文件系统的目录管理和文件管理。让我对于文件系统有了深层次的理解和掌握,通过自己编写程序逐步提高自己的编程能力,并从中体会到了很多乐趣和知识。同时让我对c 语言中的指针有了一个更深的了解。由于以前对于c+知识没有掌握牢固,使我在编程中出现了很多错误。费 了很多时间,但是我通过不断学习也提高了很多,对一些细节的结构体等也有了一个更深的理解。这次课程设计让我进行了以前课堂很少有的实践训练,虽然掌握的知识有限,但是这次经历让我提高了编程能力和编程思想

17、,使我受益匪浅。附录1参考文献1谭浩强,c+程序设计(第2版).清华大学出版社,2012.2汤小丹、梁红兵、哲凤屏,计算机操作系统.西安电子科技大学出版社,2014.3严蔚敏.数据结构.清华大学出版社.,2007附录2源码/ kcsj001.cpp : defines the entry point for the console application.#include stdafx.h#include #include #include char *username = ( char *)malloc( sizeof (char) * 100); char password = ( cha

18、r *)malloc( sizeof (char) * 100); struct direct#define#define#define#define#define号#define#define#define#define#definemem_d_size024*1024disksize 1024/总磁盘空间为m/磁盘块的大小kdisk_num024/磁盘块数目kfatsize disk_numsizeof (struct fatitem ) /fat 表大小root_disk_noatsize disksizeh/ 根目录起始盘块root_disk_sizeizeof dir_maxsize

19、1024 msd 6(struct direct )/ 根目录大小/路径最大长度为kb/最大子目录数mofn4max_writ24*128/最大文件深度为/最大写入文字长度kb/*文件控制快信息*/struct fcbchar name9; /文件/目录名8位char property; /属性1位目录0位普通文件intsize;文件/目录字节数、盘块数)int firstdisk; /文件/目录起始盘块号intnext;/子目录起始盘块号intsign;/1是根目录0不是根目录directitem ms2;/*size 8*/struct fatitemint item; /存放文件下一个磁

20、盘的指针char em_disk; /磁盘块是否空闲标志位0空闲;一struct opentable struct openttableitemchar name9; / 文件名int firstdisk; /起始盘块号int size; /文件的大小openitem mofnint cur_size; /当前打文件的数目 ;structfatitem *fat;/fat 表structdirect *root;/ 根目录structdirect *cur_dir; / 当前目录structopentable u_opentable; / 文件打开表int fd = -1;/文件打开表的序号c

21、har *bufferdir; /记录当前路径的名称char *fdisk; /虚拟磁盘起始地址void initfile();void format();void enter();void halt();int create( char *name);int open( char *name);int close( char *name);int write( int fd, char *buf, int len);int read( int fd, char *buf);int del( char *name);int mkdir( char *name);int rmdir( char

22、*name);void dir();int cd( char *name);void print();void show();void login();main()file *fp;char ch;char a100;char code1110;char name10;int i, flag, r_size; char *contect;contect = ( char *)malloc( max_writeizeof (char); if (fp = fopen( disk.dat , rb ) = null printf(您还没有格式化,是否格式化?(y/n); scanf( %c, &c

23、h);if (ch = y ) initfile();printf(格式化成功! n); else return 0;printf(您还未登录,请先登录!n);gototest:login();if (strcmp(username, readonly ) != 0 | strcmp(password, 1234) != 0)& (strcmp(username, root ) != 0 | strcmp(password, root ) !=0)& (strcmp(username, nopower) != 0 | strcmp(password, 1234) != 0)printf(登录失

24、败,请重新登录! n);goto gototest;printf(登录成功!n);enter();print();show();strcpy(code0, strcpy(code1, strcpy(code2, strcpy(code3, strcpy(code4, strcpy(code5, strcpy(code6, strcpy(code7, strcpy(code8, strcpy(code9, strcpy(code10,exit);create);open);close);write);read);del);createdir );removedir);showdir);cd);w

25、hile (1)scanf( %s, a);for (i = 0; i11; i+)if (!strcmp(codei, a) break;switch (i)case 0: /退出文件系统 free(contect);halt();return 0;case 1: /创建文件 scanf( %s, name); flag = create(name);if (flag = -1) printf( error: n 长度太长!n); else if (flag = -2) printf( error: n 子目录已满!n);else if (flag = -3) printf( error:

26、n打开文件次数过多!n);else if (flag = -4) printf( error: n 名字已经在子目录中!n); else if (flag = -5) printf( error: n 磁盘空间已满!n); i else printf(创建文件成功! n);show();break;case 2: /打开文件scanf( %s, name);fd = open(name);if (fd = -1)printf( error: n打开的文件不存在! n);else if (fd = -2)printf( error: n文件已经打开! n);else if (fd = -3)pr

27、intf( error: n打开文件次数过多! n);else if (fd = -4)printf( error: n这是一个子目录,不能打开进行读写! n);else printf(打开成功! n); show(); break;case 3: /关闭文件 scanf( %s, name); flag = close(name);if (flag = -1) printf( error:n文件没有打开! n); else printf(关闭成功! n); show(); break;case 4: /写文件if (fd = -1) printf( error:n 文件没有打开! n); e

28、lseif (strcmp(username, readonly ) != 0 & strcmp(username, nopower) != 0)printf(请输入文件内容:);scanf( %s, contect);flag = write(fd, contect, strlen(contect);if (flag = 0) printf(写入成功! n); else printf( error:n 磁盘大小没满! n); else printf(您没有写入权限! n); show();i break;case 5: /读文件if (fd = -1) printf( error:n文件没有

29、打开! n); elseif (strcmp(username, nopower) != 0) flag = read(fd, contect);if (flag = 0)for (i = 0; iu_opentable.openitemfd.size; i+).printf( %c, contecti); printf( tn);匚else printf(您没有读取权限! n); show(); break;case 6: /删除文件scanf( %s, name);flag = del(name);if (flag = -1) printf( error:n 文件不存在! n);else

30、if (flag = -2)printf( error:n文件已经打开,请先关闭它! n);else if (flag = -3)printf( error:n 删除的不是文件! n);elseprintf(删除成功! n);show();break;case 7: /创建子目录scanf( %s, name);flag = mkdir(name);if (flag = -1)printf( error:n 名称长度太长! n);else if (flag = -2)printf( error:n 子目录已满! n);else if (flag = -3)printf( error:n 名称已

31、在子目录中! n);else if (flag = -4)printf( error: n . 或. 不能作为子目录名称!n);else if (flag = -5)printf( error: n磁盘空间已满!n);else if (flag = 0)printf(创建子目录成功! n);show();break;case 8: /删除子目录scanf( %s, name);flag = rmdir(name);if (flag = -1) printf( error:n 子目录不存在! n);else if (flag = -2)printf( error:n 子目录中含有子目录,请删除子

32、目录中的子目 录!n);else if (flag = -3)printf( error:n删除的不是子目录! n);else if (flag = 0)printf(删除子目录成功! n);show();break;case 9: /显示当前子目录dir();show();break;case 10: /更改当前目录scanf( %s, name);flag = cd(name);if (flag = -1)printf( error:n 路径不正确!n);else if (flag = -2)printf( error:n 打开的不是子目录!n);show();break;default

33、:printf( n error!n命令错误! n);show();void login()printf(请输入用户名:n);scanf( %s, username);printf(请输入密码:n);scanf( %s, password);void format()int i;file *fp;fat = ( struct fatitem *)(fdisk +disksizf 计算 fa俣地址,引导区向后偏移1k/*初始化fam*/fat0.item = -1;/ 引导块fat0.em_disk =1 ;for (i = 1; iroot_disk_no; i+)/ 存放 fatg的磁盘块号

34、fati.item = i + 1;fati.em_disk =1;.fat root_disk_noem = -1;/存放根目录的磁盘块号fat root_disk_nem_disk = 1;for (i = root_disk_no + 1; idirectitem0.sign = 1;root-directitem0.firstdisk = strcpy(,root-directitem0.next = root-directitem0.firstdisk;root-directitem0. property = 1;root-directite

35、m0.size = root_disk_siz e/指向上一级目录的目录项root-directitem1.sign = 1;root-directitem1.firstdisk =root_disk_nostrcpy(, .);root-directitem1.next = root-directitem0.firstdisk;root-directitem1. property = 1;root-directitem1.size = root_disk_siz e if (fp = fopen( disk.dat , wb) = null prin

36、tf( error:n 不能打开文件 n); return ;for (i = 2; idirectitemi.sign = 0;root-directitemi.firstdisk = -1;strcpy(, );root-directitemi.next = -1;root-directitemi. property = 0;root-directitemi.size = 0;if (fp = fopen( disk.dat , wb) = null printf( error:n不能打开文件 n);return ;if (fwrite(fdisk

37、, mem_d_size, fp) != 1)/ 把虚拟磁盘空间保存到磁盘文件中zzprintf( error:n文件写入出错! n);fclose(fp);void initfile()fdisk = ( char *)malloc( mem_d_sizeizeof (char); / 申请 1mm可 format();printf( installn);void enter()file *fp; int i;fdisk = ( char *)malloc( mem_d_sizeizeof (char); / 申请 1mm可 if (fp = fopen( disk.dat , rb ) =

38、 nullprintf( error:n 不能打开文件 n); return ;if (!fread(fdisk,mem d size, fp)把磁盘文件 disk.dat 读入虚拟磁盘空间(内存) printf( error:n 不能读取文件 n); exit(0);fat = ( structfatitem *)(fdisk +disksizf/ 找到 fatg地址root = ( structdirect *)(fdisk +disksize+ fatsize; 找至u根目录地址fclose(fp);*初始化用户打开表*/for (i = 0; i8) / 文件名大于 8位 return

39、 (-1);for (j = 2; ,name)break;if (j msh 2)文件已经存在return (-4);for (i = 2; idirectitemi.firstdisk = -1) break;if (i =mse+ 2) 无空目录项return (-2);if (u_opentable.cur size =mofn / 打开文件太多return (-3);for (j = root disk no + 1; j= disk_num return (-5);fatj.em_disk =1 ; 将空闲块置为已经分配*填写目录项name;*/s

40、trcpy(cur_, cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size = 0;cur_dir-directitemi.next = j;cur_perty = 0fd = open( name; return 0;int open( char * nameint i, j;name)for (i = 2; , break;if(i =mse 2)return (-1);/是文件还是目录if(cur_dir-di

41、perty1)return (-4);/文件是否打开for (j = 0; j mofn+)if (!strcmp(u_, break;name)if (j= mofn/* 文件打开太多 */ return (-3);/查找一个空闲用户打开表项for (j = 0; jdirectitemi.firstdisk;strcpy(u_, name;u_opentable.openitemj.size = cur_dir-directitemi.size;u_opentable.

42、cur_size+;/返回用户打开w表项的序号return (j); int close( char * nameint i;for (i = 0; i= mofnreturn (-1);/清空该文件的用户打开表项的内容strcpy(u_, );u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.size = 0;u_opentable.cur_size-;return 0;int write( int fd , char * buf, int len) |char *first;

43、int item, i, j, k;int ilenl, ilen2, modlen, temp;用$字符作为空格#字符作为换行符char space = 32;char endter = n ;for (i = 0; i len ; i+) if ( bufi =$)buf i = space;else if ( buf i =#)buf i = endter;/取用户打开表对应表项第一个盘块号item = u_opentable.openitem fd .firstdisk;/找到当前目录所对应表项的序号 for (i = 2; idirectitemi.firstdisk = item) break;temp = i; /存放当前目录项的下标找到的item是该文件的最后一块磁盘块while (fatite

温馨提示

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

评论

0/150

提交评论