广工_操作系统_课程设计_源代码

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

课程设计
课程名称________操作系统___ ____
题目名称_多用户多级目录文件系统的实现_ 学生学院________计算机学院____________
专业班级______ _________
学号________ ___________
学生姓名_________ _____________
指导教师__________林穗______________
2011年1月18日
广东工业大学课程设计任务书
题目名称多用户多级目录文件系统的实现
学生学院计算机学院
专业班级08软件工程一班
姓名
学号
一、课程设计的内容
本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

二、课程设计的要求与数据
1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2.文件物理结构可采用显式链接或其他方法。

3.磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。

5.设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:(1)具有login (用户登录)
(2)系统初始化(建文件卷、提供登录模块)
(3)文件的创建:create
(4)文件的打开:open
(5)文件的读:read
(6)文件的写:write
(7)文件关闭:close
(8)删除文件:delete
(9)创建目录(建立子目录):mkdir
(10)改变当前目录:cd
(11)列出文件目录:dir
(12)退出:logout
6.系统必须可实际演示,选用程序设计语言:C++、C等。

三、课程设计应完成的工作
1.充分理解设计的任务,完成设计的基本要求。

然后根据自己的基础和能力选择不同难度的算法和实现方式,以取得更高的分数。

2. 独立独立完成系统的分析、设计、编码、测试工作。

3.完成设计报告的撰写。

4.以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计报告”的书面和电子两种版本。

四、课程设计进程安排
五、应收集的资料及主要参考文献
[1]计算机操作系统,汤小丹等,西安电子科技大学出版社
[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)
[3] 计算机操作系统教程( 第二版),张尧学、史美林,清华大学出版社
[4] 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社
发出任务书日期:2010年12月22日指导教师签名:林穗
计划完成日期:2011年1月21日基层教学单位责任人签章:滕少华
目录
i.设计目的…………………………………………………………………
ii.开发工具与环境…………………………………………………………
iii.设计思想…………………………………………………………………
iv.系统结构说明……………………………………………………………
v.数据结构说明……………………………………………………………vi.各模块的算法流程图……………………………………………………
1、程序总体源流程图……………………………………………………
2、主要模块的算法流程图………………………………………………
3、函数声明………………………………………………………………vii.程序运行及清单…………………………………………………………
1、用户管理操作界面……………………………………………………
2、文件管理操作界面……………………………………………………
3、主要核心源代码………………………………………………………viii.操作说明书………………………………………………………………
1、用户管理使用手册…………………………………………………
2、文件操作管理使用手册……………………………………………ix.体会和建议………………………………………………………………………
i.设计目的
本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

ii.开发工具与环境
a)程序设计语言:C语言
b)计算机及操作系统:PC机,WindowsXP
c)开发平台:Microsoft Visual C++ 6.0简化版
d)运行平台:PC机,WindowsXP
iii.设计思想
课程设计采用Microsoft Visual C++ 6.0简化版作为开发工具,参照了windows资源管理器的结构,模拟文件管理的工作过程,通过创建一棵多叉树,及对这棵多叉树的操作,建立了一个树型文件系统,实现了文件和文件夹的创建,打开,读写,删除,关闭,复制,粘贴,查看,属性设置等十来个功能。

操作界面简单明了,操作方便。

iv.系统结构说明
模拟文件管理系统可以自行设置多个用户进行管理操作,当选择已有用户时便可进入其文件管理菜单进行相应的操作(有界面提示功能),当进入系统已建立的某个用户时,可以创建用户自己的文件夹或文件,当flag=0时为创建文件,flag=1时创建文件夹(这里设置了标志位)。

文件除了名称和打开标志外,还可对他们的访问权限、文件类型和文件长度进行设置(长度设置主要在写入文件时会用到);而文件夹则可以设置访问权限等,打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的链表中包括文件夹名称及其地址等;对文件
的管理包含复制、打开、关闭、写入、读出、粘贴、新建文件(夹)、删除文件(夹)和显示文件(夹)等等,为方便操作还设置了各功能操作(如进入下一级、返回上一级、返回初始菜单、直接退出等等)。

下面的系统结构说明图示:
其中P表示parent指针,C表示child指针,N表示next指针v.数据结构说明
该模拟文件管理系统的文件目录检索采用简单的线性搜索,系统所采用的数据结构:
typedef struct list LIST;
struct list
{
char listname[10];
int type;
int length;
int protect;
int flag;
char *content;
struct list *parent;
struct list *child;
struct list *next;
};
typedef struct usd USD;
struct usd
{
char username[10];
LIST *list;
struct usd *next;
};
vi.各模块的算法流程图
1.程序总体流程图
2.主要模块的算法流程图1)创建用户模块:
2)删除用户
3)创建文件(夹)
4)删除文件夹
5)复制文件
3.函数声明
void displayusermenu();///用户管理界面菜单void time();///系统时间
void displayfilemenu();///文件管理界面菜单
void creatuser();///新建用户
void deleteuser();///删除用户
void displayuser();///显示用户
void userhelp();///用户管理帮助
void filehelp();///文件管理帮助
void selectuser();///选择用户
void displaylist();///显示文件或者文件夹
void creatfile(LIST *qq,int flag);///创建文件(夹)
void deletefile(LIST *qq,int flag);///删除文件(夹)
void openfile();///打开文件
void readfile(); ///读取文件
void writefile(); ///写入文件
void closefile();///关闭文件
void next();///下一层文件夹
void back();//上一层文件夹
void copyfile();//复制文件
void pastedfile();///粘贴文件
void quit();///直接退出系统
vii.程序运行及清单
系统界面简洁美观实用,用户无须输入过长指令就可以完成操作。

本系统还附带操作指南,用户如有疑问可查看指南说明。

虽不如可视化易操作,但也不难。

1、用户管理操作
1)程序登陆界面
2)程序开始界面(即用户管理界面)
3)新建用户
4)列出用户
5)删除用户
6)系统日期时间
7)帮助文档
8)退出系统
9)选择用户
输入用户名(若系统无此用户会有提示)按回车后即进入文件操作界面。

2、对文件管理操作
1)进入用户后对文件操作初始界面
2)新建文件
3)新建文件夹
4)显示当前路径文件(夹)
5)删除文件
文件存在时
6)删除文件夹
文件夹存在时
7)打开文件
文件存在时
8)读出文件
文件需要先置于打开状态,方可读取
由于没有输入内容所以文件内容为空。

9)写入文件
10)读出刚才写入的内容
11)关闭文件
12)复制文件(先将刚才关闭的文件aa1打开再复制)
如果输入的文件名不存在该用户中时会有提示信息
3、主要核心源代码(见电子版)
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include "stdlib.h"
#define NULL 0
#define get(type) (type *)malloc(sizeof(type)) //分配空间
typedef struct list LIST;
struct list
{
char listname[10]; // 文件名长度
int type;
int length; // 文件长度
int protect; // 保护模式,0为只读,1为可读写
int flag; // 标志,为0时创建文件夹,为1时创建文件char *content;
.
struct list *parent;
struct list *child;
struct list *next;
};
typedef struct usd USD;
struct usd
{
char username[10]; // 用户名长度
LIST *list;
struct usd *next;
};
// 函数声明
void displayusermenu(); // 用户管理界面菜单void login(); // 系统登陆界面
void time(); // 系统时间
void displayfilemenu(); // 文件管理界面菜单void creatuser(); // 新建用户
void deleteuser(); // 删除用户
void displayuser(); // 显示用户
void userhelp(); // 用户管理帮助
void filehelp(); // 文件管理帮助
void selectuser(); // 选择用户
void displaylist(); // 显示文件或者文件夹void creatfile(LIST *qq,int flag);// 创建文件(夹)
void deletefile(LIST *qq,int flag);// 删除文件(夹)
void openfile(); // 打开文件
void readfile(); // 读取文件
void writefile(); // 写入文件
void closefile(); // 关闭文件
void next(); // 下一层文件夹
void back(); // 上一层文件夹
void copyfile(); // 复制文件
void pastedfile(); // 粘贴文件
void quit(); // 直接退出系统
USD *user=NULL,*currentuser=NULL;
LIST *list=NULL,*currentlist=NULL,*copylist=NULL;
void displayusermenu() // 显示用户菜单
{
system("cls"); // 清屏
int button;
printf("\n\n\t\t\t欢迎使用多用户多级目录文件系统\n\n"); printf("\t\t计算机学院\t\t软件工程1班\n\n");
printf("\t\t \t\t \n\n\n");
printf("\t\t1、新建用户\n");
printf("\t\t2、删除用户\n");
printf("\t\t3、选择用户\n");
printf("\t\t4、列出用户\n");
printf("\t\t5、系统时间\n");
printf("\t\t6、帮助文档\n");
printf("\t\t7、退出系统\n\n");
printf("\t\t请按功能选择操作:");
scanf("%d",&button);
switch(button)
{
case 1:
creatuser();
break; // 创建新用户
case 2:
deleteuser();
break; // 删除用户
case 3:
selectuser();
displayfilemenu();
break; // 选择一个用户case 4:
displayuser(); // 显示用户
getchar();
getchar();
displayusermenu();
break;
case 5:
system("cls"); //系统时间显示
time();
displayusermenu();
break;
case 6:
userhelp(); // 帮助
getch();
displayusermenu();
break;
case 7:
system("cls"); // 退出
printf("\n\n\n\t\t\t\t欢迎再次使用!!\n\n");
getch();
exit(0);
break;
default :
printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");
getch();
displayusermenu();
break; // 输入非上述数字重新输入
}
}
void displayfilemenu() // 显示文件管理操作菜单
{
system("cls"); // 清屏
int choice;
LIST *p=currentlist;
printf("\n\t\t [%s]你好,欢迎进入文件管理系统\n",currentuser->username);//提示信息
printf("\n 当前的文件路径:");// 接入目录地址
do{
printf("<%s",p->listname);
p=p->parent;
}while(p!=NULL);
printf("\t\t[格式:子目录<--根目录]\n\n");
printf(" 功能选择\n\n");//菜单
printf("\t\t1、新建文件\t\t\t 9、复制文件\n");
printf("\t\t2、删除文件\t\t\t10、粘贴文件\n");
printf("\t\t3、新建文件夹\t\t\t11、显示当前路径文件(夹)\n");
printf("\t\t4、删除文件夹\t\t\t12、进入下一级文件夹\n");
printf("\t\t5、打开文件\t\t\t13、返回上一级文件夹\n");
printf("\t\t6、读出文件\t\t\t14、返回用户管理菜单\n");
printf("\t\t7、写入文件\t\t\t15、帮助与支持\n");
printf("\t\t8、关闭文件\t\t\t16、直接退出系统\n\n");
printf("
\n\n");
printf("\t\t\t按功能选择选择相应的操作(输入相关数字): ");
scanf("%d",&choice);
printf("\n");
system("cls");
switch(choice)//switch语句
{
case 1:
creatfile(currentlist,0);
break; // 创建文件case 2:
deletefile(currentlist,0);
break; // 删除文件case 3:
creatfile(currentlist,1);
break; // 创建文件夹case 4:
deletefile(currentlist,1);
break; // 删除文件夹case 5:
openfile();
break; // 打开文件case 6:
readfile();
displayfilemenu();
break; // 读出文件case 7:
writefile();
displayfilemenu();
break; // 写入文件
case 8:
closefile();
break; // 关闭文件
case 9:
copyfile();
break; // 复制文件
case 10:
pastedfile();
break; // 粘贴文件
case 11:
displaylist(); // 显示文件(夹)
getch();
displayfilemenu();
break;
case 12:
next();
break; // 进入下一级文件夹case 13:
back();
break; // 返回上一级文件夹case 14:
displayusermenu();
break; // 退出,返回上用户管理菜单case 15:
filehelp();
displayfilemenu();
break;
case 16:
quit();
break;
default :
printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");
getch();
displayfilemenu();
break; // 非法输入,返回文件管理菜单重新输入}
}
void login()
{
char username[20];
char password[20];
printf("\n\n\n\n");
printf("\t\t\t系统登陆:(用户密码均为admin)\n\n");
printf("\t\t\t请输入用户名:");
scanf("%s",username);
printf("\t\t\t请输入密码:");
scanf("%s",password);
if(strcmp(username,"admin")||strcmp(password,"admin"))
{
printf("\n\t\t用户名或密码错误,请重新输入!\n");
getch();
system("cls");
login();
}
}
void time() // 显示系统时间日期
{
time_t now; // 调用系统日期时间
time(&now);
printf("\n\n \t\t\t系统当前日期时间\n\n");
printf("\t\t\t %s",asctime(localtime(&now)));//显示系统详细时间printf("\n\n\n");
getch();
}
void creatuser() // 创建用户
{
int i;
char s;
USD *p,*q=user;
system("cls");
p=get(USD);
for(i=1;q!=NULL;i++)q=q->next; // i指示当前用户个数q=user;
printf("\n\t\t\t\t[创建一个新用户]\n");
printf("\n\t\t\t\t请输入NO.%d个用户名: ",i);
scanf("%s",p->username); //输入新用户的名字
LIST *l=list;
l=get(LIST);
strcpy(l->listname,p->username);
l->next=NULL;
l->type=1;
l->parent=NULL;
l->child=NULL;
p->list=l;
p->next=NULL;
if(user==NULL)
{
user=p; // 若user为空,则把P复给user
}
else // 若user不为空,则以有旧用户存在
{
while(q->next!=NULL){ // 寻找最后一个用户
if(strcmp(p->username,q->username)==0){ // 比较,看系统是否已经存在该用户
printf("\n\tthe user has exit ! try again !\n\n"); // 提示出错信息
getchar();getchar();system("cls");
displayusermenu();
}
q=q->next;
}
if(strcmp(p->username,q->username)==0){///检查提示重名并提示信息printf("\n\t\t\t该用户已经存在!无法创建该用户!\n\n");
getchar();getchar();system("cls");
displayusermenu();
}
q->next=p; //继续寻找下一个字符
}
printf("\n\t\t\t\t是否要再创建一个用户?(Y/N):"); //输入下一个用户
scanf("%s",&s);
switch(s){
case 'y':creatuser();break;
case 'Y':creatuser();break;
case 'n':displayusermenu();break;
case 'N':displayusermenu();break;
default :displayusermenu();break;
}
}
void deleteuser() //删除用户
{
char n[10];
USD *p=user,*pre=NULL;
displayuser();
if(!p){printf("\n\t\t\t\t系统无用户可删除!\n"); //P为空,报错,必须先创建一个用户
getchar();getchar();system("cls");
displayusermenu();}
printf("\n\n\t\t\t\t请输入要删除的用户名:");
scanf("%s",n);
while(p!=NULL)
{
if(strcmp(p->username,n)==0) //寻找所要删除的用户{
if(p==user)
{
user=user->next; //若是第一个用户,则释放P }
else
{
pre->next=p->next;
}
free(p);
printf("\n\n\n\t\t\t\t 已经成功删除用户[%s]!!! ",n);
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p==NULL) //找不到用户
{
printf("\n\n\t\t\t找不到该用户!请确认该用户是否存在!\n");
}
getchar();getchar();system("cls"); displayusermenu();
}
void selectuser() //选择用户
{
char n[10];
USD *p=user;
displayuser();
if(!p){printf("\n\t\t\t该用户不存在!请确认用户名是否正确!!!"); //没有用户getchar();getchar();system("cls");
displayusermenu();}
printf("\n\t\t\t\t[选择一个用户]");
printf("\n\n\t\t\t\t请输入用户名:");
scanf("%s",n); //输入用户名
while(p!=NULL)
{
if(strcmp(p->username,n)==0) //逐个比较寻找用户
{
currentuser=p; //找到对应用户,则把currentuser指向该用户
currentlist=p->list;
printf("%s\n",currentlist->listname);
return;
}
else
{
p=p->next;
}
}
if(p==NULL) //找不到用户
{
printf("\n\n\t\t\t\t该用户不存在!!!");
getchar();
system("cls");
displayusermenu();
}
}
void creatfile(LIST *qq,int flag) //创建文件(夹)
{
LIST *temp;
LIST *p=qq->child;
LIST *q;
temp=get(LIST);
loop:
q=qq->child;
if(flag==0)
{
printf("\n\t\t\t\t[创建一个新文件]\n");
printf("\n\t\t\t\t请输入新建文件名: "); //输入文件名}
else
{
printf("\n\t\t\t\t[创建一个新文件夹]\n");
printf("\n\t\t\t\t请输入新建文件夹名: "); //输入文件名}
scanf("%s",temp->listname);
while(q!=NULL)
{
if(strcmp(temp->listname,q->listname)==0)
{
printf("\n\t\t\t相同路径下有重名文件!请重新输入!");
goto loop;
}
q=q->next;
}
temp->content=NULL;
printf("\n\t\t文件属性: 0、只读Read\t\t1、读和写Read&Write"); //设置保护模式
printf("\n\n\t\t\t请根据提示选择保护模式(0/1)?: ");
scanf("%d",&temp->protect);
if(temp->protect!=0&&temp->protect!=1)
{ printf("\n\n\t\t\t你的选择有误!请重新输入(0/1)?: ");
scanf("%d",&temp->protect);
}
if(flag==0)
{
printf("\n\t\t\t\t请输入该文件的长度: "); //设置文件长度,供写入文件时会用到
scanf("%d",&temp->length);
}
if(flag==0)
temp->type=0; //0为文件
else temp->type=1;
temp->flag=0; //文件默认为关闭状态,以后需要时再打开temp->child=NULL;
temp->next=NULL;
temp->parent=currentlist;
if(p==NULL)
{qq->child=temp;}
else
{
while(p->next!=NULL)
{p=p->next;}
p->next=temp;
}
getchar();
displayfilemenu();
}
void deletefile(LIST *qq,int flag) //删除文件(夹)
{
char n[10];
LIST *p=qq->child;
LIST *pre=NULL;
if(flag==0)
{
printf("\n\t\t\t\t[删除一个文件]\n");
printf("\n\t\t\t\t请输入要删除的文件名: ");
}
else
{
printf("\n\t\t\t\t[删除文件夹]\n");
printf("\n\t\t\t\t请输入要删除的文件夹名: ");
}
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0))
{
if(pre==NULL) //第一个节点
{
qq->child=p->next;free(p);
printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);
}
else
{
pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件
printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);
free(p);
}
break;
}
else if((strcmp(p->listname,n)==0)&&(p->type==1))
{
if(pre==NULL) //第一个节点
{
qq->child=p->next;free(p);
printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);
}
else
{
pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件
printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);
free(p);
}
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p==NULL&&flag==0) //该文件不存在
printf("\n\n\t\t\t\t找不到该文件!");
else if(p==NULL&&flag==1) printf("\n\n\t\t\t\t找不到该文件夹!\n");
getchar(); //用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中)
getchar();
displayfilemenu();
}
void openfile() ////打开文件
{
char n[10];
LIST *p=currentlist->child;
printf("\n\t\t\t\t[打开一个文件]\n");
printf("\n\t\t\t\t请输入要打开的文件名: ");//输入文件名
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0))//比较文件以寻找要打开的文件
{
p->flag=1;
printf("\n\t\t\t\t文件%s成功打开!!!\n",n);
break;
}
else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))
{
printf("\n\t\t\t\t文件%s打开已经!!!\n",n);
break;
}
p=p->next;
}
if(p==NULL)
{
printf("\n\n\t\t\t\t找不到该文件!\n");
}
getchar();
getchar();
displayfilemenu();
}
void readfile() //读出文件
{
char n[10];
LIST *p=currentlist->child;
printf("\n\t\t\t\t[读取一个文件]\n");
printf("\n\n\t\t\t\t请输入要读的文件名: ");
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//比较
{
printf("\n\t\t\t文件%s内容是:%s",p->listname,p->content);
getchar();getchar();system("cls");
return;
}
p=p->next;
}
printf("\n\n\t\t读文件失败,请确认该文件是否已经打开或文件是否存在!\n");
getchar();
getchar();
}
void writefile() //写入文件
{
char n[10],*temp;
LIST *p=currentlist->child;
printf("\n\t\t\t\t[写入文件]\n");
printf("\n\t\t\t\t请输入要写的文件名: ");
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0))
{
if(p->flag==0)
{printf("\n\t\t\t文件未打开,无法写入!请将文件置打开状态!!!\n");getchar();getchar();system("cls");}
else if(p->protect==0)
{
printf("\n\n\t\t\t操作受限!该文件不能写!!!\n"); //该文件限制读写
getchar();
system("cls");
return;
}
else
{
temp=(char *)malloc(sizeof(char)*p->length);
printf("\n\n\t\t\t\t请输入文件内容(length<=%d):\n\n\t",p->length);
scanf("%s",temp);
p->content=temp;
getchar();
system("cls");
}
return;
}
p=p->next;
}
printf("\n\n\t\t\t该文件不存在!获取失败!!!\n");//提示
getchar();
getchar();
}
void closefile() //关闭文件
{
char n[10];
LIST *p=currentlist->child;
printf("\n\t\t\t\t[关闭一个文件]\n");
printf("\n\t\t\t\t请输入要关闭的文件名: ");
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//寻找需要文件
{
p->flag=0;
printf("\n\t\t\t\t文件%s关闭成功.\n",n);
break;
}
else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0))
{。

相关文档
最新文档