二级文件管理课程设计

合集下载

模拟简单二级文件管理系统

模拟简单二级文件管理系统

操作系统课程设计模拟简单二级文件管理系统*名:***学号:系别:计算机学院专业:网络工程年级:16级指导教师:2019年05 月11 日一、课程设计项目介绍(含项目介绍及设计目的)1、设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

2、项目介绍:为LINUX 设计一个简单的二级文件系统。

本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。

将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。

每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。

(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。

)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等)1、系统总体结构图:2、模块介绍(1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。

(2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。

(3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。

(完整word版)操作系统二级文件管理课程设计

(完整word版)操作系统二级文件管理课程设计

(完整w o r d版)操作系统二级文件管理课程设计-CAL-FENGHAI.-(YICAI)-Company One1操作系统二级文件管理课程设计课程设计名称:二级文件管理系统专业班级:软件工程计083-1学生姓名:李晓斌学号: 20082553103指导教师:任满杰设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

设计内容:为Linux系统设计一个简单二级文件管理系统一、实验内容描述1 实验目标本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现.2 实验要求为linux系统设计一个简单的二级文件系统.要求做到以下几点:①可以实现下列命令:login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件②列目录时要列出文件名、物理地址、保护码和文件长度.③源文件可以进行读写保护.程序设计(1)设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。

另外,为了简便文件系统未考虑文件共享,文件系统安全以及管理文件与设备文件等特殊内容。

(2)主要数据结构A 磁盘块结构体:typedef struct distTable{int maxlength;int start;int useFlag;distTable *next;}diskNode;diskNode *diskHead;B 文件块结构体:struct fileTable //文件块结构体{char fileName[10];int strat; //文件在磁盘存储空间的起始地址int length; //文件内容长度int maxlength; //文件的最大长度char fileKind[3]; //文件的属性——读写方式struct tm *timeinfo;bool openFlag; //判断是否有进程打开了该文件//fileTable *next;};C 两级目录结构体typedef struct user_file_directory //用户文件目录文件UFD{//char fileName[10];fileTable *file;user_file_directory *next;}UFD;//UFD *headFile;typedef struct master_file_directory //主文件目录MFD{char userName[10];char password[10];UFD *user;}MFD;(3)函数如下;void userCreate(){char c;char userName[10];int i;if(used<MaxUser){printf("请输入用户名:");for(i=0;c=getch();i++){if(c==13) break;elseuserName[i]=c;printf("%c",c);}userName[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,userName)) {printf("\n");printf("该用户名已存在,创建用户失败\n"); system("pause");return;}}strcpy(userTable[used].userName,userName); printf("\n");printf("请输入密码:");for(i=0;c=getch();i++){if(c==13) break;elseuserTable[used].password[i]=c;printf("*");}userTable[userID].password[i]='\0';printf("\n");printf("创建用户成功\n");used++;system("pause");}else{printf("创建用户失败,用户已达到上限\n"); system("pause");}fflush(stdin); //清除文件缓冲区}int login(){char name[10],psw[10];char c;int i,times;printf("请输入用户名:");for(i=0;c=getch();i++){if(c==13) break;elsename[i]=c;printf("%c",c);}name[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,name))break;}if(i==used){printf("\n您输入的用户名不存在\n");system("pause");return -1;}for(times=0;times<3;times++){memset(psw,'\0',sizeof(psw)); //将psw数组内的内容设置为空printf("\n请输入密码:");for(i=0;c=getch();i++){if(c==13) break;elsepsw[i]=c;printf("*");}printf("\n");for(i=0;i<used;i++){if(!strcmp(psw,userTable[i].password)){printf("用户登录成功\n");system("pause");break;}}if(i==used){printf("您输入的密码错误,您还有%d次输入机会\n",2-times); if(times==2) exit(0);}else break;}fflush(stdin);return i;}int requestDist(int &startPostion,int maxLength){int flag=0; //标记是否分配成功diskNode *p,*q,*temp;p=diskHead;while(p){if(p->useFlag==0&&p->maxlength>maxLength){startPostion=p->start;q=(diskNode *)malloc(sizeof(diskNode));q->start=p->start;q->maxlength=maxLength;q->useFlag=1;q->next=NULL;diskHead->start=p->start+maxLength;diskHead->maxlength=p->maxlength-maxLength;flag=1;temp=p;if(diskHead->next==NULL) diskHead->next=q;else{while(temp->next) temp=temp->next;temp->next=q;}break;}p=p->next;}return flag;}void fileCreate(char fileName[],int length,char fileKind[]) //创建文件{//int i,j;time_t rawtime;int startPos;UFD *fileNode,*p;for(p=userTable[userID].user->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName)){printf("文件重名,创建文件失败\n");system("pause");return;}}if(requestDist(startPos,length)){fileNode=(UFD *)malloc(sizeof(UFD));fileNode->file=(fileTable *)malloc(sizeof(fileTable)); //这一步必不可少,因为fileNode里面的指针也需要申请地址,否则fileNode->file指向会出错strcpy(fileNode->file->fileName,fileName);strcpy(fileNode->file->fileKind,fileKind);fileNode->file->maxlength=length;fileNode->file->strat=startPos;fileNode->file->openFlag=false;time(&rawtime);fileNode->file->timeinfo=localtime(&rawtime);fileNode->next=NULL;if(userTable[userID].user->next==NULL)userTable[userID].user->next=fileNode;else{p=userTable[userID].user->next;while(p->next) p=p->next;p->next=fileNode;}printf("创建文件成功\n");system("pause");}else{printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");system("pause");}}void freeDisk(int startPostion){diskNode *p;for(p=diskHead;p!=NULL;p=p->next){if(p->start==startPostion)break;}p->useFlag=false;}void fileDel(char fileName[]){UFD *p,*q,*temp;q=userTable[userID].user;p=q->next;while(p){if(!strcmp(p->file->fileName,fileName)) break;else{p=p->next;q=q->next;}}if(p){if(p->file->openFlag!=true) //先判断是否有进程打开该文件 {temp=p;q->next=p->next;freeDisk(temp->file->strat); //磁盘空间回收free(temp);printf("文件删除成功\n");system("pause");}else{printf("该文件已被进程打开,删除失败\n");system("pause");}}elseprintf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileCat(char fileName[]) //查看文件内容{int startPos,length;int k=0;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){startPos=p->file->strat;length=p->file->length;p->file->openFlag=true; //文件打开标记printf("*****************************************************\n ");for(int i=startPos;k<length;i++,k++){if(i%50==0) printf("\n"); //一行大于50个字符换行printf("%c",disk[i]);}printf("\n\n*************************************************** **\n");printf("%s已被read进程打开,请用close命令将其关闭\n",p->file->fileName);system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileWrite(char fileName[]) //写入{UFD *p,*q;q=userTable[userID].user;int i,k,startPos;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){if(!strcmp(p->file->fileKind,"r")) //判断文件类型是否允许写入 {printf("该文件是只读文件,写入失败\n");system("pause");return;}char str[500];printf("please input content:\n");gets(str);startPos=p->file->strat;p->file->openFlag=true; //文件打开标记p->file->length=strlen(str);if(p->file->length>p->file->maxlength){printf("写入字符串长度大于该文件的总长度,写入失败\n"); system("pause");return;}for(i=startPos,k=0;k<(int)strlen(str);i++,k++)disk[i]=str[k];printf("文件写入成功,请用close命令将该文件关闭\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n"); system("pause");}}void fileDir(char userName[]) //显示某一用户的所有文件{UFD *p;int i,k;for(i=0;i<MaxUser;i++){if(!strcmp(userTable[i].userName,userName)){k=i;break;}}if(i==MaxUser){printf("没有找到该用户,请检查输入用户名是否正确\n");system("pause");return;}else{p=userTable[k].user->next;printf("******************************************************* *************************\n");printf("文件名文件长度文件在磁盘的起始地址文件类型创建时间\n");for(;p!=NULL;p=p->next)printf("%s %d %d %s %s",p->file->fileName,p->file->maxlength,p->file->strat,p->file->fileKind,asctime(p->file->timeinfo));printf("******************************************************* *************************\n");system("pause");}}void diskShow() //文件在磁盘上的属性{diskNode *p;int i=0,unusedDisk=0;printf("******************************************************* ********************\n");printf(" 盘块号起始地址容量(bit) 是否已被使用\n");for(p=diskHead;p!=NULL;p=p->next,i++){if(p->useFlag==false) unusedDisk+=p->maxlength;printf(" %d %d %d %d \n",i,p->start,p->maxlength,p->useFlag);}printf("***************************************************************************\n");printf("磁盘空间总容量:512*1024bit 已使用:%dbit 末使用:%dbit\n\n",MaxDisk-unusedDisk,unusedDisk);system("pause");}void fileClose(char fileName[]) //文件关闭{UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){p->file->openFlag=false;printf("%s文件已关闭\n",p->file->fileName);system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}心得体会在设计程序之前,我先花费了一天多的时间思考设计该程序的思路,熟悉了一下学过的课本,把以前忘了的东西又熟悉了一下,然后就通过操作系统要求开始设计程序了,我采用了一个模块一测试,成功之后在写另一个模块,刚开始创建文件,显示你创建成功了,可是却在指定路径中没有该文件,只有一个二级文件目录,经过我认真的查看,发现我用的函数是创建目录的,而非创建文件。

操作系统课程设计文件管理二级文件系统

操作系统课程设计文件管理二级文件系统

本文档分别包含linux和windows两套程序目录一、课程设计的目的..........................二、课程设计的内容及要求...................内容..........................................要求..........................................三、实现原理.................................四、关键算法实现流程图 .....................流程图........................................关键算法......................................五、软件运行环境及限制 .....................六.结果输出及分析..........................七.心得体会.................................八.参考文献.................................一.课程设计的目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。

二.课程设计的内容及要求内容:为LINUX 设计一个简单的二级文件系统。

要求做到以下几点:1、可以实现下列几条命令(至少4条)。

Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件2、列目录时要列出文件名、物理地址、保护码和文件长度。

3、源文件可以进行读写保护。

从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:1、鼓励并优先个人独立选题设计,可从下面设计题目中选择,也可以自拟相关题目;如要合作,每组最多两名同学,且设计文档不能相同;2、可以在我们实验课最后布置的实验设计基础上进行完善和改进,但不能相同。

操作系统的课程设计Linux二级文件资料系统设计完整篇.doc

操作系统的课程设计Linux二级文件资料系统设计完整篇.doc

操作系统的课程设计Linux二级文件资料系统设计1操作系统课程设计报告专业:软件工程学号:姓名:马提交日期:2017/1/10【设计目的】1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现2、结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统3、通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。

要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护【实验环境】C++DevCpp【设计思路】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。

另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

用户创建的文件,可以编号存储于磁盘上。

如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

结构体:typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/char fname[MAXNAME]; /*file name*/} OSFILE; //存放重要信息typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD; //用户下面的文件typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE;主要的函数说明:void LoginF(); /*LOGIN FileSystem用户登录*/void DirF(); /*Dir FileSystem列目录*/void CdF(); /*Change Dir改变目录*/void CreateF(); /*Create File创建文件*/void DeleteF(); /*Delete File删除文件*/void ModifyFM(); /*Modify FileMode修改*/void OpenF(); /*Open File打开文件*/void CloseF(); /*Close File关闭文件*/void ReadF(); /*Read File读文件*/void WriteF(); /*Write File写文件*/void QuitF(); /*Quit FileSystem离开文件系统*/void help();其他重要函数:void clrscr() //清屏int ExistD(char *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/ int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/ int FindPANo() /*find out physical address num*/void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/void InputPW(char *password) /*input password,use '*' replace*/char *ltrim(char *str) /*remove the heading blanks.去除左空白*/char *rtrim(char *str) /*remove the trailing blanks.去除右空白*/int WriteF1() /*write file相当于置换文件*/程序流程说明:整体流程:各部分功能流程:Open:N NY操作系统的课程设计Linux二级文件资料系统设计1第2页【源程序清单】Open:void OpenF() /*Open File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示当前路径int fcoun, i; //定义两个整形变量char fname[MAXNAME], fmode[25]; //定义两个字符串变量int fmod; //文件模式printf("\nPlease input FileName:");gets(fname); //接收打开文件的文件名ltrim(rtrim(fname)); //去除左右空白if(ExistF(fname){ //不存在printf("\nError.文件名\'%s\'不存在\n", fname);wgetchar=1;} else { //存在i=ExistD(username); //获取用户物理信息for(int a=0; a {if(strcmp(fname, ufd[i]->ufdfile[a].fname)==0) //找到文件{fcoun=a;break;}}ifopen[i][fcoun].ifopen=1; //将文件状态置为打开状态printf("Please input OpenMode(0-Read Only, 1-Write Only, 2-Read and Write,3-Protect):");//打开文件模式gets(fmode); //获取模式fmod=atoi(fmode); //将字符串转换为整型ifopen[i][fcoun].openmode=fmod; //将文件的模式置为OpenModeprintf("\nOpen Successed");wgetchar=1;}}Delete:void DeleteF() /*Delete File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示路径char fname[MAXNAME], str[50], str1[50]; //定义三个字符串变量int i, k, j;int fpaddrno1; //记录文件物理地址块号if(strcmp(strupr(ltrim(rtrim(dirname))), "")==0){ //判断主目录是否为空printf("\nError.请确认您要删除的是否在用户目录下!\n");wgetchar=1;}if(strcmp(strupr(dirname), strupr(username))!=0){ //判断用户是否在用户目录下printf("\nError.您只能删除修改自己用户目录下的文件哦!\n");wgetchar=1;} else {printf("\nPlease input FileName:");gets(fname); //接收删除的文件名ltrim(rtrim(fname)); //去除文件名的左右空白i=ExistF(fname); //用户文件位置if(i>=0){k=ExistD(username); //获取用户所在存储位置if(ifopen[k][i].ifopen==1){//文件状态处于打开状态,不许删除printf("\n Error.\'%s\' 处于打开状态!请先关闭哟!\n", fname); wgetchar=1;} else {if(ufd[k]->ufdfile[i].fmode==3){ //保护文件,不可删除printf("\nError.\'%s\'处于被保护状态!请先关闭哟!\n", fname);wgetchar=1;} else {fpaddrno1=ufd[k]->ufdfile[i].fpaddr; //获取文件的物理地址块号fpaddrno[fpaddrno1]=0; //回收物理地址块号for(j=i; jufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1]; //将j+1位置为j}strcpy(str , "c:\\osfile\\file\\");itoa(fpaddrno1, str1, 10); //将整数转化为字符串strcat(str, str1);strcat(str, ".txt"); //连接remove(str); //删除物理文件fcount[k--]; //文件个数减一。

操作系统二级文件管理系统结构设计

操作系统二级文件管理系统结构设计

操作系统二级文件管理系统结构设计二级文件管理系统是一种较为常见的操作系统文件管理结构,主要用于管理计算机中的文件和目录。

该系统结构设计的目标是提供高效、可靠和安全的文件管理功能,使用户能够方便地存储、访问和管理文件。

一、文件系统的基本结构1.文件系统层次结构:二级文件管理系统采用层次结构,由两个层次组成:目录层和文件层。

目录层用于组织、分类和管理文件,文件层用于存储和读取实际文件数据。

2.目录结构设计:目录是文件和子目录的逻辑组织结构,可以有多级嵌套。

目录层次结构可以采用树形结构,根目录是顶级目录,下级目录称为子目录。

每个目录包含目录项,每个目录项包含文件名和文件指针。

3.文件结构设计:文件是存储在磁盘上的一组数据,可以是文本文件、图像文件、音频文件等。

文件层次结构可以采用线性结构,每个文件由文件头、文件数据和文件尾组成。

文件头包含文件属性信息,文件数据是实际的文件内容,文件尾用于标记文件结束。

二、文件系统的实现原理1.文件分配方法:文件分配方法指定了文件在磁盘上的存储方式。

常见的文件分配方法有连续分配、链接分配和索引分配。

连续分配将文件存储在连续的磁盘块上,链接分配使用链表将文件块链接起来,索引分配使用索引表记录文件块的位置。

2.目录操作:目录操作包括创建目录、删除目录、重命名目录、进入目录和返回上级目录等。

其中进入目录操作是进入子目录进行文件管理,返回上级目录是返回到父目录中。

3.文件操作:文件操作包括创建文件、删除文件、读取文件和写入文件等。

创建文件时需要为文件分配存储空间,并在目录中添加文件项;删除文件时需要释放文件占用的存储空间,并在目录中删除文件项;读取文件和写入文件是对文件数据的操作,读取时将文件数据输出到终端,写入时将终端输入的数据写入到文件中。

三、文件系统的实现考虑因素1.效率:文件系统应提供高效的操作方法,包括目录和文件的操作。

目录的层次结构应使查找操作能够在较短的时间内完成,文件的分配方法应尽量减少磁盘碎片和提高文件存取速度。

二级文件管模拟系统课程设计主题功能

二级文件管模拟系统课程设计主题功能

二级文件管理模拟系统课程设计主题功能1. 引言二级文件管理模拟系统是一个模拟操作系统中文件管理功能的软件系统。

本文将详细介绍该模拟系统的设计主题功能,并对其实现细节进行展示和解释。

2. 设计目的二级文件管理模拟系统的设计目的是模拟操作系统中的文件管理功能,使用户能够通过命令行或图形界面对文件进行创建、查找、打开、编辑、保存等操作,实现对文件的有效管理。

3. 主题功能3.1 文件创建与删除用户可以通过命令行或图形界面创建新的文件,并指定文件名和文件类型。

系统会检查文件名的合法性,防止重名文件的存在。

用户还可以选择删除已创建的文件,系统将会确认删除操作以避免误操作。

3.2 文件查找与打开用户可以输入文件名或关键字进行文件查找,系统会根据用户输入的关键字进行文件搜索,并列出搜索结果。

用户可以选择打开搜索到的文件,系统将会读取并显示文件内容。

3.3 文件编辑与保存用户可以在已打开的文件中进行编辑操作,包括插入、删除、修改和替换文本内容等操作。

用户编辑完成后可以选择保存文件,系统将会将文件的修改内容写入文件中。

3.4 文件重命名与复制用户可以选择重命名已创建的文件,系统会提示用户输入新的文件名,并修改文件的名称。

用户还可以选择复制文件,系统将会创建一个与原文件内容相同的新文件。

3.5 文件属性查看与修改用户可以查看文件的属性信息,包括文件名、大小、创建时间等。

用户还可以选择修改文件的属性,如修改文件名或更新文件的创建时间。

3.6 文件夹创建与管理用户可以通过命令行或图形界面创建新的文件夹,并给文件夹命名。

用户还可以对已创建的文件夹进行查看、重命名和删除等操作。

3.7 文件排序与筛选用户可以对文件进行排序操作,按照文件名、文件大小、文件类型或创建时间等进行排序。

用户还可以根据文件名或文件类型等条件对文件进行筛选,以便快速找到目标文件。

4. 实现技术二级文件管理模拟系统的实现可以采用面向对象的方法。

可以使用编程语言如Python、Java或C++来编写模拟系统的程序代码。

二级文件管模拟系统课程设计主题功能

二级文件管模拟系统课程设计主题功能

二级文件管模拟系统课程设计主题功能一、课程设计主题文件管理模拟系统二、功能1. 文件的创建、打开、读取、写入和关闭2. 目录的创建、删除和修改3. 文件的复制、移动和删除4. 空间的分配与回收5. 文件权限管理6. 文件系统备份与恢复三、需求分析1. 用户可以通过命令行或图形界面进行操作。

2. 用户需要登录才能进行文件操作,每个用户只能访问自己的文件。

3. 系统需要支持多种文件类型,如文本文件、图片文件等。

4. 系统需要支持多种目录类型,如普通目录和只读目录等。

5. 系统需要对用户进行权限管理,不同用户有不同的权限。

6. 系统需要实现文件系统备份与恢复功能。

四、设计思路1. 数据结构设计:使用树形结构来表示目录结构,使用链表来表示空闲块链表。

每个目录包含一个指向子目录和子文件的指针。

每个文件包含一个指向数据块链表的指针和一个指向其父目录的指针。

2. 用户登录管理:使用用户名和密码进行验证,并根据用户权限限制其操作范围。

3. 文件操作实现:通过打开文件获取其在磁盘中存储位置,并通过读取或写入数据块来实现对文件的操作。

4. 目录操作实现:通过修改目录结构来实现对目录的操作。

5. 空间分配与回收:使用空闲块链表来管理磁盘空间,通过分配和回收空闲块来实现对磁盘空间的管理。

6. 文件权限管理:使用用户权限限制其对文件的访问和操作。

7. 文件系统备份与恢复:将整个文件系统备份到外部存储设备中,并在需要时恢复文件系统。

五、界面设计1. 登录界面:用户输入用户名和密码进行登录。

2. 主界面:显示当前目录下的文件和子目录,并提供文件和目录的操作选项。

3. 新建文件/目录界面:用户输入名称并选择类型进行新建操作。

4. 文件/目录属性界面:显示文件/目录的属性信息,并提供修改选项。

六、实现步骤1. 设计数据结构并实现相关函数,包括创建、打开、读取、写入和关闭文件等函数,以及创建、删除和修改目录等函数。

2. 实现用户登录管理功能,包括验证用户名和密码以及限制用户权限等功能。

操作系统课程设计二级文件系统

操作系统课程设计二级文件系统

操作系统课程设计报告专业:计算机信息处理学号:08201328姓名:杨馨雨提交日期:2011-7-14【设计目的】1. 课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

2. 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。

3. 通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】1、delete 删除文件2、open 打开文件3、close 关闭文件4、write 写文件【实验环境】Windows7系统Visual studio 2010【相关知识综述】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。

另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

用户创建的文件,可以编号存储于磁盘上。

如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

【设计思路】1 主要数据结构#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child每个用户名下最多有50个文件*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/typedef struct/*the structure of OSFILE定义主文件*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/ char fname[MAXNAME]; /*file name*/} OSFILE;typedef struct/*the structure of OSUFD定义用户文件目录*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;typedef struct/*the structure of OSUFD'LOGIN定义登陆*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct/*file open mode定义操作方式*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;2 主要函数void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem*/void CdF(); /*Change Dir*/void help();【主要程序段】1 Delete函数void DeleteF() /*Delete File*/{ char fname[MAXNAME],str[50],str1[50];int i,k,j;int fpaddrno1;if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) /*无法删除主目录的文件*/{printf("\nError.Please convert to ufd dir before delete.\n");wgetchar=1;}if (strcmp(strupr(dirname),strupr(username))!=0) /*无法删除非自己目录的文件*/ {printf("\nError.You can only modify filemode in yourself dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);//从键盘获取所要删除的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\' is in protect status. Close it before delete.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;//获取文件对应的物理文件名fpaddrno[fpaddrno1]=0;//回收盘块for(j=i;j<fcount[k];j++){ufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1];//从被删除的文件号开始,数组值全部前移一个}strcpy(str,"d:\\osfile\\file\\file");itoa(fpaddrno1,str1,10);//整数转化成字符串strcat(str,str1);strcat(str,".txt");remove(str);//删除物理文件fcount[k]--;//k用户文件数量少1printf("\n \'%s\'is deleted successfully.\n",fname);wgetchar=1;}}}else//所要删除的文件不存在{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}2 Open函数void OpenF() /*Open File*/{char fname[MAXNAME];int i,k,j;if (strcmp(strupr(dirname),strupr(username))!=0) /*在自己的目录里才能打开*/ {printf("\nError.You can only open in yourself dir.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPlease input FileName:");gets(fname);//获取所要打开的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取目录编号if (i>=0){if(ifopen[k][i].ifopen==1)//输入的文件是打开的{printf("\nError.\'%s\' is in open status.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;//修改为打开的if(ufd[k]->ufdfile[i].fmode==0)/*根据文件的模式设置打开模式*/{ ifopen[k][i].openmode=0;}else if(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}else if(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}else ifopen[k][i].openmode=3;printf("\n\'%s\' is opened successfully\n",fname);wgetchar=1;}}else//文件不存在{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}3 Close函数void CloseF() /*Close File*/{char fname[MAXNAME];int i,k,j;if (strcmp(strupr(dirname),strupr(username))!=0) /*不在自己的目录里没法进行*/ {printf("\nError.You can only close file in yourself dir.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/{if(ifopen[k][j].ifopen==1)//如果文件是打开的printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPlease input FileName:");gets(fname);//从键盘上读入所要关闭的文件ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if (i>=0){ifopen[k][i].ifopen=0;/*关闭文件*/printf("\n \'%s\' closed successfully\n",fname);wgetchar=1;}else//所要关闭的文件不存在{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}4 Write函数void WriteF() /*Write File*/{int i,k,n=0;int length;char fname[MAXNAME],values[1000];char str[255],str1[255],c;if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) //只能写自己目录下的文件{printf("\nError.Please convert to ufd dir before write.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);//获取目录编号for(i=0;i<fcount[k];i++)/*列出可以写的文件*/{if(ifopen[k][i].ifopen==1)//如果文件是打开的{printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1; //没有打开的文件if(n!=0){printf("\nPlease input FileName:");gets(fname);//从键盘获取所要写的文件ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if(i>=0){if(ifopen[k][i].ifopen==1)//如果文件是打开的{if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2))//文件是只写,或者是可读可写的{itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//获取文件对应的物理地址strcpy(str1,"file");strcat(str1,str);strcpy(str,"d:\\osfile\\file\\");strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"ab");//以二进制只写的形式打开,每次将内容添加到文件末尾接着上一次内容length=WriteF1();ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+length;//计算总长度printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);printf("\n\nYou have write file successfully!!");fclose(fp_file);wgetchar=0;}else if(ifopen[k][i].openmode==0)//文件是只读的{printf("\nError.\'%s\' has been opened with READ ONL Y mode. It isn\'t write.\n",fname);wgetchar=1;}else//文件是保护的{printf("\nError.\'%s\' has been opened with PROTECT mode. It isn\'t write.\n",fname);wgetchar=1;}}else //文件是关闭的{printf("\nError.\'%s\' is in closing status. Please open it before write\n",fname);wgetchar=1;}}else //所指定的文件不存在{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}【程序流程设计】1总的功能结构图:(1)打开命令的程序流程图:(2)关闭命令的程序流程图:(3)写命令的程序流程图:(4)删除命令的程序流程图:【测试结果】1 删除文件2 打开的文件不能删除3 打开文件,其中已经打开的文件不能再次打开3 关闭文件4 写文件,其中只有打开了文件才能写入5 写文件6 只读文件和保护文件不能写入7 其他函数【参考文献】计算机操作系统,西安电子科技大学出版社,方敏主编,2004.8 部分函数含义引用于【源程序清单】#include"stdio.h"#include"string.h"#include"conio.h"#include"stdlib.h"#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child每个用户名下最多有50个文件*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/typedef struct/*the structure of OSFILE定义主文件*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/ char fname[MAXNAME]; /*file name*/} OSFILE;typedef struct/*the structure of OSUFD定义用户文件目录*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;typedef struct/*the structure of OSUFD'LOGIN定义登陆*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct/*file open mode定义操作方式*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-protect*/}OSUFD_OPENMODE;void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem*/void CdF(); /*Change Dir*/void help();char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/int ExistD(char *dirname); /*Whether DirName Exist,Exist-i,Not Exist-0*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/void SetPANo(int RorW); /*Set physical address num*/int FindPANo(); /*find out physical address num*/int ucount=0; /*the count of mfd's ufds用户数*/int fcount[MAXCHILD]; /*the count of ufd's files子文件数*/int loginsuc=0; /*whether login successfully登陆成功*/char username[MAXNAME]; /*record login user's name22用户名*/char dirname[MAXNAME];/*record current directory使用的用户目录*/int fpaddrno[MAX]; /*record file physical address num物?理地址号,存放自己所创建的所有文件的地址*/int wgetchar; /*whether getchar()*/OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files*/OSUFD_LOGIN ufd_lp;//用户登录结构体类型的变量OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;//FILE 是变量类型,实际上是语言定义的标准数据结构,用于文件void clrscr()/*清屏*/{system("cls");}void main(){int i,choice1;char choice[50]; /*choiceoperation:dir,create,delete,open,delete,modify,read,write*/int choiceend=1; /*whether choice end*///fopen标准函数,打开文件msd.txt,打开一个二进制文件,只允许读数据,送返指针,指向FILE 类型对象。

7.模拟二级文件管理课程设计报告

7.模拟二级文件管理课程设计报告

青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:网络专业学生姓名: __赵建班级:网络081 学号: 200807111题目:模拟二级文件管理系统起迄日期: 2011.6.20——2011.7.1设计地点: 学院机房指导教师: 熊晓芸2010—2011年度第 2 学期完成日期: 2011 年 7 月 1日一、课程设计目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。

同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。

二、课程设计内容与要求1) 系统运行时根据输入的用户数目创建主目录2) 设定一个超级用户,可以查看整个二级文件系统结构3) 普通用户只能根据自己的用户名与密码访问自己的文件与共享的文件4) 能够实现下列命令:● Login 用户登录● Dir 列文件目录● Create 创建文件● Delete 删除文件● Open 打开文件● Close 关闭文件● Read 读文件● Write 写文件5) 系统能检查键入命令的正确性,出错时应能显示出错原因6) 创建文件时需设定文件保护码的内容7) 列目录时要列出文件目录、文件名、保护码(只执行、只读、只写、共享)和文件长度8) 不允许对打开的文件执行重复打开操作或执行删除操作9) 对于共享文件,除了文件的创建者,其他人只有查看权,不能进行写入与删除操作10) 对于文件的越权操作,要有相应的错误提示三、系统分析与设计1、系统分析本次的设计的是希望通过模拟二级目录文件的管理方式来进一步了解磁盘的分配步骤和文件的调用方式,二级文件目录分别由用户文件目录UFD( User File Directory )、主文件目录MFD( Master File Diretory )构成。

操作系统课程设计--二级文件系统(java)

操作系统课程设计--二级文件系统(java)

操作系统课程设计报告二级文件系统(java)姓名:李爱军班级:计091-2学号:200925501211指导教师:翟一鸣日期:2012-08-30目录一、实验目的 (3)二、实验内容 (3)三、实验过程 (3)四、设计思路 (4)五、实现的功能 (5)六、实验感悟 (5)附录:程序主要代码 (5)一、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

二、实验内容为linux系统设计一个简单的二级文件系统。

要求做到以下几点:1、可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2、列目录时要列出文件名、物理地址、保护码和文件长度;3、源文件可以进行读写保护。

三、实验过程1、程序流程登录输入用户名用户存在进入目录管理注册否是用户登录流程 列文件目录流程2、主要类介绍(1)、public class Systems 文件系统的主类(2)、public class MyFile 自定义的文件结构体类(3)、public class MyDirectory 自定义的目录的结构体类(4)、public class SuperBlock implements Serializable 超级快结构体类 (5)、public class INode implements Serializable, Comparable<INode> 自定义INode 节点实体类(6)、public class FileTools 自定义数据文件的读写工具类四、设计思路1、一个磁盘的有扇区(超级块)、索引块区(Inode 节点区)、存储区(数据块区)2、扇区中主要是存储磁盘的总大小、空闲Inode 节点、使用的Inode 节点、已使用空间、列出目录文件读取文件展示文件完成是否当前用户文件否是空闲空间。

计算机操作系统课程设计_简单的二级文件系统

计算机操作系统课程设计_简单的二级文件系统

《操作系统》课程设计题目:设计一个简单二级文件系统专业:计算机科学与技术年级:文计091-1*名:***学号:200990514103指导教师:任满杰时间:2011-2012第二学期2012年9月1日一、设计内容1、可以实现下列几条命令。

Format 格式化Dir 列文件目录Create 创建文件Delete 删除文件Deldir 删除目录Open 打开文件Close 关闭文件Search 查询文件Copy 拷贝文件Cut 剪切文件二、开发环境Windows操作系统Microsoft Visual C++三、分析设计(一)实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。

文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。

另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。

1.程序执行流程图:2.数据块的分配和回收(二)程序结构设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。

并提代接口言方法供用户或程序调用。

(三)数据结构int physic[100]; //文件地址缓冲区int style=1; //文件的类型char cur_dir[10]="root"; //当前目录int search_i=0;struct command{char com[10];}cmd[20];struct block{int n; //空闲的盘快的个数int free[50]; //存放空闲盘快的地址int a; //模拟盘快是否被占用}memory[20449];struct block_super{int n; //空闲的盘快的个数int free[50]; //存放进入栈中的空闲块int stack[50]; //存放下一组空闲盘快的地址}super_block;struct node //i结点信息{int file_style; //i结点文件类型int file_length; //i结点文件长度int file_address[100]; //i结点文件的物理地址 char file_message[100];} i_node[640];struct dir //目录项信息{char file_name[10]; //文件名int i_num; //文件的结点号char dir_name[10]; //文件所在的目录} root[640];四.运行示例及结果分析菜单删除目录文件查询拷贝剪切五、程序实现详细程序请参见源文件, 在此只列举3点1、剪切文件程序片段:void cut(char *tmp,char *newname) {int i; //,jchar t[20];_strtime(t);for(i=0;i<640;i++)if(strcmp(newname,root[i].file_name)==0){break;}if(i==640){printf("目录不存在,不能剪切!\n");return;}for(i=0;i<640;i++){if(strcmp(tmp,root[i].file_name)==0){strcpy(root[i].dir_name,newname);strcpy(i_node[root[i].i_num].change_t,t);//printf("剪切成功!\n");//return;}}if(i==640)printf("文件不存在,执行失败!\n");}2.无文件查询程序片段:void search(char* filename){int sign=0;for(search_i=0;search_i<640;search_i++){if(strcmp(root[search_i].file_name,filename)==0) //查询文件中所在目录信息和当前目录信息相同的数据{sign=1;int k=root[search_i].i_num;printf("%s\t",root[search_i].file_name); //文件名printf(" %d\t",i_node[k].file_style); //文件的类型printf(" %d\t\t",i_node[k].file_length); //文件的长度printf("%s\n",root[search_i].dir_name); //文件所在的目录}}if (sign==0){printf("%s\n","未找到该文件!");}}六、心得与体会这次设计中遇到最难的问题就是拷贝功能的实现,由于之前没有接触过拷贝的原理,所以通过和同伴的讨论和试验,终于突发奇想的运用改变文件路径的源代码和创建文件相结合,终于实现了拷贝功能,能够将一个文件从一个目录拷贝到另一目录(即先移动过去然后再在原位置创建一个原文件),可是却无法拷贝到root根目录,为了解决这个问题,又在创建文件的程序里添加了一个判断是否为根目录的语句,可是后来又发现了真个系统存在重命名的问题。

操作系统设计一个二级文件管理系统

操作系统设计一个二级文件管理系统

计算机操作系统课程设计课程名计算机操作系统指导老师翟一鸣姓名陈凡君学号201190514114班级文计111-1专业计算机科学与技术实验日期2014.6.18课 程 名 称:操作系统课程设计 实验学时:1周/人 课 程 编 号: 学分:1课 程 总 学 时:一周 实验周学时:24 适用专业及年级:计算机科学与技术三年级 课 程 负 责 人:任满杰大 纲 撰 写 人:翟一鸣一、课程设计目标与基本要求本课程设计以Linux 操作系统为实验平台,进行源代码分析和修改。

通过该课程设计,使学生掌握Linux 操作系统各部分结构、实现机理和各种典型算法;系统地了解操作系统的设计和实现思路,运用内核开发环境实现对内核的修改,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

二、系统概要设计三、流程图序号名称内容1系统的主要功能dir 显示目录open name 打开目录 create 创建新目录delete 删除目录 rename 为目录重命名quit 退出登陆Help 显示所有可以操作的指令2运行环境开发环境:windowsXP Visual 2010 运行环境:windowsXP Visual 2010开发语言:C++3数据结构设计用户结构:账号与密码结构首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以结构体数组的形式存放于磁盘,这样便于查找和修改。

用户登录四、系统的主要源代码#include<stdio.h> #include<string.h>验证建立目录建立文件重命名目录删除编辑 删除重命名退出开辟空间是否#include<stdlib.h>//#include <time.h>int N=0; //记录用户数目struct MFILE{ //文件表char filename[19];char content[1000];int fileflag;};struct DIR{ //目录表char dirname[19];MFILE file[100];int filenum;int coflag;//char dircha_time[18];};struct USER{ //用户表char name[5];char password[5];DIR dir[100];int dirnum;} user[10];int check(char* name,char* password,int &userlo);void enter_dir(int userlo);void show_dir(int userlo);void open_dir(int userlo,char* ch1,int &filelo); void create_dir(int userlo,char* ch1);void delete_dir(int userlo,char* ch1); void re_dirname(int userlo,char* ch1,char* ch2);void enter_file(int userlo,int filelo); void show_file(int userlo,int filelo); void open_file(int userlo,char* ch1,int filelo); void close_file(int userlo,char* ch1,int filelo); void read_file(int userlo,char* ch1,int filelo); void create_file(int userlo,char* ch1,char* ch2,int filelo); void delete_file(int userlo,char* ch1,int filelo);void re_filename(int userlo,char* ch1,char* ch2,int filelo); void add_filestr(int userlo,char* ch1,char* ch2,int filelo); void main(){…}//主函数int check(char* name,char* password,int &userlo){…}//检索用户名和密码是否匹配void enter_dir(int userlo){…}//进入目录void show_dir(int userlo){…}//显示目录void create_dir(int userlo,char* ch1){…}//创建目录void delete_dir(int userlo,char* ch1){…}//删除目录void re_dirname(int userlo,char* ch1,char* ch2){ //重命名目录五、系统测试及调试创建打开目录重命名目录六、心得体会这次的课程设计给我们很大的收获,使我对操作系统的基本知识有了进一步的提高,并在实践中对各种概念有了进一步的深化,程序的设计思想的精巧的重要性,绝对不可以在操作的过程中粗心大意,仔细认真是不管怎么说都不为过的,好的设计可以让大家很快的明白你的思想,而且很方便的来实现它。

操作系统课程设计报告Linux二级文件系统设计

操作系统课程设计报告Linux二级文件系统设计

操作系统课程设计报告Linux二级文件系统设计操作系统课程设计报告专业:计算机科学与技术学号:******** 姓名:*** 提交日期:2013-3-8操作系统课程设计报告【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。

(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】二级文件系统设计【实验环境】 C++/VC++【相关知识综述】 1.背景知识(1)外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。

在逻辑上它的层次结构是这样的:文件系统接口对对象的操作和管理的软件集合逻辑文件系统基本I/O管理程序(文件组织模块)基本文件系统(物理I/O层) I/O控制层(设备驱动程序)对象及其属性说明作为产品的操作系统有各自的文件系统。

比如MS的WINDOWS 系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。

(2)linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。

它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。

inode 也是一个重要的数据结构。

文件系统中的每个目录和文件均由一个inode描述。

它包含:文件模式(类型和存取权限)、数据块位置等信息。

一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。

比如EXT2提供的OPEN/CLOSE接口操作。

(3)用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。

二级文件培训计划方案

二级文件培训计划方案

二级文件培训计划方案一、培训目的1. 引导培训对象了解和掌握二级文件的使用范围、编制原则和规范,提高文件管理水平,培养对文件管理工作的责任感和使命感。

达到规范文件管理、提高工作效率,加强员工文化素质的目的。

二、培训对象公司内各级各部门的管理人员、文秘及相关从业人员。

三、培训内容1. 二级文件的定义、功能和种类;2. 二级文件的编撰、审查、签发、传送流程;3. 电子文件的管理与运用;4. 文件保管的要求和流程;5. 文件档案的编制与管理规定;6. 文件安全与机密性保护。

四、培训方法1. 理论培训通过讲座、培训课程的方式,讲解二级文件的概念、要求和相关管理规定等内容。

2. 案例分析通过对实际工作中的典型案例进行分析,展示文件管理中的特殊情况处理方法和技巧。

3. 体验操作通过模拟文件审批和管理流程,让培训对象亲自操作,提高学员对文件管理流程和规范的认识和掌握。

五、培训计划1. 培训时间本次培训拟安排为连续2天的时间,每天8小时,包含理论培训、案例分析、体验操作以及考核。

2. 培训地点公司培训室或酒店会议室。

3. 培训人员公司内部文档管理专家或相关从业人员,具备丰富的实际工作经验,能够对培训对象进行全面、深入的指导。

4. 培训形式结合理论授课、案例分析和互动讨论的方式进行,让学员在轻松的氛围中加深对文档管理的理解,并能够灵活应用在实际工作中。

六、培训效果评估1. 考试评估培训结束后进行考试,考察培训对象对二级文件管理的理解和掌握情况。

2. 案例分析评估通过实际案例分析,考察学员在实际工作中对文件管理的应用能力和解决问题的能力。

3. 反馈调研培训结束后进行问卷调查,了解学员对培训的满意度和对于文件管理的改进建议。

七、培训后跟踪1. 定期回访对培训对象进行定期回访,了解培训效果和存在的问题,及时进行改进和调整。

2. 文件管理考核对培训对象在实际工作中的文件管理情况进行定期考核,及时根据考核情况进行奖惩和培训。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统二级文件管理课程设计课程设计名称:二级文件管理系统专业班级:学生姓名:学号指导老师:一、设计目的二、设计内容为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 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 Direct{ struct FCB{ char name[8]; //文件/目录名 8位char property; //属性 1位目录 0位普通文件int size; //文件/目录字节数、盘块数)int firstDisk; //文件/目录起始盘块号int next; //子目录起始盘块号int sign; //1是根目录 0不是根目录}directItem[MSD+2]; //最大子目录 5};struct OpenTable{ struct OpenTableItem{ char name[9]; //文件名int firstdisk; //起始盘块号int size; //文件的大小char open_flag; //文件打开标志:'1':打开。

'0':未打开}openitem[MOFN]; //最大文件打开数 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();#include<stdlib.h>#include"conio.h"#include "FileSystem.h"#include<string.h>int statue=0;char user[20]="li";char password[20]="123";int main(){ FILE *fp;char ch;char cmd[13];char name[10];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");}else{return 0;}}enter();//分析命令while(1){ printf("%s/>",bufferdir);scanf("%s",cmd);if(strcmp(cmd,"help") == 0 || strcmp(cmd,"?") == 0){ helpMenu();}else if(strcmp(cmd,"model") == 0){ printf("需要修改密码么(y/n)");scanf("%s",&ch);if (ch=='y'){ printf("请输入密码\b");scanf("%s",&password);printf("修改成功");}else{printf("退出修改密码\n"); }}else if(strcmp(cmd,"login") == 0){ while (login()!=LOGIN){ printf("请输入正确的用户名或密码\n");}{ 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");}else{ printf(" 成功创建文件! \n"); }}else if(strcmp(cmd,"open") ==0){ statue=1;scanf("%s",name);fd = open(name);if(fd == NOT_EXSIT){ printf("Error: \n 所要打开的文件不存在! \n");}else{printf("打开成功! \n");}}else if(strcmp(cmd,"write") == 0){ statue=2;scanf("%s",name);if(fd == NOT_OPEN){printf("Error:\n 该文件没有打开,请打开后再写入 \n");}else{printf("请输入文件的内容: ");scanf("%s",contect); //connect为一个长度为128字节的变量值flag=write(fd,contect,strlen(contect),name);if(flag == 0) //每个盘块可写入最多128字节{printf("已成功写入! \n");}else{printf("Error:\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");}else{flag = read(fd,contect,name);if(flag == 0){for(i=0;i<user_openTable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");// 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");}else{printf("已成功删除文件! \n");}}else if(strcmp(cmd,"dir") ==0)}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;i++){if(!strcmp(user_openTable.openitem[i].name, name))break;}if(i>=MOFN)printf("Error:\n 该文件没有打开,无需关闭!\n");else{//清空该文件的用户打开表项strcpy(user_openTable.openitem[i].name,"");user_openTable.openitem[i].firstdisk = -1;user_openTable.openitem[i].size = 0;user_openTable.openitem[i].open_flag = '0';user_openTable.cur_size--;printf("%s","close success!\n");continue;}}else if (strcmp(cmd,"rename") == 0){if (statue>=1){printf("打开文件不能重命名");}else{printf("%d",statue);flag=rename();if (flag==NOT_EXIT){printf("文件不存在\n");}}}else{printf("\n 指令错误! \n");int login(){char inuser[20];char inpassword[20];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('*');inpassword[j]=ch;j++;}inpassword[j]='\0'; //字符数组的最后一位为'\0',故要加该语句//printf("您输入的密码是:%s",inpassword);printf("\n");getchar();if ((strcmp(inuser,user)==0)&&(strcmp(inpassword,password)==0)) {bufferdir="wang";return LOGIN;}else{return 0;}}void init(){fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //分配空间void format(){int i;FILE *fp;fat = (struct FatItem *)(fdisk+DISKSIZE); //FAT 1M/*-----初始化FAT表 fat[1]---fat[7]------------*/for(i=1;i<ROOT_DISK_NO-1;i++) //for(i=1;i<8;i++){fat[i].item=i+1;fat[i].em_disk='1';}for(i=ROOT_DISK_NO;i<DISK_NUM;i++) //for(8;i<1024;i++) {fat[i].item = -1; //item为-1即表示还没有使用fat[i].em_disk = '0';}root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); //根目录的地址 1k+8kroot->directItem[0].sign = 1; //根目录root->directItem[0].firstDisk = ROOT_DISK_NO ; // = 9; //第9个盘块开始strcpy(root->directItem[0].name,"."); //定义其文件名为 '.' root->directItem[0].next = root->directItem[0].firstDisk; //子目录的起始盘块是根目录所在第一个盘块,即未出//第一块root->directItem[0].property = '1'; //1根目录root->directItem[0].size = ROOT_DISK_SIZE; //即一个根目录项的空间大小 196字节/*指向上一级目录的目录项-----回指指针*/root->directItem[1].sign = 1;root->directItem[1].firstDisk = ROOT_DISK_NO;strcpy(root->directItem[1].name,"..");root->directItem[1].next = root->directItem[0].firstDisk;root->directItem[1].property = '1';root->directItem[1].size = ROOT_DISK_SIZE;for(i=2;i<MSD+2;i++){ //子目录最大只有5个表项root->directItem[i].sign = 0;root->directItem[i].firstDisk = -1;strcpy(root->directItem[i].name,"");root->directItem[i].next = -1;root->directItem[i].property = '0';root->directItem[i].size = 0;}if((fp = fopen("disk.bat","wb"))==NULL){printf("Error:\n Can't 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;i<MOFN;i++){strcpy(user_openTable.openitem[i].name,"");user_openTable.openitem[i].firstdisk = -1;user_openTable.openitem[i].size = 0;}user_openTable.cur_size = 0;cur_dir = root;bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char));strcpy(bufferdir,"Root:");}{int i,j;//文件名超过8字符if(strlen(name)>8) //文件名大于 8位return(NAME_LONG);//重名checkfor(j=2;j<MSD+2;j++){//如果同名则跳出if(!strcmp(cur_dir->directItem[j].name,name) && cur_dir->directItem[j].property=='0')break;}//如果没循环完,则是因为文件已存在if(j<MSD+2) //文件已经存在return(ALREADY);//超过最大文件数目for(i=2;i<MSD+2;i++) //找到第一个空闲子目录{if(cur_dir->directItem[i].firstDisk==-1) //找到没有用到的break;}if(i>=MSD+2) //无空目录项return(-2);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) //找到空闲盘块 j 后退出{if(fat[j].em_disk=='0') //为所创建的文件分配盘块break; //此文件的大小应该是不加分配大小的,而是默认占用一个盘块} //确实如此if(j>=DISK_NUM)return(DISK_FULL);fat[j].em_disk = '1'; //将空闲块置为已经分配//填写目录项strcpy(cur_dir->directItem[i].name,name);cur_dir->directItem[i].firstDisk = j;cur_dir->directItem[i].size = 0;cur_dir->directItem[i].next = j;cur_dir->directItem[i].property = '0';return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) //文件是否存在,以文件名为标准{if(!strcmp(cur_dir->directItem[i].name,name))break;}if(i>=MSD+2)return(NOT_EXSIT);//查找一个空闲用户打开表项for(j=0;j<MOFN;j++) //根目录下最多占用5个文件{if(user_openTable.openitem[j].firstdisk==-1)break;}//填写表项的相关信息user_openTable.openitem[j].firstdisk = cur_dir->directItem[i].firstDisk; //cur_dir 最多5个strcpy(user_openTable.openitem[j].name,name);user_openTable.openitem[j].size = cur_dir->directItem[i].size;user_openTable.openitem[j].open_flag = '1';user_openTable.cur_size++;//返回用户打开表表项的序号return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(user_openTable.openitem[i].name, name))break;}if(i>=MOFN)return(6);//清空该文件的用户打开表项strcpy(user_openTable.openitem[i].name,"");user_openTable.openitem[i].firstdisk = -1;user_openTable.openitem[i].size = 0;user_openTable.openitem[i].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.openitem[fd].firstdisk;//找到当前目录所对应表项的序号for(i=2;i<MSD+2;i++){if(cur_dir->directItem[i].firstDisk==item)break;}temp = i; //存放当前目录项的下标while(fat[item].item!=-1){item = fat[item].item; /*-查找该文件的下一盘块--*/}//计算文件地址first = fdisk+item*DISKSIZE+user_openTable.openitem[fd].size%DISKSIZE;remain = DISKSIZE-user_openTable.openitem[fd].size%DISKSIZE;//如果最后磁盘块剩余的大小大于要写入的文件的大小if(remain > len){strcpy(first,buf);user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len;cur_dir->directItem[temp].size = cur_dir->directItem[temp].size+len;}else{for(i=0; i<remain; i++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/ilen1 = len - remain;ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)//寻找空闲磁盘块{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) //如果磁盘块已经分配完了return(DISK_FULL);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-remain-j*DISKSIZE;k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k+j*DISKSIZE+remain];}fat[item].item = i; //找到一块后将它的序号存放在上一块的指针中fat[i].em_disk = '1'; //置找到的磁盘的空闲标志位为已分配-*/fat[i].item = -1; //它的指针为 -1 (即没有下一块)-*/}//修改长度user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len;cur_dir->directItem[temp].size = cur_dir->directItem[temp].size+len;printf("%d\n",cur_dir->directItem[temp].size );}return 0;}int read(int fd, char *buf,char *name){int len = user_openTable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = user_openTable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/for(i=0;i<ilen1;i++){first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int rename(){int i;char strrename[8];char strnewname[8];printf("请输入要重命名的文件");scanf("%s",&strrename);// printf("%s",strrename);for(i=2;i<MSD+2;i++) //文件是否存在,以文件名为标准{if(!strcmp(cur_dir->directItem[i].name,strrename)){break;}}if(i>=MSD+2)return(NOT_EXSIT);printf("请输入新的命名(最大文件名长度为8)");scanf("%s",&strnewname);// cur_dir->directItem[i].name=strnewname;strcpy(cur_dir->directItem[i].name,strnewname);return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) //--查找要删除文件是否在当前目录中-{if(!strcmp(cur_dir->directItem[i].name,name) && cur_dir->directItem[i].property == '0')cur_item = i;// printf("--%d--",i);break;}if(i>=MSD+2) //--如果不在当前目录中return(NOT_EXIT);for(i=0;i<MOFN;i++) //如果文件打开,则不能删除,退出{if(!strcmp(user_openTable.openitem[i].name,name))return -NOT_OPEN;}item = cur_dir->directItem[cur_item].firstDisk;/*--该文件的起始盘块号-*/ while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk ='0';item = temp;}//释放目录项cur_dir->directItem[cur_item].sign = 0;cur_dir->directItem[cur_item].firstDisk = -1;strcpy(cur_dir->directItem[cur_item].name,"");cur_dir->directItem[cur_item].next = -1;cur_dir->directItem[cur_item].property = '0';cur_dir->directItem[cur_item].size = 0;return 0;}void dir(){int i,count=0;printf("\t文件名\t | \t文件大小\t\n");for(i=2;i<MSD+2;i++){if(cur_dir->directItem[i].firstDisk!=-1) /*-如果存在子目录-*/{count++;if(cur_dir->directItem[i].property=='0') /*-文件-*/{ printf("\t%s\t | \t %d\t \n",cur_dir->directItem[i].name,cur_dir->directItem[i].size);}else{ printf("\t目录名:");printf("%s\t",cur_dir->directItem[i].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 file\n");printf(" delete delete a file\n");printf(" open open a file\n");printf(" close close an openned file\n");printf(" write write to a file\n");printf(" read read an openned file\n");printf(" rename rename an openned file\n");printf(" dir showCurrent all files in current path \n");puts(" format format the disk");puts(" help show help messages");printf("**********二级文件管理系统**********\n");}五、心得体会。

相关文档
最新文档