文件管理实验4.docx
《文件管理实验4.docx》由会员分享,可在线阅读,更多相关《文件管理实验4.docx(17页珍藏版)》请在冰豆网上搜索。
文件管理实验4
文件管理-实验4
江南大学物联网工程学院实验报告
课程名称《操作系统》实验名称文件系统实验实验日期2015/5/28
班级计算机1206姓名王成义学号1030412612仪器编号
实验报告要求1.实验目的2.实验要求3.实验步骤4.程序清单5.运行情况5.实验体会
.实验目的
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
.实验要求
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
3.实验步骤
主目录操作:
流程图:
4.程序清单
编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
#include
#include
#include
//主文件结构体
structMasterFile{
charusername[20];//用户名
charpassword[20];//用户名密码
charflag;//标志
structMasterFile*next;
};
//用户文件结构体
structUserFile{
intfnum;//文件编号
charfname[20];//文件名
intflength;//文件长度
charflag;//标志
charfpw[20];//文件保护码
structUserFile*link;
};
//全局变量
intshoudsave;//存储标记
intusingnum;//当前用户标记
structMasterFileMFD[20];//主目录
structUserFileUFD[20][20];//用户目录
//寻找主目录空闲区
structMasterFile*MoveMFDToLast()
{
for(inti=0;i<20;i++){
if(MFD[i].flag==0)
usingnum=i;
return&MFD[i];
}
returnNULL;
}
//查找用户
structMasterFile*SearchMFD(charstr[]){
for(inti=0;i<20;i++){
if(strcmp(str,MFD[i].username)==0){
usingnum=i;
return&MFD[i];
}
}
returnNULL;
}
//寻找用户目录空闲区
structUserFile*MoveUFDToLast(){
for(inti=0;i<20;i++){
if(UFD[usingnum][i].flag==0)
return&UFD[usingnum][i];
}
returnNULL;
}
//查找用户文件
structUserFile*SearchUFD(intnum){
for(inti=0;i<20;i++){
if(UFD[usingnum][i].fnum==num)
return&UFD[usingnum][i];
}
returnNULL;
}
//删除用户文件目录
voidLeftMoveUFD(intnum){
for(inti=0;i<20;i++){
if(UFD[usingnum][i].fnum==num){
for(intj=i;j<19;j++){
UFD[usingnum][i].flag=UFD[usingnum][i+1].flag;
UFD[usingnum][i].flength=UFD[usingnum][i+1].flength;
strcpy(UFD[usingnum][i].fname,UFD[usingnum][i+1].fname);
UFD[usingnum][i].fnum=UFD[usingnum][i+1].fnum;
strcpy(UFD[usingnum][i].fpw,UFD[usingnum][i+1].fpw);
UFD[usingnum][i].link=UFD[usingnum][i+1].link;
}
}
}
}
//用户登陆
voidLogin(){
charflag1,flag2,flag3;
charstr1[20],str2[20],str3[20],str4[20];
structMasterFile*p;
printf("你是已有用户吗(y/n)?
");
scanf("%s",&flag1);
if(flag1=='n'){//新用户登录
printf("请创建新的用户:
(y/n)");
scanf("%s",&flag2);
if(flag2=='n'){
printf("你已退出了系统!
\n");
exit
(1);
}else{
printf("请输入你的用户名:
");
scanf("%s",&str1);
printf("请输入口令:
");
scanf("%s",&str2);
p=MoveMFDToLast();
strcpy(p->username,str1);
strcpy(p->password,str2);
p->flag=1;
printf("%d",MFD[usingnum].flag);
p->next=NULL;
shoudsave=1;//存储标记
}
}else{//旧用户登录
while
(1){
printf("请输入你的用户名:
");//输入用户名
scanf("%s",&str3);
p=SearchMFD(str3);
if(p==NULL){
printf("对不起,你输入的用户名不存在!
\n");
printf("继续(y)还是放弃(n)?
");
scanf("%s",&flag3);
if(flag3=='y')continue;
else{
printf("你已退出了系统!
\n");
exit
(1);
}
}else{
while
(1){
printf("请输入口令:
");//输入口令
scanf("%s",&str4);
if(strcmp(str4,p->password)!
=0){
printf("对不起,你输入的口令不正确,请重新输入.\n");
continue;
}elsebreak;
}
}break;
}
}
}
//菜单
voidmenu(){
printf("\n********************************************************************************");
printf("\t1列文件目录\t\t\t\t\t2创建文件\n");
printf("\t3删除文件\t\t\t\t\t4读文件\n");
printf("\t5写文件\t\t\t\t\t\t0退出系统\n");
printf("********************************************************************************\n");
}
//列文件目录
voidDir(){
if(MFD[usingnum].next==0)
printf("目前你不存在任何文件!
\n");
else{
for(inti=0;i<20;i++){
if(UFD[usingnum][i].flag==1)
printf("文件编号\t%d\t文件名\t%s\t文件长度\t%d\t保护码\t%s\n",UFD[usingnum][i].fnum,UFD[usingnum][i].fname,UFD[usingnum][i].flength,UFD[usingnum][i].fpw);
}
}
}
//创建文件
voidCreate(){
FILE*fp;
intnum;
structUserFile*f;
charstr1[20],str2[20];
printf("请输入你要创建的文件名:
");//输入文件信息
scanf("%s",&str1);
printf("请输入文件编号:
");
scanf("%d",&num);
printf("请输入文件保护码:
");
scanf("%s",&str2);
fp=fopen(str1,"w");//创建文件
f=MoveUFDToLast();//寻找用户目录空闲区
if(&UFD[usingnum][0]==f)//连接主目录
MFD[usingnum].next=(structMasterFile*)f;
f->link=(structUserFile*)fp;//设置用户目录
MFD[usingnum].next=(structMasterFile*)&UFD[usingnum][0];
strcpy(f->fname,str1);
strcpy(f->fpw,str2);
f->fnum=num;
f->flength=0;
f->flag=1;
fclose(fp);
shoudsave=1;//设置存储标记
printf("文件已创建!
\n");
}
//删除文件
voidDelete(){
structUserFile*f;
intnum;
printf("请输入你要删除的文件编号:
");
scanf("%d",&num);
f=SearchUFD(num);//查找用户文件
if(f==NULL){
printf("你要删除的文件不存在!
\n");
}else{
LeftMoveUFD(num);//删除用户文件目录
printf("文件已删除!
\n");
}
shoudsave=1;//设置存储标记
}
//读文件
voidRead(){
charch;
structUserFile*f;
FILE*fp;
intnum;
printf("请输入你要读的文件的编号:
");
scanf("%d",&num);
f=SearchUFD(num);//查找文件
if(f==NULL){
printf("你输入的文件不存在!
\n");
}else{
if((fp=fopen(f->fname,"r"))==NULL){//打开指定文件
printf("不能打开该文件!
\n");
exit(0);
}
}
ch=fgetc(fp);//输出文件内容
while(ch!
=EOF){
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);//关闭文件
printf("文件已读完毕!
\n");
}
//写文件
voidWrite(){
charch;
structUserFile*f;
FILE*fp;
intnum;
printf("请输入你要写的文件的编号:
");
scanf("%d",&num);
f=SearchUFD(num);//查找文件
if(f==NULL){
printf("你输入的文件不存在!
\n");
}else{
if((fp=fopen(f->fname,"wr"))==NULL){//打开指定文件
printf("不能打开该文件!
\n");
exit(0);
}
}
printf("请按字符输入内容(以'#'表示结束符)");//写入文件
scanf("%s",&ch);
while(ch!
='#'){
fwrite(&ch,1,1,fp);
scanf("%s",&ch);
}
fclose(fp);//关闭文件
shoudsave=1;//设置存储标记
printf("文件写入完毕!
\n");
}
//保存
voidSave(){
FILE*fpm,*fpu;
intflag=1,count=0;
fpm=fopen("F:
\\MasterFile.txt","wb");//打开主文件
if(fpm==NULL){
printf("\n提示:
重新打开主文件信息文件时发生错误!
\n");
exit
(1);
}
for(inti=0;i<20;i++)
fwrite(&MFD[i],sizeof(structMasterFile),1,fpm);//保存主文件目录信息
fclose(fpm);
printf("主文件目录信息保存完毕!
\n");
fpu=fopen("F:
\\UserFile.txt","wb");//打开用户文件
if(fpu==NULL){
printf("\n提示:
重新打开用户目录信息文件时发生错误!
\n");
exit
(1);
}
for(intj=0;j<20;j++)//保存用户文件目录信息
fwrite(&UFD[j],sizeof(structUserFile),20,fpu);
fclose(fpu);
printf("用户文件目录信息保存完毕!
\n");
}
//主函数
intmain(){
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t实验四文件管理\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\n\n\t\t\t\t\t计算机1206\n");
printf("\t\t\t\t\t王成义\n");
printf("\t\t\t\t\t1030412612\n");
printf("\t\t\t\t\t完成时间:
2015/5/28\n\n\n\n");
printf("\t\t\t\tWelcome\n\n");
FILE*fpm,*fpu;//文件指针
intsel;
charch;
charjian;
printf("\t\t\t\t文件管理系统\n\t\t\t\t\n");
fpm=fopen("D:
\\MasterFile.txt","rb");//打开主文件目录信息文件
if(fpm==NULL){
printf("\n提示:
主文件目录信息文件还不存在,是否创建?
(y/n)\n");
scanf("%s",&jian);
if(jian=='y'||jian=='Y')
fpm=fopen("D:
\\MasterFile.txt","wb");//创建主文件目录的文件
elseexit(0);
}
fpu=fopen("D:
\\UserFile.txt","rb");//打开用户文件目录信息文件
if(fpu==NULL){
printf("\n提示:
用户文件目录信息文件还不存在,是否创建?
(y/n)\n");
scanf("%s",&jian);
if(jian=='y'||jian=='Y')
fpu=fopen("D:
\\UserFile.txt","wb");//创建用户文件目录的文件
elseexit(0);
}
printf("文件正在打开,请稍等...");
for(inti=0;i<20;i++)//读取主文件目录信息
fread(&MFD[i],sizeof(structMasterFile),1,fpm);//将文件的内容放入接点中
fclose(fpm);//关闭文件
while(!
feof(fpu)){//读取用户目录文件信息
for(inti=0;i<20;i++){
if(fread(&UFD[i][0],sizeof(structUserFile),20,fpu))//将文件的内容放入接点中
MFD[i].next=(structMasterFile*)&UFD[i][0];
}
}
fclose(fpu);//关闭文件
printf("\n文件已导入完毕!
\n");
Login();//用户登录
while
(1){//菜单操作
menu();
printf("请你选择操作:
");
scanf("%d",&sel);
if(sel==0){//保存文件信息
if(shoudsave==1){
getchar();
printf("\n资料已经改动,是否将改动保存到文件中(y/n)?
\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save();
}
printf("\n你已经退出系统,再见!
\n");
break;
}
switch(sel){
case1:
Dir();
break;//列文件目录
case2:
Create();
break;//创建文件
case3:
Delete();
break;//删除文件
case4:
Read();
break;//读文件
case5:
Write();
break;//写文件
default:
printf("你输的选项有误,请重新输入!
\n");
break;
}
}
system("PAUSE");
return0;
}
5.运行情况
6.实验体会
通过编写和调试此次文件系统,加深了对各种文件操作命令的实质内容和执行过程的了解。
对文件系统有了更深的了解。
教师评价
优
良
中
及格
不及格
教师签名
日期