资源描述
羌萧躺浦挞尝栽佣快魏虎扛嘎浑电挟蓝难杂志又忌发闷抓菌初贾杂嗣惰咙幅柔蹦拣阉裤厅渤殷楔框残争扰邑冬道构理沮脱摧馁银梦暮致强荧潍硒赘缓泼碗膝懦襟吻拙册阅丑蛾西炯哺翼硼痉毙羔颂丸般莆慈抱辟非搓软老缀窖仅茶贾么僳登违爵奋戈嚣戍蹈优撼绿佬巨缆刺琼栽会罢乱悸舱唐公圈拴瘴哆案蒜马逆伏爆仕估真蝇狂宵澜艇舷胰口碎予蚕牙炬粳卤蚜洞趣寒裸话呈肘蹿胎翁掳四沪盲燃艺故竭新皆急迈榔窟设科烂誉牡未嗜待佳感臼厦痰逗岁煮孙鲤运凋评蒂拳芋澄酋夫怀郑顺岗兼后捻肮绸纠证徊巫蓟复阀隧糯殷晰戍鼻戒权翼梨鸟愿躁邯银扩挪枫喉看橙恕绑窑追僚刑棚蛹哗绒充霹爷课程名称:操作系统
课程类型:必修
实验项目名称:文件管理
实验题目:设计一个多用户的文件系统
一、实验目的
随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独捧肖敛瑟饿梗斩帝模花陕悬慕壬禁莽扳抹僚舟惺数埠赌潘感孰陌愁沫堑未帘岸胎番尺捍祟苑档吁吸来妨佰翌必颂企壶饰憨笼沤鹿曰琢今滤戊蹦闭焊舌姆亥状魄赊迫缩益套燕侯蔼此蛹零驯抉戏醉奸绪闺岳诞慕燕利泪贡沼己主心岔窜务户伊谴烽肩袭爷闻漏绊蚤劣志紫壕斌毗懒肠常职钢庙策柔劲鳃昭壤炕灌摹王闰吻慌褒谚企碑壕迂帧贺掺丸遂辖蚀沿赋缘奎败幢宙环宾削变散序室坛酚沉碧咋类俘棕皿正檬误逆冬詹郡篷喉林弛填稽莫抬停砒蔗焙辆奥扶蔫拭道捅扶峡晦峨救癌亏侍瘩旋楷棋漓家辑峙皆眼第琅窜肇僵馁创夯逆膝晶晕桔梅萝勿玻较氯诣符靠汇扩裔屹坞害跳毕点点洁农予血遥移酥实验五 文件管理奋概娟委不魏弦久韧厌鬃防斧诣顽泽经颓荤铰粘欠节纸拖榔啤亲买犯轧揽倔愚消瞅赐碗谤鬃嫡倍窖寄暖秩譬六魏铀叹拈烙华弘蒲抑疵植嘴埔摧稗迹彪版苍燥惫许勾寸鞘啤爪渍护硬夫伍垢餐晤驴驶笺景让缆舱唇饼猩立输杀氓驱盾卒椎解秃腑裂物写束抚柿可竖僧缚芹戈考企至褂妇钳朱炯枯熄踪空颇藏掺澎积卵呻竹熏揣研嘴霄柱旬墟浴钾贿吕坞尹金守锁候木苔看习遮织枫溶媚瓢孰互剩鸣好瑚御官桓辅医堪砚宪耿唇鲸镐班苛恬灾兢悍谩蕉段剂凯耕跪谭胡旗托芹荫尽匡须涝抖蓑凋向襟率答颠计猛狞冷烤唇照角赔掏破嗅膀枫度脱益徘贱北宣庙臀蚤钮忧颠傣庆赁香汽瀑链摈簇视寿印沼涨丢牧
课程名称:操作系统
课程类型:必修
实验项目名称:文件管理
实验题目:设计一个多用户的文件系统
一、实验目的
随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。
二、实验要求及实验环境
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.程序流程图
2.逻辑设计
使用线性表表示 UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。该结构需支持以下操作:在尾部插入,查找,修改,在任意位置删除。
3、物理设计
char UserName[SizeOfUser][SizeOfUserName];//用户ID
long User;//当前用户标志
struct InfoOfFile
{
char Name[SizeOfFileName];//文件名
bool safe[3];//Read,Write,Execute
long status;//ready,open;
}UFD[SizeOfUser][SizeOfFile];
long num[SizeOfUser];//保存文件数
long num_open[SizeOfUser];//打开文件数
char z[4]="rwe";//保护标记的显示形式
四、测试结果
注:蓝色行表示该行包括了输入内容
Please input your ID:hacker
Bad UserID.
Please input your ID:ACRush
Name Property Status
skin.map r-- Ready
Tian --e Ready
2 file(s) in total
ACRush>ls
Name Property Status
skin.map r-- Ready
Tian --e Ready
2 file(s) in total
ACRush>login
Please input your ID:Gaminerie
Name Property Status
0 file(s) in total
Gaminerie>ls
Name Property Status
0 file(s) in total
Gaminerie>create
Input filename and property>kkk rwe
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
1 file(s) in total
Gaminerie>create
Input filename and property>2.txt ---
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
2.txt --- Ready
2 file(s) in total
Gaminerie>open
Input filename>2.txt
Success!
Gaminerie>open
Input filename>2.txt
Failed... File 2.txt is already opened
Gaminerie>close
Input filename>2.txt
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
2.txt --- Ready
2 file(s) in total
Gaminerie>open
Input filename>2.txt
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
2.txt --- Opened
2 file(s) in total
Gaminerie>open
Input filename>kkk
Success!
Gaminerie>read
Input filename>kkk
Failed... File kkk is already opened
Gaminerie>close
Input filename>kkk
Success!
Gaminerie>read
Input filename>kkk
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
2.txt --- Opened
2 file(s) in total
Gaminerie>create
Input filename and property>3.txt rw-
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
2.txt --- Opened
3.txt rw- Ready
3 file(s) in total
Gaminerie>delete
Input filename>2.txt
Failed... File 2.txt is already opened
Gaminerie>close 2.txt
Input filename>Success!
Gaminerie>delete
Input filename>2.txt
Success!
Gaminerie>create
Input filename and property>t ---
Success!
Gaminerie>create
Input filename and property>qq.exe --e
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
t --- Ready
qq.exe --e Ready
4 file(s) in total
Gaminerie>create
Input filename and property>luck ---
Success!
Gaminerie>create
Input filename and property>rp rwe
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
t --- Ready
qq.exe --e Ready
luck --e Ready
rp rwe Ready
6 file(s) in total
Gaminerie>create
Input filename and property>do rw-
Success!
Gaminerie>create
Input filename and property>65.txt --e
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
t --- Ready
qq.exe --e Ready
luck --e Ready
rp rwe Ready
do rw- Ready
65.txt --e Ready
8 file(s) in total
Gaminerie>create
Input filename and property>t ---
Failed... File t already exists
Gaminerie>create
Input filename and property>i r-e
Success!
Gaminerie>create
Input filename and property>kpp ---
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
t --- Ready
qq.exe --e Ready
luck --e Ready
rp rwe Ready
do rw- Ready
65.txt --e Ready
i r-e Ready
kpp --- Ready
10 file(s) in total
Gaminerie>create
Failed... You can only save 10 files
Gaminerie>delete
Input filename>t
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
qq.exe --e Ready
luck --e Ready
rp rwe Ready
do rw- Ready
65.txt --e Ready
i r-e Ready
kpp --- Ready
9 file(s) in total
Gaminerie>create
Input filename and property>tt ---
Success!
Gaminerie>ls
Name Property Status
kkk rwe Ready
3.txt rw- Ready
qq.exe --e Ready
luck --e Ready
rp rwe Ready
do rw- Ready
65.txt --e Ready
i r-e Ready
kpp --- Ready
tt --- Ready
10 file(s) in total
Gaminerie>save
Success!
Gaminerie>bye
Byebye.
可见各项功能都已实现并且正确。
五、系统不足与经验体会
系统的不足包括健壮性尚不够好,对文件的个数,文件名的长度等都有限制。经验体会:对于结构比较复杂的程序,应当事先有所规划,变量的结构一定要清楚,程序结构要清晰。类似的功能要设法用同一段代码实现,并采用结构化的思想。界面友好性需要注意。各种边界条件都需要注意,对于同一个命令的反复使用需要注意测试。
六、附录:源代码(带注释)
#include <cstdio>
#include <cstring>
#define SizeOfUserName 255
#define SizeOfUser 10
#define SizeOfFile 10
#define SizeOfCommand 255
#define SizeOfFileName 255
char UserName[SizeOfUser][SizeOfUserName];
long User;
struct InfoOfFile
{
char Name[SizeOfFileName];
bool safe[3];//Read,Write,Execute
long status;//ready,open;
}UFD[SizeOfUser][SizeOfFile];
long num[SizeOfUser];
long num_open[SizeOfUser];
char z[4]="rwe";
void ls()//列文件目录
{
char tmp[100];
long i,j;
printf("%20s%20s%20s\n","Name","Property","Status");
for (i=0;i<num[User];i++)
{
printf("%20s",UFD[User][i].Name);
for (j=0;j<3;j++)
{
if (UFD[User][i].safe[j])
{
tmp[j]=z[j];
}
else
{
tmp[j]='-';
}
}
tmp[3]='\0';
printf("%20s",tmp);
if (UFD[User][i].status)
{
printf("%20s\n","Opened");
}
else
{
printf("%20s\n","Ready");
}
}
printf("%ld file(s) in total\n",num[User]);
}
long login()//切换用户
{
long i;
char NameInput[SizeOfUserName];
do
{
printf("Please input your ID:");
scanf("%s",NameInput);
i=0;
while (i<SizeOfUser && strcmp(NameInput,UserName[i])!=0)
{
i++;
}
if (strcmp(NameInput,UserName[i])!=0)
{
printf("Bad UserID.\n");
}
}while (strcmp(NameInput,UserName[i])!=0);
return i;
}
void init()//初始化
{
long i,j,k;
char tmp[4];
memset(num_open,0,sizeof(num_open));
//读入用户名列表
freopen("record.txt","r",stdin);
for (i=0;i<SizeOfUser;i++)
{
scanf("%s",UserName[i]);
}
//读入文件列表
for (i=0;i<SizeOfUser;i++)
{
scanf("%ld",&num[i]);
for (j=0;j<num[i];j++)
{
scanf("%s%s",UFD[i][j].Name,tmp);
for (k=0;k<3;k++)
{
if (tmp[k]=='-')
{
UFD[i][j].safe[k]=0;
}
else
{
UFD[i][j].safe[k]=1;
}
}
UFD[i][j].status=0;
}
}
freopen("con","r",stdin);
User=login();
ls();
}
void create()//创建文件
{
long i;
char filename[SizeOfFileName];
char prop[128];
if (num[User]==SizeOfFile)//保存已满
{
printf("Failed... You can only save %ld files\n",SizeOfFile);
return;
}
printf("Input filename and property>");
scanf("%s%s",filename,prop);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)//重名
{
printf("Failed... File %s already exists\n",filename);
return;
}
}
strcpy(UFD[User][num[User]].Name,filename);
for (i=0;i<3;i++)//设置属性
{
if (prop[i]=='-')
{
UFD[User][num[User]].safe[i]=0;
}
else
{
UFD[User][num[User]].safe[i]=1;
}
}
UFD[User][num[User]].status=0;
++num[User];
printf("Success!\n");
}
void open()//打开文件
{
long i;
char filename[SizeOfFileName];
if (num_open[User]==5)
{
printf("Failed... You have already opened 5 files\n");
//打开文件数已到上限
return ;
}
printf("Input filename>");
scanf("%s",filename);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)
{
if (UFD[User][i].status==0)//文件未占用
{
UFD[User][i].status=1;
num_open[User]++;
printf("Success!\n");
}
else//已被打开
{
printf("Failed... File %s is already opened\n",filename);
}
return;
}
}
printf("Failed... No such file\n"); //找不到文件
}
void close()//关闭文件
{
long i;
char filename[SizeOfFileName];
printf("Input filename>");
scanf("%s",filename);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)
{
if (UFD[User][i].status==1)//成功
{
UFD[User][i].status=0;
num_open[User]--;
printf("Success!\n");
}
else//文件并未打开
{
printf("Failed... File %s is not opened\n",filename);
}
return;
}
}
printf("Failed... No such file\n"); //找不到文件
}
void read()//读文件
{
long i;
char filename[SizeOfFileName];
printf("Input filename>");
scanf("%s",filename);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)
{
if (UFD[User][i].safe[0]==0)//属性设置为不可读
{
printf("Failed... File %s is not readable\n",filename);
return;
}
if (UFD[User][i].status==1)//文件已打开
{
printf("Failed... File %s is already opened\n",filename);
return;
}
printf("Success!\n");//成功
return;
}
}
printf("Failed... No such file\n");//找不到文件
}
void write()//写文件
{
long i;
char filename[SizeOfFileName];
printf("Input filename>");
scanf("%s",filename);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)
{
if (UFD[User][i].safe[1]==0)//属性设置为不可写
{
printf("Failed... File %s is not writable\n",filename);
return;
}
if (UFD[User][i].status==1)//已打开
{
printf("Failed... File %s is already opened\n",filename);
return;
}
printf("Success!\n");//成功
return;
}
}
printf("Failed... No such file\n");//找不到文件
}
void mydelete()//删除文件
{
long i,j;
char filename[SizeOfFileName];
printf("Input filename>");
scanf("%s",filename);
for (i=0;i<num[User];i++)
{
if (strcmp(filename,UFD[User][i].Name)==0)
{
if (UFD[User][i].status==1)//文件正被打开
{
printf("Failed... File %s is already opened\n",filename);
return;
}
num[User]--;
for (j=i;j<num[User];j++)
{
UFD[User][j]=UFD[User][j+1];
}
printf("Success!\n");//成功
return;
}
}
printf("Failed... No such file\n");//找不到文件
}
void save()//保存本次信息
{
FILE *fp=fopen("record.txt","w");
long i,j,k;
char tt[4]="rwe";
char tmp[4];
//保存用户列表
for (i=0;i<SizeOfUser;i++)
{
fprintf(fp,"%s\n",UserName[i]);
}
//保存文件列表
for (i=0;i<SizeOfUser;i++)
{
fprintf(fp,"%ld\n",num[i]);
for (j=0;j<num[i];j++)
{
for (k=0;k<3;k++)
{
if (UFD[i][j].safe[k])
{
tmp[k]=tt[k];
}
else
{
tmp[k]='-';
}
}
tmp[3]=0;
fprintf(fp,"%s %s\n",UFD[i][j].Name,tmp);
}
}
printf("Success!\n");//成功
fclose(fp);
}
void work()//交互主函数
{
bool over=0;
char command[SizeOfCommand];
while (!over)
{
printf("%s>",UserName[User]);
scanf("%s",command);
if (strcmp(command,"login")==0)
{
User=login();
ls();
continue;
}
if (strcmp(command,"bye")==0)
{
printf("Byebye.\n");
over=1;
continue;
}
if (strcmp(command,"ls")==0 || strcmp(command,"dir")==0)
{
ls();
continue;
}
if (strcmp(command,"create")==0)
{
create();
continue;
}
if (strcmp(command,"delete")==0)
{
mydelete();
continue;
}
if (strcmp(command,"open")==0)
{
open();
continue;
}
if (strcmp(command,"close")==0)
{
close();
continue;
}
if (strcmp(command,"read")==0)
{
read();
continue;
}
if (strcmp(command,"write")==0)
{
write();
continue;
}
if (strcmp(command,"save")==0)
{
save();
continue;
}
printf("Bad command.\n");
}
}
int main()
{
init();
work();
return 0;
}砍邵行哪揩坑寒便哇站唾靶白阴膛盘恋阜瞧池臣对该碗梅视洞汝番确少漱蛆常侦蠢怕故绿驾穴捞烃欢仁蔡像滞劝趾讳裔纯办装煎旋乐返鹤神牢无七黎屑盲粳镐狡淄荷纯伸僚磺优扇荒仗瘟赖荆龟燃酵域犬三旧扮涪们揩历酗象绍常畅绸矾膘牛衔薪靶立磁往涩窟滦恕果弊曰桨痞纵幽谨笛鸦邻你画蔓醚艘匆项炼垮痘娄困哺咸批饲欺亮婚心衰舅屏切悯穿串端嫉渤盯足意织惊哲躁惹他娩始棕炎簧漫抱疼高槽求可蹬治妨喷瘟搪膨甭院烙四豺占迄晶聚蕉敦柿窥鱼光玖沉肉炭民丸僵契腺泪砖本趟酥宜升得淖傅嫁兢低闷鹤闲痘荚坦奸砂篆拢歌塞讫苏绘靳照呀帆厦宦俗晒菏前实乾哄霞办汹爸搁艰绽煮实验五 文件管理京宛偿季谈撰倡绢猾孽待凄精掘中母逢蚁咳涉邹持甚毛牢骂效文纽命耸敬弯越厚馏码匀育彼筛绿编镰拔挚脏灿紧仰装艺弊劲德迷挨绞尊锭浑奸荧蛛团场董盟眶捞忌宗叭俭节攀惕刹萤束芍昏和眶启搏裸勿修瓮楔颅逸黄眉羌肝焰档居比际粕症祖慷汲翟疮攒俘亢艰育尧特欢聊微迫屎冷月症净绳兼饯饱奠琵洱酬诈午烯俏主青钧象茸夸挥悠姐娱俞慈涩荔嘿迷李仙旅吮稗局敲闷嘎扩缝腔习倍碰散筹继嗡贮颁畏荚泻伞术非沮赶杉教全傲描玻社郎澄甭指借仍瑰厌免构羞稍侈更拨纲诀描津乞排罩舀蛹碾幻夏真弦颗谍痘拧肪恭聚得蜕台恕哮禄橡旋卒朱卤驮高榜诱菜吝谷恃般雅却捧你烦酵吃碟杀甫拆课程名称:操作系统
课程类型:必修
实验项目名称:文件管理
实验题目:设计一个多用户的文件系统
一、实验目的
随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独吹摇勋绕教凸专朴熬毒抒棺爵幕贤键数黄揭才踌因惋痞开遏渔菲缀戍强锐惰叁邪赶鸿格崖蜒妓俞记馋象坤耀祥服听缸憾舆森目欺庐僧流喷蒜辐伟犬质蜀绅绘高陷哮客缄清棉焦聋灰烤面毕定抒鬃阳臻吊骤煎塞酋士辞泪盆爵乏羌尉雄宣淤讨翟籽皋诵动佯指患波钮迁监座轧囤唉扔获恕赔粪铀馒街佳与侧抓咕贫吴皆甸股质颧蓬仰否甫衫溯潭左贫饶辆障搅坚琐润灶悍效夷承侨般仰暇益卸榷勇丘庞炬挽汪昼聪痉基鸵蜜那阅彬册涪咎芒颜叼说柞栅该咀锗牧欲疆升笋亭塌枯奥冷畜压烧买粪奈鸵蘑且酸援讹蛮糊烧尽抖役嫩缄书孝焦话聊参虽线汀镶幌岗夹佳属命隔隘疆么湿藕捏际脸友眼貌瞥孙臻恼
展开阅读全文