操作系统课程设计文件系
统管理
Newly compiled on November 23, 2020
操作系统课程设计 文件系统管理 学 院 计算机学院 专 业 计算机科学与技术 班 级 姓 名 学 号
2013年1月8日
评定等级 广东工业大学计算机学院制
文件系统管理
一、实验目的
模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求
编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。 以下报告主要包括:
1.可行性分析 2.需求分析
3.概要设计 4.详细设计 5.测试 6.总结
三、可行性分析
1、技术可行性
对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性
课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性
自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析
编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索
五、概要设计
为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录
MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。 本设计主要实现下面几个数据结构:
M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 A F D 打开文件名 打开保护码 读写指针 文件名 · · · 总体的流程图如下:
六、详细设计
主要数据结构:
(Master File Directory),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。所以,MFD结构仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性结构。 struct MFD {
char name[20]; UFD(User File Directory),用于存放文件的数据结构。由于本设计为了加快检索速度,使用了二叉排序树的结构,所以UFD结构中相应加入了用于树结构的parent,leftchild,和rightchild记录链接情况。
当本文件为普通文件时,为下级记录申请AFD(file),folder为空。同样,当本文件为文件夹时,为它申请相应的空间,AFD为空。以此来达到无穷级别目录的存储。
struct UFD {
UFD *parent; UFD *leftchild; UFD *rightchild; UFD *folder; \"); printf(\"\\n\");
temp=temp->link; } }
void BSTtraverse(UFD *fileBST) 以区分文件夹 printf(\"..\\"); else
printf(\"\\");
if(fileBST->leftchild!=NULL) 创建文件 \\n\"); printf(\" 2. 创建文件夹 \\n\"); printf(\" 3. 取消 \\n\"); printf(\"请选择:\\n\"); scanf(\"%c\ fflush(stdin); if(s=='3')return; if(s!='1'&&s!='2')
printf(\"输入错误,请重新输入!\\n\"); }while(s!='1'&&s!='2');
if(strcmp(fileBST->name,\"NULL\")==0) 追加 \\n\");
printf(\" 2. 重写 \\n\"); printf(\" 3. 取消 \\n\"); printf(\"请选择:\\n\");
scanf(\"%c\ fflush(stdin); if(s=='3')return; if(s!='1'&&s!='2')
printf(\"输入错误,请重新输入!\\n\"); }while(s!='1'&&s!='2');
printf(\"请输入要重写或追加的内容(<100):\"); scanf(\"%s\ fflush(stdin);
if(s=='1') \\"); stemp=stemp->link; }
printf(\"\\n是否尝试在共享文件夹中打开(y/n):\"); do {
s=getchar();
if(s=='n'||s=='N')return NULL; else if(s=='y'||s=='Y')break;
else printf(\"输入错误,请重新输入:\"); }while(s!='y'&&s!='n'&&s!='Y'&&s!='N'); stemp=share_file; while(stemp!=NULL) {
if(strcmp(stemp->file->name,name)==0) {temp=stemp->file;break;} stemp=stemp->link; }
return temp; }
UFD *operations(UFD *fileBST) {
while(1) {
char s; system(\"cls\"); if(open_file!=NULL) {
printf(\"已打开文件,请及时关闭!\\n\"); printf(\"文件名\文件长度\读写\共享\内容\");
printf(\"\\n\");
print_open_file(); printf(\"\\n\"); }
printf(\"当前路径:\");
print_path(fileBST); printf(\"\\n\");
if(strcmp(fileBST->name,\"NULL\")==0) printf(\"本层文件为空!\\n\"); else
{ printf(\"本文件夹包含以下文件:\\n\"); BSTtraverse(fileBST); }
printf(\"\\n\");
printf(\" 1. 创建文件 create \\n\"); printf(\" 2. 删除文件 delete \\n\"); printf(\" 3. 打开文件 open \\n\"); printf(\" 4. 关闭文件 close \\n\"); printf(\" 5. 读文件 read \\n\"); printf(\" 6. 写文件 write \\n\"); printf(\" 0. 返回上一层/注销 printf(\"请选择: \");
printf(\"\");
scanf(\"%c\ fflush(stdin); switch(s) { case '1':
fcreate(fileBST); break; case '2':
fileBST=fdelete(fileBST); break; case '3':
\\n\\n\");
fopen(fileBST); break; case '4': fclose(); break; case '5': case '6':
fread_write(fileBST,s); break; case '0':
return fileBST; default:break; } } }
void Log_in() {
MFD *temp=NULL; char name[30]; char flag='0';
if(mfd_link==NULL) {
printf(\"目前还没有创建用户,请创建后再登陆!\"); getch(); return; } do {
printf(\"请输入用户名:\"); scanf(\"%s\ fflush(stdin);
if(strcmp(name,\"cancel\")==0)
return; 登录 \\n\"); printf(\" 2. 添加新用户 \\n\"); printf(\" 3. 查看已注册用户 \\n\"); printf(\" 0. 退出 \\n\\n\"); printf(\" 请选择: \");
printf(\"\");
scanf(\"%c\ fflush(stdin);
if(s!='0'&&s!='1'&&s!='2'&&s!='3') { printf(\"输入错误,请重新输入:\"); getch();
fflush(stdin); continue; }
switch(s) {
case '1': Log_in(); break; case '2':
Init_user(); break; case '3':
Check_user(); break; case '0': return 1; default:break; } }
return 0; }
七、测试
登录操作:
以下为对文件的六个基本操作:
无穷级文件、文件路径的显示,以及打开一个不存在的文件的示例: 打开普通文件后的情况,此时不能删除文件: 本系统未能实现级联删除,操作被禁止: 关闭文件后删除操作成功:
逐个删除后“文件系统”文件夹也可以删除了:
八、总结
本次课程设计设计的知识比较广,需要较好的理解能力和编程能力。 在本次设计中,花费时间比较多的应该是数据结构的设计与更改了。在开始时仅仅按照实验指导书上的MDF、UFD、AFD做了相应的数据结构,而且里面包含的数据比较少。初衷是在以后的实现时需要再加进去。但是,在以后加进去的时候发现有不少细节需要增加,例如创建一个文件,需要对里面的各个变量进行初始化,在结构体中增加变量的时候就忘记了其他地方的初始化,顾此失彼。另外,在设计之初是想在MFD和UFD中增加一个BST链接以加快检索的,代码打了一半之后有觉得麻烦,代码过长而把它删除改变,变动比较大。所以,经过这次教训,我觉得以后再设计程序之前就应该考虑到具体的数据结构,尽量想得全面一点,这样后面的修改就可以省不少时间,还有就是,尽量不要改数据结构。以上是关于数据结构的。
设计了一个号的数据结构,本课程设计的实现就容易多了,但是某些操作还是需要取舍的。例如在建立共享链的时候,本来是在UFD中再加入一个指针以指示共享文件的,但后来发现一个结构体如果吧太多不相关的变量都放在一起的话会变得很混乱,最后决定另建一个链结构REC。
课程设计对编程能力也肯定是一个不错的锻炼。在设计删除函数和操作函数时,原先我是设计为void型的,但是调试的时候发现删除根结点(第一个文件)的时候程序会出错。后来断点检查发现传地址的函数中,其传递的地址不可以在子函数中free掉,这样它的主函数中的地址也会被发生改变的,后来想到了给函数返回一个新的地址。
总之,本次实验加深了对文件的存储结构的理解,同时还锻炼了C语言及其数据结构,是一个综合性的实验。