二级文件管理课程设计-供参考_第1页
二级文件管理课程设计-供参考_第2页
二级文件管理课程设计-供参考_第3页
二级文件管理课程设计-供参考_第4页
二级文件管理课程设计-供参考_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统二级文件管理课程设计课程设计名称: 二级文件管理系统 专 业班 级 : 学 生姓 名 : 学 号 指 导 老 师 : 设计目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。二、设计内容为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login用户登陆 dir 列文件目录 create创建文件 delete删除文件 open 打开文件 close关闭文件 read 读文件 write写文件rename 重命名 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。三、程

2、序设计1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。2、文件物理结构可采用显式链接或其他方法。3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。5、设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、重命名、退出。四、源代码1、FileSystem.h#define D

3、IR_LENGTH 1024 /路径最长可达100字节#define MAX_WRITE 1024*128 /写入文字可达128k字节#define MEM_D_SIZE 1024*1024 /1M磁盘空间#define DISKSIZE 1024 /磁盘块的大小 1K#define MSD 5 /最大子目录数 5#define DISK_NUM MEM_D_SIZE/DISKSIZE /磁盘块数目 1024=1M/1K#define FATSIZE DISK_NUM*sizeof(struct FatItem) /FAT表大小1024*8=8K#define MOFN 5 /最大文件打开数

4、5 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /根目录起始盘块号 9#define ROOT_DISK_SIZE sizeof(struct Direct) /根目录大小 196#define LOGIN 15#define NAME_LONG 1#define NOT_EXSIT -1#define NOT_OPEN -1#define DIR_FULL -2#define OPEN_FULL -3#define ALREADY -4 #define NOT_R_W -4#define DISK_FULL -5#define NOT_EXIT -1str

5、uct FatItem / size 8 int item; /存放文件下一个磁盘的指针char em_disk; /磁盘块是否空闲标志位, 0 空闲;struct Directstruct FCBchar name8; /文件/目录名 8位char property; /属性 1位目录 0位普通文件int size; /文件/目录字节数、盘块数)int firstDisk; /文件/目录 起始盘块号int next; /子目录起始盘块号int sign; /1是根目录 0不是根目录directItemMSD+2; /最大子目录 5;struct OpenTable struct OpenTa

6、bleItemchar name9; /文件名int firstdisk; /起始盘块号int size; /文件的大小char open_flag; /文件打开标志:1:打开。0:未打开openitemMOFN; /最大文件打开数 5int cur_size; /当前打文件的数目;struct FatItem *fat; /FAT表struct Direct *root; /根目录struct Direct *cur_dir; /当前目录struct OpenTable user_openTable; /文件打开表int fd=-1; /文件打开表的序号char *bufferdir; /记

7、录当前路径的名称char *fdisk; /虚拟磁盘起始地址int cur_user;int find_N = 0;void init();void format();void enter();void assign();int create(char *name);int open(char *name);int close(char *name);int rename();int write(int fd,char *buf,int len,char *name);int read(int fd,char *buf,char *name);int del(char *name);void

8、dir();int login();void helpMenu();void currentPath();2、FileSystem.cpp#include#include#includeconio.h#include FileSystem.h#includeint statue=0;char user20=li;char password20=123;int main() FILE *fp;char ch;char cmd13;char name10;int i,flag;char *contect;helpMenu();while(flag=login()!=LOGIN) printf(密码

9、不正确!n);printf(请输入正确的用户名和密码!n);contect = (char *)malloc(MAX_WRITE*sizeof(char); if(fp=fopen(disk.bat,rb)=NULL) /创建一个文件printf( Will you initialize the disk? (y or n);scanf(%s,&ch);if(ch=y) init();printf( Initialize Succeed! n);elsereturn 0;enter(); /分析命令while(1) printf(%s/,bufferdir); scanf(%s,cmd);if

10、(strcmp(cmd,help) = 0 | strcmp(cmd,?) = 0) helpMenu();elseif(strcmp(cmd,model) = 0) printf(需要修改密码么(y/n);scanf(%s,&ch);if (ch=y)printf(请输入密码b);scanf(%s,&password);printf(修改成功);elseprintf(退出修改密码n);elseif(strcmp(cmd,login) = 0) while (login()!=LOGIN)printf(请输入正确的用户名或密码n); elseif(strcmp(cmd,quit) = 0) f

11、ree(contect);exit(1);return 0;else if(strcmp(cmd,create) = 0) scanf(%s,name);flag = create(name);/关于创建文件共实现四个判断 if(flag=NAME_LONG)/文件名太长printf(Error: n 文件的名称太长 !n);else if(flag=DIR_FULL)/目录下文件数超printf(Error: n 该目录下的文件和目录数已满 !n);else if(flag=ALREADY)/重名printf(Error: n 该目录下已存在该文件 !n);else if(flag=DISK

12、_FULL)/磁盘空间满printf(Error: n 磁盘空间已满!n);elseprintf( 成功创建文件! n); else if(strcmp(cmd,open) =0) statue=1;scanf(%s,name);fd = open(name);if(fd = NOT_EXSIT)printf(Error: n 所要打开的文件不存在! n);elseprintf(打开成功! n); else if(strcmp(cmd,write) = 0) statue=2;scanf(%s,name);if(fd = NOT_OPEN)printf(Error:n 该文件没有打开,请打开后

13、再写入 n);elseprintf(请输入文件的内容: );scanf(%s,contect); /connect为一个长度为128字节的变量值flag=write(fd,contect,strlen(contect),name);if(flag = 0) /每个盘块可写入最多128字节printf(已成功写入! n);elseprintf(Error:n 硬盘空间不足,无法写入! n);else if(strcmp(cmd,read) = 0)statue=3;scanf(%s,name);fd = open(name);if(fd = NOT_EXSIT)printf(Error:n 不存

14、在该文件,不能读! n);else if (fd = NOT_OPEN)printf( 该文件已经打开! n);elseflag = read(fd,contect,name);if(flag = 0)for(i=0;iuser_openTable.openitemfd.size;i+) printf(%c,contecti);printf(tn);/if(gets(a)=NULL);else if(strcmp(cmd,delete) = 0)scanf(%s,name);flag = del(name);if(flag = NOT_EXIT)printf(Error:n 该文件没有退出,不

15、能删除! n);else if(flag = -NOT_OPEN)printf(Error:n 该文件是打开的,请先关闭它,然后再删除! n);elseprintf(已成功删除文件! n); else if(strcmp(cmd,dir) =0)dir();else if(strcmp(cmd,format) = 0) format(); puts(format success!); else if(strcmp(cmd,close) = 0)statue=0; int i; for(i=0;i=MOFN)printf(Error:n 该文件没有打开,无需关闭!n);else /清空该文件的用

16、户打开表项 strcpy(user_openT,); user_openTable.openitemi.firstdisk = -1; user_openTable.openitemi.size = 0; user_openTable.openitemi.open_flag = 0; user_openTable.cur_size-;printf(%s,close success!n); continue; else if (strcmp(cmd,rename) = 0)if (statue=1)printf(打开文件不能重命名);elseprintf(%

17、d,statue);flag=rename();if (flag=NOT_EXIT)printf(文件不存在n);elseprintf(n 指令错误! n);int login()char inuser20;char inpassword20;char ch;int j=0;printf(请输入用户名n);scanf(%s,inuser);while(strcmp(inuser,user)!=0)printf(该用户不存在!n);printf(*n);printf(请输入正确的用户名:n); scanf(%s,inuser);printf(请输入密码n);while(ch=getch()!=1

18、3) /将输入的密码转换成字符* putchar(*);inpasswordj=ch;j+;inpasswordj=0; /字符数组的最后一位为0,故要加该语句/printf(您输入的密码是:%s,inpassword);printf(n);getchar(); if (strcmp(inuser,user)=0)&(strcmp(inpassword,password)=0)bufferdir=wang;return LOGIN;elsereturn 0;void init()fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /分配空间forma

19、t(); void format()int i;FILE *fp;fat = (struct FatItem *)(fdisk+DISKSIZE); /FAT 1M /*-初始化FAT表 fat1-fat7-*/ for(i=1;iROOT_DISK_NO-1;i+) /for(i=1;i8;i+) fati.item=i+1; fati.em_disk=1; for(i=ROOT_DISK_NO;iDISK_NUM;i+) /for(8;idirectItem0.sign = 1; /根目录root-directItem0.firstDisk = ROOT_DISK_NO ; / = 9;

20、/第9个盘块开始strcpy(root-directI,.); /定义其文件名为 .root-directItem0.next = root-directItem0.firstDisk; /子目录的起始盘块是根目录所在第一个盘块,即未出 /第一块root-directIperty = 1; /1根目录root-directItem0.size = ROOT_DISK_SIZE; /即一个根目录项的空间大小 196字节/*指向上一级目录的目录项-回指指针*/root-directItem1.sign = 1;root-directItem1.firstDisk

21、= ROOT_DISK_NO;strcpy(root-directI,.);root-directItem1.next = root-directItem0.firstDisk;root-directIperty = 1;root-directItem1.size = ROOT_DISK_SIZE;for(i=2;idirectItemi.sign = 0;root-directItemi.firstDisk = -1; strcpy(root-directI,); root-directItemi.next = -1;root-direct

22、Iperty = 0;root-directItemi.size = 0;if(fp = fopen(disk.bat,wb)=NULL)printf(Error:n Cant Open The File n);return;/虚拟到物理if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) printf(Error:n 文件写入错误! n);fclose(fp);void enter() FILE *fp; int i; /重新回到初始空间-虚拟中操作 fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /申请 1

23、M空间 /判断disk文件是否存在 if(fp=fopen(disk.bat,rb)=NULL) printf(Error:n 打开文件出错!n); return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /把磁盘文件disk.dat 读入虚拟磁盘空间(内存) /回到新申请的fdisk中 printf(Error:n 不能读文件!n); exit(0); fat = (struct FatItem *)(fdisk+DISKSIZE); root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); fclose(fp); /最多能

24、打开5个文件 for(i=0;i8) /文件名大于 8位return(NAME_LONG); /重名checkfor(j=2;jdirectI,name) & cur_dir-directIperty=0)break; /如果没循环完,则是因为文件已存在if(jMSD+2) /文件已经存在return(ALREADY);/超过最大文件数目 for(i=2;idirectItemi.firstDisk=-1) /找到没有用到的break; if(i=MSD+2) /无空目录项return(-2); for(j=ROOT_DISK_NO+1;j=DISK_NUM)

25、return(DISK_FULL); fatj.em_disk = 1; /将空闲块置为已经分配 /填写目录项 strcpy(cur_dir-directI,name); cur_dir-directItemi.firstDisk = j; cur_dir-directItemi.size = 0; cur_dir-directItemi.next = j; cur_dir-directIperty = 0; return 0;int open(char *name) int i, j; for(i=2;idirectI,name) brea

26、k; if(i=MSD+2)return(NOT_EXSIT); /查找一个空闲用户打开表项 for(j=0;jdirectItemi.firstDisk; /cur_dir 最多5个 strcpy(user_openT,name); user_openTable.openitemj.size = cur_dir-directItemi.size;user_openTable.openitemj.open_flag = 1; user_openTable.cur_size+;/返回用户打开表表项的序号 return(j);int close(char *n

27、ame) int i; for(i=0;i=MOFN)return(6); /清空该文件的用户打开表项 strcpy(user_openT,); user_openTable.openitemi.firstdisk = -1; user_openTable.openitemi.size = 0;user_openTable.openitemi.open_flag = 0; user_openTable.cur_size-; return 0;int write(int fd, char *buf, int len,char *name)char *firs

28、t;int remain;int item, i, j, k;int ilen1, ilen2, modlen, temp;/读取用户打开表对应表项第一个盘块号item = user_openTable.openitemfd.firstdisk;/找到当前目录所对应表项的序号for(i=2;idirectItemi.firstDisk=item)break;temp = i; /存放当前目录项的下标while(fatitem.item!=-1)item = fatitem.item; /*-查找该文件的下一盘块-*/计算文件地址first = fdisk+item*DISKSIZE+user_

29、openTable.openitemfd.size%DISKSIZE;remain = DISKSIZE-user_openTable.openitemfd.size%DISKSIZE;/如果最后磁盘块剩余的大小大于要写入的文件的大小if(remain len)strcpy(first,buf);user_openTable.openitemfd.size = user_openTable.openitemfd.size+len;cur_dir-directItemtemp.size = cur_dir-directItemtemp.size+len;elsefor(i=0; i0)ilen2

30、 = ilen2+1; /*-还需要多少块磁盘块-*/for(j=0;jilen2;j+)for(i=ROOT_DISK_NO+1;i=DISK_NUM) /如果磁盘块已经分配完了return(DISK_FULL);first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/if(j=ilen2-1) /*-如果是最后要分配的一块-*/for(k=0;klen-remain-j*DISKSIZE;k+)firstk = bufk;else/*-如果不是要最后分配的一块-*/for(k=0;kdirectItemtemp.size = cur_dir-direc

31、tItemtemp.size+len;printf(%dn,cur_dir-directItemtemp.size );return 0;int read(int fd, char *buf,char *name)int len = user_openTable.openitemfd.size;char *first;int i, j, item;int ilen1, modlen;item = user_openTable.openitemfd.firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 =

32、ilen1+1; /*-计算文件所占磁盘的块数-*/for(i=0;iilen1;i+)first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/if(i=ilen1-1) /*-如果在最后一个磁盘块-*/for(j=0;jlen-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;else /*-不在最后一块磁盘块-*/for(j=0;jlen-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;item = fatitem.item; /*-查找下一盘块-*/first = fdisk+item*DISKSI

33、ZE;return 0;int rename()int i;char strrename8;char strnewname8;printf(请输入要重命名的文件);scanf(%s,&strrename);/printf(%s,strrename);for(i=2;idirectI,strrename) break; if(i=MSD+2)return(NOT_EXSIT); printf(请输入新的命名(最大文件名长度为8);scanf(%s,&strnewname);/cur_dir-directI=strnewname;strcpy(cur_dir-d

34、irectI,strnewname);return 0;int del(char *name)int i,cur_item,item,temp;for(i=2;idirectI,name) & cur_dir-directIperty = 0) cur_item = i;/printf(-%d-,i);break;if(i=MSD+2) /-如果不在当前目录中return(NOT_EXIT);for(i=0;idirectItemcur_item.firstDisk;/*-该文件的起始盘块号-*/while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/temp = fatitem.item;fa

温馨提示

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

评论

0/150

提交评论