操作系统-文件系统课程设计报告

更新时间:2024-05-23 06:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《操作系统》课程设计

题目名称 多用户多级目录共享文件系统的实现 _ 学生学院 计算机学院 专业班级 10级计算机科学与技术7班 学 号 学生姓名 指导教师 刘老师

20年月 日

一、 可行性分析

随着信息化进程,文件管理越来越受到重视,并且逐渐成为国内外业界研究的热点。在现有的操作系统中,几乎都是通过文件系统来组织和管理计算机中所存储的程序和数据等大量的文件。

在现代OS中,几乎毫毛例外地是通过文件系统来组织和管理在计算机中存储 和大量程序和数据的;或者说,文件系统的管理功能,是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。而文件则是指具有文件名的若干相关元素的集合。元素通常是记录,而记录又是一组有意义的数据项的集合。

通过分析,可知文件系统对大多数文件的操作,器过程大致都是这样两步:第一步是通过检索文件目录来找到指定文件的属性及其在外存上的位置;第二步是对文件实施相应的操作,如读文件或写文件。为了便于管理和控制文件,根据系统管理员或用户所规定的存取控制属性,将文件分为只读文件、读写文件和只执行文件三类。而文件系统的模型主要分为三个层次,分别是对象及其属性、对对象的操纵和管理的软件集合、文件系统接口,其最底层的是对象及其属性;中间层对对象进行操纵和管理的软件集合;最高层是文件系统提供给用户的接口。

用户通过文件系统所提供的系统调用实施对文件的操作,如创建文件、删除无文件、读文件、写文件等,为了方便用户使用文件而提供了更多对文件的操作,如打开和关闭文件。

软硬件可行性分析:本模拟系统的实现需要一台PC机作为硬件设备,此外,软件开发环境包括:Win7、VC++6.0,.因此,该模拟系统具备实现条件,综合分析,系统在成本、技术、操作上,都是可行的。

技术可行性分析:在当前的技术条件下,该系统的各个功能模块在理论上而言都是能实现的;根据自己掌握的技术情况,在规定的期限内,系统的开发设计能完成。

二、 需求分析

1、 功能需求分析

功能划分:本模拟系统主要针对文件的管理和操作名主要有:创建用户、文件、文件夹,读文件,写文件,执行文件,关闭文件,删除用户、文件夹、文件的功能。

创建用户、文件、文件夹:在对系统发出操作命令之前必须先登录用户,然而登录之前必须要已经创建该用户。在创建完用户后,可通过登录用户来创建文件和文件夹。在创建文件时可设置文件的属性和输入文件的内容。

读文件:可通过登录用户来读取任何已创建的只读或读写文件的内容;如果所要读的文件不是可读文件时,系统会显示该文件不可读;如果所读文件不存在,系统会显示文件不存在。

写文件:登录用户后,用户可写或重写读写文件中的内容,并保存文件中的重写内容,以供下次读取;当所要写的文件不是可写的文件时,系统会显示该文件不可写;当所要写的文件并不存在时,系统会显示该文件不存在。

执行文件:登录用户后,用户可执行系统中已创建的执行文件;当该文件不是可执行文件时,系统会显示该文件不可执行;当该文件不存在时,系统将会显示该文件不存在。

关闭文件:可通过选择关闭文件的功能选项,来关闭系统中所有打开的文件,如果没有文件被打开,则系统会显示没有文件打开。

删除用户、文件、文件夹:登录用户后,用户可通过选择删除的功能选项来删除不想再保存的文件和文件夹,删除后,用户会自动注销;当选择删除用户的功能选项时,系统会删

除该用户,以及该用户所创建的所有文件和文件夹。

2、 非功能需求分析

在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调入内存。如果有用户注解管理外存上的文件,不仅要求用户熟悉外存特性,了解各文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。显然,这是用户所不能胜任、也不愿意承担的工作。于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。

在该课程设计中,主要设计了一个模拟的多用户的二级共享的文件系统。通过对用户的管理,文件和文件夹的物理结构,目录的结构和对文件、文件夹的操作的实现,来对系统中的所有文件进行管理。

三、 概要设计

1、整体思路概述

运行程序时,首先系统要进行初始化,然后等待输入操作类型,但是在未创建用户之前,只能进行显示目录(此时为空目录)和退出的操作。当用户创建成功后,即可通过登录用户来创建文件和文件夹。在输入操作选项之后,必须先登录用户,当确认用户身份正确后,系统才能根据指定的命令进行操作,否则,不能进行操作,必须创建用户后,才能以该用户的身份进行操作。操作完之后,用户会自动退出,没发出一个操作命令,用户必须登录一次。只有在发出的命令是显示目录或退出或返回上级目录时,才不需要用户的登录。

2、 数据流图

显示目录 3 创建用户 创建文件 创建 1 创建文件夹 模 拟 5 上级菜单 主菜单输入文件 退出 界面 系统 删除用户 2 删除文件 删除 4 删除文件夹 上级菜单 文件操作

读文件 写文件 执行文件 打开文件 关闭文件 显示目录 上级菜单

3、 功能流程图 创建 退出 创创读创 建建文建 件 用文文 户 件件 夹

开始 输入功能选文件操作 显示目录 删除 写文件 执行文件 打开文件 关闭文件 显示目录 删除用户 删除文件 删除文件夹 四、 详细设计

1、实现原理

本程序是一个文件系统模拟程序,模拟文件管理的工作过程。

本程序设计一个最多有10个用户的文件系统,实现文件系统的模拟管理过程,可以

进行创建用户、删除用户、创建文件、删除文件、创建文件夹、删除文件夹、读文件、写文件、执行文件、打开文件、关闭文件、显示目录等操作。

程序设置了主目录MFD、用户文件目录UFD和用户文件夹目录UDD,为打开文件设置了运行目录AFD。

文件保护简单使用了保护码:只读为’r’,读写为’wr’,只执行为’do’,其他则表示不允许读写、执行。

MFD 用户名 文件目录指针 文件夹目录指针 用户名 文件目录指针 文件夹目录指针 。 。 UFD 文件名 保护码 文件长度 文件内容 下一文件指针 UDD

AFD 打开文件名 保护码 文件内容 读写指针

文件夹名 下一文件夹指针 下一文件指针 子文件夹指针

2、重要数据结构说明

typedef struct ufd{…}是文件的数据结构,即用户文件目录。

typedef struct udd{…}是文件夹的数据结构,即用户文件夹目录。 typedef struct mfd{…}是用户的数据结构,即主文件目录。 typedef struct afd{…}是运行中文件的数据结构。

typedef struct sfile{…}是指向文件的索引节点的数据结构。

1)用户的数据结构

typedef struct mfd{ char username[10];/*用户名*/ struct ufd *link;/*指向该用户的第一个文件*/ struct udd *clink;/*指向该用户的第一个文件夹*/

}MFD;

用来描所创建用户的信息的结点,包含用户名、指向用户文件和文件夹的两个指针。所以的结点都存放在一个名字为filesysten的数组中。

2)文件夹的数据结构

typedef struct udd{ char foldername[10];/*文件夹名*/ struct ufd *clink;/*指向该文件夹的第一个文件*/ struct udd *cnext;/*指向该文件夹的第一个文件夹*/ struct udd *link;/*指向同级文件夹*/

}UDD;

用来描述文件夹的信息的结点。

3)文件的数据结构

typedef struct ufd{ char filename[10];/*文件名*/ char filecon[100];/*文件内容*/ char procode[8];/*属性*/ int length;/*文件长度*/ struct ufd *nextfile;/*指向下一个文件*/

}UFD;

用来描述文件信息的数据结构,同个用户的文件结点用一条链链接在一起。

4)运行文件的数据结构

typedef struct afd{/*运行文件目录*/ char filename[10];/*打开文件名*/ char filecon[100];//文件内容 char procode[4];//属性 int rwpointer;/*读写指针*/ }AFD;

存放着运行文件的信息,标示着某文件正在执行,当关闭文件时,释放结点。

5)共享文件的结点的数据结构

typedef struct sfile{ char username[10]; //用户名 struct ufd *file; //共享的文件 struct sfile *next; //指向下一个共享文件的指针 }SFILE;

每一个文件都有一个共享的结点,该节点存放文件的信息、文件的创造者的名字和指向下一个共享文件的指针,所有文件的共享结点链接在一起,由sharefile指针指向该共享链。

3、重要函数说明

void displayallfile()是用于显示目录的函数;在实验中,我将创建的所有用户都存储在一个结点数组中,每个用户结点都有指向其文件和文件夹的指针,通过遍历结点数组来遍历用户,通过用户的指针来遍历用户的文件和文件夹。

void createuser()是用于创建用户的函数;将创建的用户以mfd结点的结构存储在filesystem数组中。

int findusername(char * username)是用户查找用户的函数,当找到函数时返回保存用户的节点的下标;当返回值大于等于用户个数时,表示找不到用户。

void deleteuser()是用于删除用户的函数;在filesystem数组中寻找指定名字的用户,当找到该用户时,将用户从数组中删除,并将数组中该用户后面的其他用户的下标往前移一位,即减一;如果找不到指定用户,则输出:“用户不存在!删除失败!”。

sfile* findsharefile(char *filename)是用于查找共享文件的函数,当找到共享文件锁时返回指向该文件的节点指针,如果找不到,则返回空。

UFD * findfilename(char *filename,UFD *filepointer)是查找文件的函数,返回指向特定文件名的指针,或返回值为NULL。

UDD * findfoldername(char *foldername,UDD *folderpointer)是查找文件夹的函数,返回指向特定文件名的指针,或返回值为NULL。

void displayfile(UFD *link)是用于显示文件属性的函数。

void createfile()是用于创建文件的函数;当要创建文件时,首先输入登录的用户名,如果该用户不存,输入是否创建用户,否则退出,是的话则创建用户,然后再创建文件;当用户存在时,则直接创建文件。创建文件时,若该登录的用户的文件中没有同名文件,则直接创建,否则输出:“文件名已存在,请输入新的文件名!”,通过输入新的文件名后再创建文件。每创建一个文件,都会为文件创建一个共享结点,添加到共享链中。

void createfolder()是用于创建文件夹的函数;首先输入登陆的用户名,然后再创建,步骤与穿件文件相似,只是没有共享结点。

void deletefile()是用于删除文件的函数;首先查找文件所属用户,然后再查找文件,找到则删除,否则删除失败。

void deletefolder()是用于删除文件夹的函数。

AFD * openfile()是用于打开文件的函数,当找到文件时打开文件,创建该文件的运行文件结点,并返回;找不到文件时,返回值为NULL;当要打开一个文件之前,首先先登录,如果登录的用户不存在则不能打开文件,如果用户存在,输入需要打开的文件名,如果用户没有创建该文件则寻找共享文件中是否存在其他用户创建的该文件,有则打开,为文件创建运行文件的结点,没有则输出不存在该文件。在对文件的所有操作之前都需要先调用该函数打开文件,才能进行操作。

void closefile()是用于关闭文件的函数;关闭文件时释放文件的运行文件结点。

void readfile()是用于读文件的函数;打开文件后首先判断文件是否可读,如果是可读文件则读出文件中的内容,否则输出文件不可读。

void writefile()是用于写文件的函数;首先打开文件,判断文件是否可写。 void executefile()是用于执行文件的函数。

//菜单,即有关用户界面的函数

void menu()是主菜单,程序执行时就会显示该菜单,初始化界面,并通过该菜单选择相应的功能选项。

void menu1()是menu的一个子菜单,包含了所有的创建功能选项和返回上级菜单的选项;

void menu2()是menu的一个子菜单,包含了所有的删除功能选项和返回上级菜单的选项;

void menu3()是menu的一个子菜单,包含了对文件的各种操作选项、返回上级菜单的选项和显示目录的选项。

4、 相关代码

UFD *rw_pointer;/*读写指针*/ AFD *afd=NULL; //运行文件

MFD filesystem[10]; //存放用户的数组 sfile *sharefile=NULL;//共享文件

void displayallfile()/*显示目录*/ { int i; UFD *p; //指向某个文件的指针 UDD *q; // 指向用户文件目录的指针 system(\清屏*/ printf(\ printf(\显示目录\\n\

printf(\ for(i=0;inextfile; } while(q) { printf(\文件夹名: %s\\n\ q=q->link; } } }

void createuser()/*建立用户*/ { int i; char username[10]; system(\清屏*/ printf(\ printf(\建立用户\\n\

printf(\

if(num>=10)/*用户文件目录已满,创建文件失败*/ { printf(\用户已满\\n创建文件失败!\\n\ return; } printf(\输入用户名:\\n\ scanf(\ for(i=0;i

strcpy(filesystem[num].username,username); num++; printf(\用户已创建!\\n\}

/*-查找用户*/

int findusername(char * username)//返回用户名下标,当I=NUM时,用户不存在 { int i; i=0; while(i

void deleteuser()/*删除用户*/ { int i; char cs,username[10]; UFD *p1,*p2; UDD *p3,*p4; system(\清屏*/ printf(\ printf(\删除用户\\n\

printf(\

printf(\输入用户名:\\n\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i>=num) { printf(\用户不存在!\\n删除失败!\\n\ return ; } else { printf(\是否删除用户%s及用户%s下所有东西?(y/n)\

cscanf(\ if(cs=='y') { p1=p2=filesystem[i].link;//用户的第一个文件 while(p2) { p2=p2->nextfile; free(p1); p1=p2; } p3=p4=filesystem[i].clink;//用户的第一个文件夹 while(p2) { p4=p4->link; free(p3); p3=p4; } for(i;i

sfile* findsharefile(char *filename) /*查找共享文档*/ { sfile *k; k=sharefile; while(k && strcmp(filename,k->file->filename))

k=k->next; return k; }

/*-查找文件*/

UFD * findfilename(char *filename,UFD *filepointer)//返回指向特定文件名的指针,或返回值为NULL*/

{ UFD *k; k=filepointer; while(k&&strcmp(filename,k->filename)) k=k->nextfile; return k; }

/* 查找文件夹*/

UDD * findfoldername(char *foldername,UDD *folderpointer)//返回指向特定文件名的指针,或返回值为NULL*/

{ UDD *k; k=folderpointer; while(k&&strcmp(foldername,k->foldername)) k=k->link; return k; }

void displayfile(UFD *link) /*显示文件属性*/ { UFD *p; p=link; if(!p) { printf(\此目录没有该文件!\ return; } printf(\用户文件如下:\\n\ while(p) { printf(\ printf(\ printf(\ p=p->nextfile; } }

void createfile()/*-创建文件*/ { char cx; char username[10]; char filename[10]; int i,j; UFD *p1,*p2,*newfile; sfile *q1 = sharefile; system(\清屏*/ printf(\ printf(\创建文件\\n\

printf(\ if(num>=10)/*用户文件目录已满,创建文件失败*/ { printf(\用户文件目录已满\\n创建文件失败!\\n\ return; } printf(\输入登录的用户名:\\n\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件*/

{ printf(\用户不存在,是否建立用户?(y/n)\ cscanf(\ printf(\ if(cx=='y') { strcpy(filesystem[num].username ,username);/*创建用户目录*/ num++; /*为刚创建的用户建立文件*/ newfile =(UFD *)malloc(sizeof(UFD));//为新建文件分配空间 newfile->nextfile=NULL; filesystem[num-1].link=newfile;//该新建用户的第一个文件为newfile

printf(\文件名:\ scanf(\ printf(\属性(r只读,wr读写,do可执行):\ scanf(\ printf(\长度:\ scanf(\ printf(\文件已创建!\\n\

if(sharefile==NULL) { sharefile=(sfile*)malloc(sizeof(sfile)); sharefile->file=filesystem[num-1].link; strcpy(sharefile->username, username); sharefile->next=NULL; } else { q1=(sfile*)malloc(sizeof(sfile)); q1->file=filesystem[num-1].link; strcpy(q1->username, username); q1->next=sharefile; sharefile=q1; } } else { return; } } else/*为已存在的用户建立文件*/ { p1=p2=filesystem[i].link ; printf(\输入文件名:\ scanf(\ if(!p1) { newfile=(UFD *)malloc(sizeof(UFD)); newfile->nextfile=NULL; strcpy(newfile->filename,filename); printf(\属性(r只读,wr读写,do可执行):\ scanf(\ printf(\长度:\ scanf(\ filesystem[i].link=newfile; if(sharefile==NULL) { sharefile=(sfile*)malloc(sizeof(sfile)); sharefile->file=filesystem[i].link; strcpy(sharefile->username, username); sharefile->next=NULL; } else

{

q1=(sfile*)malloc(sizeof(sfile)); q1->file=filesystem[i].link; strcpy(q1->username, username); q1->next=sharefile; sharefile=q1; } } else {

while(p2) {

if (!strcmp(p2->filename,filename)) {

printf(\文件名已存在,请输入新文件名!\\n\ scanf(\ } p1=p2;

p2=p2->nextfile; }

newfile=(UFD *)malloc(sizeof(UFD)); newfile->nextfile=NULL;

strcpy(newfile->filename,filename);

printf(\属性(r只读,wr读写,do可执行):\ scanf(\ printf(\长度:\

scanf(\ p1->nextfile=newfile; if(sharefile==NULL) {

sharefile=(sfile*)malloc(sizeof(sfile)); sharefile->file=p1->nextfile;

strcpy(sharefile->username, username); sharefile->next=NULL; } else {

q1=(sfile*)malloc(sizeof(sfile)); q1->file=p1->nextfile;

strcpy(q1->username, username); q1->next=sharefile; sharefile=q1; } }

printf(\文件已创建!\\n\ }

printf(\是否输入文件内容?(y/n)\ cscanf(\ printf(\ if(cx=='y') { printf(\请输入文件内容,用'#'键结束\\n\ cscanf(\ for(j=0;newfile->filecon[j]!='#';j++) { cscanf(\ }

newfile->length=j; } printf(\ }

void createfolder()/*-创建文件夹*/ { char cx; char username[10]; char foldername[10]; int i; UDD *p1,*p2,*newfolder; system(\清屏*/ printf(\ printf(\创建文件夹\\n\

printf(\ if(num>=10)/*用户文件目录已满,创建文件夹失败*/ { printf(\用户文件目录已满\\n创建文件失败!\\n\ return; } printf(\输入登录的用户名:\\n\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件夹*/

{ printf(\用户不存在,是否建立用户?(y/n)\ cscanf(\ printf(\

if(cx=='y') { strcpy(filesystem[num].username ,username);/*创建用户目录*/ num++; {/*为刚创建的用户建立文件夹*/ newfolder =(UDD *)malloc(sizeof(UDD)); newfolder->cnext=NULL; //该文件夹的第一个子文件夹 newfolder->clink=NULL; //该文件夹的第一个子文件 newfolder->link=NULL; //该文件夹的下一个同级文件夹 filesystem[num-1].clink=newfolder; //该用户的第一个文件夹 printf(\文件夹名:\ scanf(\ printf(\文件夹已创建!\\n\ } } else { return; } } else/*为已存在的用户建立文件夹*/ { p1=p2=filesystem[i].clink ; printf(\输入文件夹名:\ scanf(\ if(!p1)//该用户还没有任何文件夹 { newfolder=(UDD *)malloc(sizeof(UDD)); newfolder->cnext=NULL;//该文件夹的第一个子文件夹为空 newfolder->clink=NULL;//该文件夹的第一个子文件为空 newfolder->link=NULL; //该文件夹的下一个同级文件夹为空 strcpy(newfolder->foldername,foldername); filesystem[i].clink=newfolder; } else { while(p2) { if (!strcmp(p2->foldername,foldername)) { printf(\文件夹名已存在,请输入新文件夹名!\\n\ scanf(\ } p1=p2;

p2=p2->link; } newfolder=(UDD *)malloc(sizeof(UDD)); newfolder->cnext=NULL;//该文件夹的第一个子文件夹为空 newfolder->clink=NULL;//该文件夹的第一个子文件为空 newfolder->link=NULL; //该文件夹的下一个同级文件夹为空 strcpy(newfolder->foldername,foldername); p1->link=newfolder; } printf(\文件夹已创建!\\n\ } }

void displayuser()//显示用户目录 { int i; if(num<=0) return; printf(\用户目录如下! \ for(i=0;i

void deletefile()/*删除文件*/ { int i; char cy; char username[10]; char filename[10]; UFD *p1,*p2; system(\清屏*/ printf(\ printf(\删除文件\\n\

printf(\ printf(\输入用户名:\\n\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i>=num)//找不到该用户 { printf(\用户不存在!\\n删除失败!\ return ; } else {

printf(\输入文件名:\ scanf(\ p1=p2=filesystem[i].link;//用户的第一个文件 while(p2&&strcmp(p2->filename,filename)) { p1=p2; p2=p2->nextfile; } if(!p2)//该用户名下没有文件或不存在指定文件 printf(\文件不存在!\\n删除失败!\\n\ else { printf(\是否删除文件%s?(y/n)\ cscanf(\ if(cy=='y') { if(p1==p2) filesystem[i].link=p1->nextfile; else p1->nextfile=p2->nextfile; free(p2); printf(\文件已删除!\\n\ } else return; } } }

void deletefolder()/*删除文件夹*/ { int i; char cy; char username[10]; char foldername[10]; UDD *p1,*p2; system(\清屏*/ printf(\ printf(\删除文件夹\\n\

printf(\ printf(\输入用户名:\\n\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i>=num)

{ printf(\用户不存在!\\n删除失败!\ return ; } else { printf(\输入文件夹名:\ scanf(\ p1=p2=filesystem[i].clink; while(p2&&strcmp(p2->foldername,foldername)) { p1=p2; p2=p2->link; } if(!p2) printf(\文件夹不存在!\\n删除失败!\\n\ else { printf(\是否删除文件夹%s及文件夹%s cscanf(\ if(cy=='y') { if(p1==p2) filesystem[i].clink=p1->link; else p1->link=p2->link; free(p2); printf(\文件夹已删除!\\n\ } else return; } } }

AFD * openfile()/*打开文件*/ { char username[10]; char filename[10]; int i; char ch; sfile *k; UFD *p=NULL;

下所有东西?(y/n)\

system(\清屏*/ switch(choice) { case 1: printf(\ printf(\读文件\\n\

printf(\ break; case 2: printf(\ printf(\写文件\\n\

printf(\ break; case 3: printf(\ printf(\执行文件\\n\

printf(\ break; case 4: printf(\ printf(\打开文件\\n\

printf(\ break; } printf(\输入登录的用户名:\ scanf(\ i=findusername(username);/*返回用户名下标*/ if(i>=num)/*用户不存在*/ { printf(\用户不存在!\\n不能打开文件!\\n\ return NULL; } else/*用户存在*/ { printf(\输入文件名:\ scanf(\ p=findfilename(filename,filesystem[i].link); if(!p)/*用户文件不存在*/ { printf(\该用户没有创建指定文件!\ k=(sfile*)malloc(sizeof(sfile)); k=findsharefile(filename); if(k==NULL) {

return NULL; } else { printf(\存在由%s创建的共享件%s-------\\n\\n\

printf(\是否打开该文件?(y/n):\ scanf(\ while(1) { scanf(\ if(ch=='n') return NULL; else if(ch=='y') { afd=(AFD *)malloc(sizeof(AFD));//运行文件 strcpy(afd->filename,k->file->filename); strcpy(afd->procode,k->file->procode); strcpy(afd->filecon,k->file->filecon); afd->rwpointer=0;//读写指针 printf(\文件已打开!\\n\ rw_pointer=p;/*为了读文件保留指针*/ /*打开运行文件目录AFD*/ printf(\文件目录AFD:\\n\ printf(\文件名 : %s\\n\ printf(\属性 : %s\\n\ printf(\读写指针 : %d\\n\ return afd; } else { printf(\输入格式不规范,请重新输入:\ } } } } else {/*找到用户文件*/ afd=(AFD *)malloc(sizeof(AFD));//运行文件 strcpy(afd->filename,p->filename); strcpy(afd->procode,p->procode); strcpy(afd->filecon,p->filecon); afd->rwpointer=0;//读写指针 printf(\文件已打开!\\n\ rw_pointer=p;/*为了读文件保留指针*/

/*打开运行文件目录AFD*/ printf(\文件目录AFD:\\n\ printf(\文件名 : %s\\n\ printf(\属性 : %s\\n\ printf(\读写指针 : %d\\n\ } } return afd; }

void closefile()/*关闭文件*/ { if(!afd) { printf(\没有文件打开!\\n\ return; } free(afd); afd=NULL; printf(\文件已关闭!\\n\}

void readfile()/*读文件*/ { int j; AFD *p; p=openfile(); if(!p) return; if(strcmp(p->procode,\文件属性为非读或非读写类型即不能作读*/

printf(\文件不可读!\\n\操作*/ else { printf(\已读取文件!\\n\ printf(\文件名:%s\ printf(\属性:%s\\n\

// printf(\读写指针:%ld\\n\ printf(\文件内容为:\\n\ for(j=0;j<100,p->filecon[j]!='#';j++) { printf(\ } }

closefile();/*关闭文件*/ }

void writefile()/*写文件*/ { int j; AFD *p;/*运行文件目录*/ UFD *k; p=openfile(); k=rw_pointer; if(!p) return; if(strcmp(p->procode,\ { printf(\该文件不能写!\\n\ return; } else { p->rwpointer=rand()%k->length; k->length=p->rwpointer ;/*修改读书指针写回文件*/ printf(\请修改文件内容:\\n\ for(j=0;j<100,k->filecon[j]!='#';j++) { printf(\ } cscanf(\ for(;k->filecon[j]!='#';j++) { cscanf(\ } k->length=j; } printf(\已完成写操作!\\n\ printf(\文件名 : %s\\n\ printf(\属性 : %s\\n\ printf(\长度 : %d\\n\ closefile(); }

void executefile()/*-执行文件*/ { AFD *p; p=openfile(); if(!p)

{ printf(\文件不存在!\\n\ return; } if(strcmp(p->procode,\ { printf(\该文件不能执行!\\n\ printf(\文件属性为不可执行文件!\\n\ return; } else { closefile(); printf(\文件执行完毕!\ } }

void menu()/*初始化界面*/ { void menu1(); void menu2(); void menu3(); system(\

printf(\ printf(\文件管理系统\\n\

printf(\ printf(\创建\\n\ printf(\删除\\n\ printf(\显示目录\\n\ printf(\文件操作\\n\ printf(\退出\\n\ printf(\请输入你的选择 : \

scanf(\选择相应的序号,执行相应的操作*/ switch(choice) { case 1:menu1(); break; case 2:menu2(); break; case 3:displayallfile(); break; case 4:menu3(); break; case 5:exit(0);

default:

ex=0; break; } }

void menu1()/*创建功能的菜单*/ {

system(\清屏*/

printf(\ printf(\文件管理系统\\n\

printf(\ printf(\上级菜单\\n\ printf(\创建用户\\n\ printf(\创建文件\\n\ printf(\创建文件夹\\n\ printf(\请输入你的选择 : \

scanf(\选择相应的序号,执行相应的操作*/ switch(choice) {

case 0: menu(); break; case 1: createuser(); break; case 2: createfile(); break; case 3: createfolder(); break; default:

ex=0; break; } }

void menu2()/*删除功能的菜单*/ {

system(\清屏*/

printf(\ printf(\文件管理系统\\n\

printf(\

printf(\上级菜单\\n\ printf(\删除用户\\n\ printf(\删除文件\\n\ printf(\删除文件夹\\n\ printf(\请输入你的选择 : \

scanf(\选择相应的序号,执行相应的操作*/ switch(choice) { case 0: menu1(); break; case 1: deleteuser(); break; case 2: deletefile(); break; case 3: deletefolder(); break; default:

ex=0; break; } }

void menu3()/*有关文件操作功能的菜单*/ { system(\清屏*/

printf(\ printf(\文件管理系统\\n\

printf(\ printf(\上级菜单\\n\ printf(\读文件\\n\ printf(\写文件\\n\ printf(\执行文件\\n\ printf(\打开文件\\n\ printf(\关闭文件\\n\ printf(\显示目录\\n\ printf(\请输入你的选择 : \

scanf(\选择相应的序号,执行相应的操作*/ switch(choice) { case 0: menu(); break;

case 1: readfile(); break; case 2: writefile(); break; case 3: executefile(); break; case 4: openfile(); break; case 5: closefile(); break; case 6: displayallfile(); break; default:

ex=0; break; } }

void main()/*主函数*/ { int i; char ch; ex=1; num=0; for(i=0;i<10;i++)//初始化filesystem { filesystem[i].link=NULL; filesystem[i].clink=NULL; } while(ex) { menu(); cscanf(\ printf(\按任意键继续......\\n\ scanf(\ } }

五、 测试

1、 开始界面

2、 正常情况下的测试

创建用户、文件夹、文件:

文件操作:

删除文件和文件夹前后目录比较:

删除用户前后比较

用户B读取用户A创建的a文件:

3、 鲁棒性测试

六、总结

在做课程设计之前我想了很久,怎样真的打开硬盘上的文件、如何读取硬盘上的文件、如何将创建的文件和文件夹保存到硬盘,通过百度、翻阅书籍查找资料,了解了一些打开文件、关闭文件、查找文件等的函数。本来是想用文件夹的方式保存用户,一个用户用一个文件夹来表示,这样就能把用户保存在硬盘上,,但是如果为文件创建一个索引节点的话又该如何保存节点,而且如何保存保存指向节点的指针。想通了一个问题又有另一个问题出现,实在没办法,就只能用虚拟的形式来实现了。

一开始,我是先实现实验册上的要求,在实现过程中出现了很多的错误,很多语法错误,如can’t convert from int * to …(记不清怎么写的了),很多次出现这种错误,通过检查指定地方的赋值类型,和变量的类型,修改了很久才终于解决这个错误。有时错误并不一定在它所指地方,而是在上面,也可能是它上面所调用的函数,由于不怎么擅长调试,所以改了很久才能运行成功。

在完成实验要求后,本来想增加多级和共享的功能,但是由于对于多级,思路并不是很清晰,所以就只能先实现共享。本来有比较清晰的思路,知道要怎么添加的额,但是在实现过程中总是出现意想不到的错误,语法错误还是比较容易解决的,但是还出现了运行错误,在我所创建指针的位置,运行的时候总是被中断,执行不下去,我反复地检查了我的代码,在中断处不断地修改,终于可以运行到下一步了,但是程序又在下面出现了中断,最后没办法,只能请同学教我调试,通过调试,知道了原来是在createfile()函数中,指向共享文件的指针出现了错误。指针总是从创建的第二个文件才开始保存,所以导致其他用户无法读取第一个用户所创建的第一个文件。在知道错误后,再次不断地检查代码,一步一步调试,终于程序不再被中断,能正常运行,虽然花费了同学很多时间,但是我学到了很多,也知道了调试是怎样的。

虽然通过上面的调试,程序基本上没问题了,但是还是有个小问题,就是在openfile()函数中的while(1)循环中,当第一次进入循环时,循环体内的第一个语句——输入语句scanf(\总是不被执行,导致ch为空,直接进入下面的if…else if…else语句进行判断,只有在第二次执行循环体的时候才会被执行。想了很久不知道为什么,最后我尝试在while循环之前加了一个输入语句:scanf(\,程序就正常了,虽然已经把问题解决,但是还没想懂是为什么,目前还在思考中。

通过这次课程设计,我真的学到挺多的,除了学会了调试之外,也更好地了解了文件系统和文件系统对文件的操作,如何实现共享,通过翻阅相关书籍和网上查询相关资料,了解了更多有关C的以前没用过的函数,也对VC++6.0有了进一步的了解。

本文来源:https://www.bwwdw.com/article/je57.html

Top