操作系统课程设计二级文档管理系统.docx
《操作系统课程设计二级文档管理系统.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计二级文档管理系统.docx(41页珍藏版)》请在冰豆网上搜索。
操作系统课程设计二级文档管理系统
青岛科技大学
操作系统课程设计
计算机092
学生班级__________________________
学生学号__________________________
学生姓名__________________________
______年___月___日
操作系统课程设计
(二级文件管理系统)
一、课程设计要求
从所给题目中选择一个,分析设计要求,给出解决方案,建立必要的数据结构,设计总体流程(包括界面),详细设计必要的算法,测试结果。
基于Windows或Linux操作系统都可以,编程语言不限。
二、设计目的
深入了解文件管理系统,初步掌握文件管理系统的实现方法。
三、选择题目
设计一个简单的二级文件系统
设计内容:
编写程序模拟实现一个简单的文件管理系统,设计一个较实用的用户界面,方便用户使用。
设计要求:
提供以下相关文件操作:
(1)具有login(用户登录)
(2)系统初始化(建文件卷、提供登录模块)
(3)文件的创建:
create
(4)文件的打开:
open
(5)文件的读:
read
(6)文件的写:
write
(7)文件关闭:
close
(8)删除文件:
delete
(9)创建目录(建立子目录):
mkdir
(10)列出文件目录:
dir
(11)退出:
loyout
四、程序设计
(1)开发环境
Ubuntu11.10GCC(GNUCompilerCollection,GNU编译器套装)
C语言编程
(2)设计思想
文件管理仅针对相应用户,用户注册时,自动分配对应的文件空间,该用户所有的文件保存在该用户空间下。
用户只有对自己空间中的目录或文件具有权限。
文件管理系统,模拟Linux文件管理指令格式,模拟实现ls、cat、rm、cd、mkdir等基础文件管理指令,并具有较明朗的操作界面。
(3)流程设计
1、系统执行流程图
2、创建文件(夹)
3、删除文件(夹)
(4)主要模块设计
#defineMaxUser20//最大用户数
#definecommandAmount9//指令数
char_user[20];//当前用户名
charcurrentDir[255];//当前所在目录
typedefstructUserMess//所有用户信息
{
char_UserName[20];
char_UserPwd[20];
structUserMess*nextUser;
}_UserMess;
_UserMess*firstUser;
typedefstructFolderDir//目录路径信息
{
char_Dir[255];
structFolderDir*fatherDir;
}_RootDir;
_RootDir*rootFolder;
typedefstructFolder//当前目录子目录信息
{
char_FolderName[100];
structFolder*nextFolder;
}_Folder;
_Folder*firstFolder;
typedefstructFile//当前目录下文件信息
{
char_FileName[100];
structFile*nextFile;
}_File;
_File*firstFile;
(5)功能函数设计
voidinit();//初始化部分内容
intReadUserMess();//读取已有用户信息
intuserCreate(intsumUsers);//用户注册
intlogin();//登录
voidcreateRootFolder(charusername[]);//为新用户分配空间
voidTraverseFolder(charpath[]);//遍历文件及文件夹
voidListFileAndFolder();//显示当前文件夹下所有文件
voidChangeDir(charfolderName[]);//目录跟换
voidDelete(charfName[]);//删除文件或文件夹
voidCatFile(charfName[]);//打开文件,查看文件内容
voidAddContent(charfName[]);//向文件写入内容
voidCreateFile(charfName[]);//创建文件
voidCreateFolder(charfolderName[]);//创建文件夹
voidHelpFile();//帮助文件
(6)运行部分截图
图1模拟的指令预览,以及系统支持指令格式
图2用户登录,并查看根目录下所有文件及文件夹
图3查看文件内容,并写入信息
图4目录跳转功能
图5删除文件、删除目录
五、程序代码
#include
#include
#include
#include
#include
#include
#defineMaxUser20
#definecommandAmount9
char_user[20];
charcurrentDir[255];
typedefstructUserMess
{
char_UserName[20];
char_UserPwd[20];
structUserMess*nextUser;
}_UserMess;
_UserMess*firstUser;
typedefstructFolderDir
{
char_Dir[255];
structFolderDir*fatherDir;
}_RootDir;
_RootDir*rootFolder;
typedefstructFolder
{
char_FolderName[100];
structFolder*nextFolder;
}_Folder;
_Folder*firstFolder;
typedefstructFile
{
char_FileName[100];
structFile*nextFile;
}_File;
_File*firstFile;
voidinit();//初始化部分内容
intReadUserMess();//读取已有用户信息
intuserCreate(intsumUsers);//用户注册
intlogin();//登录
voidcreateRootFolder(charusername[]);//为新用户分配空间
voidTraverseFolder(charpath[]);//遍历文件及文件夹
voidListFileAndFolder();//显示当前文件夹下所有文件
voidChangeDir(charfolderName[]);//目录跟换
voidDelete(charfName[]);//删除文件或文件夹
voidCatFile(charfName[]);//打开文件,查看文件内容
voidAddContent(charfName[]);//向文件写入内容
voidCreateFile(charfName[]);//创建文件
voidCreateFolder(charfolderName[]);//创建文件夹
voidHelpFile();//帮助文件
intmain()
{
intlogined=0;
intselect;
charch;
charorder[commandAmount][9];
strcpy(order[0],"create");
strcpy(order[1],"rm");
strcpy(order[2],"cat");
strcpy(order[3],"write");
strcpy(order[4],"ls");
strcpy(order[5],"cd");
strcpy(order[6],"exit");
strcpy(order[7],"mkdir");
strcpy(order[8],"help");
charcommand[15],command_str1[255];
inti,j;
init();
intuserNum=ReadUserMess();
//printf("Usercount:
%d\n",userNum);
intisright=1;
while(isright==1)
{
printf("********************************************\n");
printf("1、Creatuser\n");
printf("2、login\n");
printf("********************************************\n");
printf("Pleasechoocethefunctionkey:
>");
intchoice;
setbuf(stdin,NULL);
scanf("%d",&choice);
if(choice==1)
{
logined=userCreate(userNum);
isright=0;
}
elseif(choice==2)
{
logined=login(userNum);
isright=0;
}
}
TraverseFolder(currentDir);
if(logined==1)
{
while(logined)
{
//command[0]=0;
for(i=0;i<15;i++)
{
command[i]=0;
}
for(i=0;i<255;i++)
{
command_str1[i]=0;
}
//command_str1[0]=0;
setbuf(stdin,NULL);
printf("\n%s:
~$",_user);
for(i=0,j=0;ch=getchar();i++)
{
if(j==1)
{
if(ch==''||ch=='\n')
{
command_str1[i]=0;
break;
}
else
{
command_str1[i]=ch;
}
}
if(j==0)
{
if(ch=='')
{
i=-1;
j++;
}
elseif(ch=='\n')
{
command[i]=0;
break;
}
else
{
command[i]=ch;
}
}
}
printf("\n");
for(i=0;i{
if(!
strcmp(command,order[i]))
{
select=i;
break;
}
}
if(i==commandAmount)
{
printf("Undefinedcommand!
\n");
continue;
}
switch(select)
{
case0:
if(command_str1!
=NULL)
{
CreateFile(command_str1);
}
else
{
printf("Donothasnormalfilename,createfailed!
\n");
}
break;
case1:
if(command_str1!
=NULL)
{
Delete(command_str1);
}
else
{
printf("Donothasnormalfileordirname,createfailed!
\n");
}
break;
case2:
if(command_str1!
=NULL)
{
CatFile(command_str1);
}
else
{
printf("Donothasnormalfilename,createfailed!
\n");
}
break;
case3:
if(command_str1!
=NULL)
{
AddContent(command_str1);
}
else
{
printf("Donothasnormalfilename,createfailed!
\n");
}
break;
case4:
TraverseFolder(currentDir);
ListFileAndFolder();
break;
case5:
if(command_str1!
=NULL)
{
ChangeDir(command_str1);
}
else
{
printf("Donothasnormaldirname,createfailed!
\n");
}
break;
case6:
logined=0;
break;
case7:
if(command_str1!
=NULL)
{
CreateFolder(command_str1);
}
else
{
printf("Donothasnormaldirname,createfailed!
\n");
}
break;
case8:
HelpFile();
break;
}
TraverseFolder(currentDir);
}
}
}
voidHelpFile()
{
printf("———————————————————————————————————————\n");
printf("create-创建格式:
createa1,将创建名为a1的文件\n");
printf("rm-删除格式:
rma1,将删除名为a1的文件或文件夹\n");
printf("cat-查看文件内容格式:
cata1,显示a1的内容\n");
printf("write-写入格式:
writea1\n");
printf("ls-显示文件格式:
ls,显示所有文件\n");
printf("cd-跳转目录格式:
cddir或cd..dir为路径\n");
printf("exit-退出程序格式:
exit\n");
printf("mkdir-创建文件夹格式:
mkdira1,将创建文件夹a1\n");
printf("help-查看帮助格式:
help\n");
printf("————————————————————————————————————————\n");
}
voidCreateFile(charfName[])
{
charfSavePath[255];
strcpy(fSavePath,currentDir);
strcat(fSavePath,"/");
strcat(fSavePath,fName);
_File*fi;
fi=firstFile;
while(fi->nextFile!
=NULL)
{
if(strcmp(fi->_FileName,fName)==0)
{
printf("FilesisExist!
Createfailed!
\n");
return;
}
fi=fi->nextFile;
}
FILE*fp;
fp=fopen(fSavePath,"w");
if(fp==NULL)
{
printf("Filecreatefailed!
\n");
}
else
{
printf("Filecreatesuccess!
\n");
}
TraverseFolder(currentDir);
}
voidTraverseFolder(charpath[])
{
_Folder*p;
_File*q;
firstFolder=(_Folder*)malloc(sizeof(_Folder));
firstFolder->nextFolder=NULL;
firstFile=(_File*)malloc(sizeof(_File));
firstFile->nextFile=NULL;
structdirent*entry=NULL;
DIR*pDir;
pDir=opendir(path);
while(NULL!
=(entry=readdir(pDir)))
{
if(entry->d_type==8)
{
q=(_File*)malloc(sizeof(_File));
strcpy(q->_FileName,entry->d_name);
q->nextFile=firstFile;
firstFile=q;
//printf("%s",entry->d_name);
}
elseif(entry->d_type==4)
{
if((strcmp(entry->d_name,".")!
=0)&&(strcmp(entry->d_name,"..")!
=0)&&(entry->d_name[0]!
='.'))
{
p=(_Folder*)malloc(sizeof(_Folder));
strcpy(p->_FolderName,entry->d_name);
p->nextFolder=firstFolder;
firstFolder=p;
//printf("Folder:
%s",entry->d_name);
}
}
//d_type:
4表示目录,8表示文件
}
}
voidListFileAndFolder()
{
_File*fi;
fi=firstFile;
printf("\n************************************************************\n");
printf("Files:
\n");
while(fi->nextFile!
=NULL)
{
printf("%s",fi->_FileName);
fi=fi->nextFile;
}
printf("\n\n");
_Folder*fo;
fo=firstFolder;
printf("Folders:
\n");
while(fo->nextFolder!
=NULL)
{
printf("%s",fo->_FolderName);
fo=fo->nextFolder;
}
printf("\n");
printf("****************************************************************\n");
}
voidDelete(charfName[])
{
printf("%s",fName);
intisExist=0;
charfSavePath[255];//文件或文件夹存储完整路径
strcpy(fSavePath,currentDir);
_File*fi;
fi=firstFile;
while(fi->nextFile!
=NULL)
{
if(strcmp(fi->_FileName,fName)==0)
{
isExist=1;
break;
}
fi=fi->nextFile;
}
if(isExist==1)
{
strcat(fSavePath,"/");
strcat(fSavePath,fName);
remove(fSavePath);
printf("\nFile\"%s\"deletesuccess!
\n",fName);
}
_Folder*fo;
fo=firstFolder;
while(fo->nextFolder!
=NULL)
{
if(strcmp(fo->_FolderName,fName)==0)
{
isExist=1;
break;
}
fo=fo->nextFolder;
}
if(isExist==1)
{
strcat(fSavePath,"/");
strcat(fSavePath,fName);
rmdir(fSavePath);
printf("\nFolder\"%s\"deletesuccess!
\n",fName);
}
TraverseFolder(currentDir);
}
voidCatFile(charfName[])
{
charch;
intisExist=0;
charfSavePath[255];//文件或文件夹存储完整路径
strcpy(fSavePath,currentDir);
_File*fi;
fi=firstFile;
while(fi->nextFile!
=NULL)
{
if(strcmp(fi->_FileName,fName)==0)
{
isExist=1;
break;
}
fi=fi->nextFile;
}
if(isExist==1)
{
strcat(fSavePath,"/");
strcat(fSavePath,fName);
FILE*fp;
fp=fopen(fSavePath,"r");
if(fp==NULL)
{
printf("Filenotexist!
\n");
}
else
{
printf("\n%s\'sContent:
****************************\n",fName);
ch=f