二级文件管理课程设计

上传人:灯火****19 文档编号:20559445 上传时间:2021-03-29 格式:DOC 页数:17 大小:70KB
返回 下载 相关 举报
二级文件管理课程设计_第1页
第1页 / 共17页
二级文件管理课程设计_第2页
第2页 / 共17页
二级文件管理课程设计_第3页
第3页 / 共17页
点击查看更多>>
资源描述
操作系统二级文件管理课程设计课程设计名称: 二级文件管理系统 专 业班 级 : 学 生姓 名 : 学 号 指 导 老 师 : 一、 设计目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。二、设计内容为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login用户登陆 dir 列文件目录 create创建文件 delete删除文件 open 打开文件 close关闭文件 read 读文件 write写文件rename 重命名 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。三、程序设计1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。2、文件物理结构可采用显式链接或其他方法。3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。5、设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、重命名、退出。四、源代码1、FileSystem.h#define DIR_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 /最大文件打开数 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 -1struct 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 OpenTableItemchar 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; /记录当前路径的名称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 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(密码不正确!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(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) free(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_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 该文件没有打开,请打开后再写入 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 不存在该文件,不能读! 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 该文件没有退出,不能删除! 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 /清空该文件的用户打开表项 strcpy(user_openTable.openitemi.name,); 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(%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()!=13) /将输入的密码转换成字符* 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); /分配空间format(); 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; /第9个盘块开始strcpy(root-directItem0.name,.); /定义其文件名为 .root-directItem0.next = root-directItem0.firstDisk; /子目录的起始盘块是根目录所在第一个盘块,即未出 /第一块root-directItem0.property = 1; /1根目录root-directItem0.size = ROOT_DISK_SIZE; /即一个根目录项的空间大小 196字节/*指向上一级目录的目录项-回指指针*/root-directItem1.sign = 1;root-directItem1.firstDisk = ROOT_DISK_NO;strcpy(root-directItem1.name,.);root-directItem1.next = root-directItem0.firstDisk;root-directItem1.property = 1;root-directItem1.size = ROOT_DISK_SIZE;for(i=2;idirectItemi.sign = 0;root-directItemi.firstDisk = -1; strcpy(root-directItemi.name,); root-directItemi.next = -1;root-directItemi.property = 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); /申请 1M空间 /判断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); /最多能打开5个文件 for(i=0;i8) /文件名大于 8位return(NAME_LONG); /重名checkfor(j=2;jdirectItemj.name,name) & cur_dir-directItemj.property=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)return(DISK_FULL); fatj.em_disk = 1; /将空闲块置为已经分配 /填写目录项 strcpy(cur_dir-directItemi.name,name); cur_dir-directItemi.firstDisk = j; cur_dir-directItemi.size = 0; cur_dir-directItemi.next = j; cur_dir-directItemi.property = 0; return 0;int open(char *name) int i, j; for(i=2;idirectItemi.name,name) break; if(i=MSD+2)return(NOT_EXSIT); /查找一个空闲用户打开表项 for(j=0;jdirectItemi.firstDisk; /cur_dir 最多5个 strcpy(user_openTable.openitemj.name,name); user_openTable.openitemj.size = cur_dir-directItemi.size;user_openTable.openitemj.open_flag = 1; user_openTable.cur_size+;/返回用户打开表表项的序号 return(j);int close(char *name) int i; for(i=0;i=MOFN)return(6); /清空该文件的用户打开表项 strcpy(user_openTable.openitemi.name,); 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 *first;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_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 = 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-directItemtemp.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 = 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*DISKSIZE;return 0;int rename()int i;char strrename8;char strnewname8;printf(请输入要重命名的文件);scanf(%s,&strrename);/printf(%s,strrename);for(i=2;idirectItemi.name,strrename) break; if(i=MSD+2)return(NOT_EXSIT); printf(请输入新的命名(最大文件名长度为8);scanf(%s,&strnewname);/cur_dir-directItemi.name=strnewname;strcpy(cur_dir-directItemi.name,strnewname);return 0;int del(char *name)int i,cur_item,item,temp;for(i=2;idirectItemi.name,name) & cur_dir-directItemi.property = 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;fatitem.item = -1;fatitem.em_disk =0;item = temp;/释放目录项cur_dir-directItemcur_item.sign = 0;cur_dir-directItemcur_item.firstDisk = -1;strcpy(cur_dir-directItemcur_item.name,);cur_dir-directItemcur_item.next = -1; cur_dir-directItemcur_item.property = 0;cur_dir-directItemcur_item.size = 0;return 0;void dir()int i,count=0;printf(t文件名t | t文件大小tn);for(i=2;idirectItemi.firstDisk!=-1) /*-如果存在子目录-*/count+;if(cur_dir-directItemi.property=0) /*-文件-*/ printf(t%st | t %dt n,cur_dir-directItemi.name,cur_dir-directItemi.size); else printf(t目录名:);printf(%st,cur_dir-directItemi.name);if(count=0)printf(不存在子目录n);void currentPath()printf(%s/,bufferdir);void helpMenu() printf(*二级文件管理系统*n);printf( quit quit the file system n);printf( create create a new filen);printf( delete delete a filen);printf( open open a filen);printf( close close an openned filen);printf( write write to a filen);printf( read
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 其他分类 > 其它学术


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!