当前位置:文档之家› 文件管理_实验4要点

文件管理_实验4要点

江南大学物联网工程学院实验报告 课程名称 《操作系统》 实验名称 文件系统实验 实验日期 2015/5/28 班级 计算机1206 姓名 王成义 学号 1030412612 仪器编号 实验报告要求 1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 5.实验体会1.实验目的用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

2.实验要求要求设计一个 n 个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create 、delete 、open 、close 、read 、write 等命令。

3.实验步骤主目录操作:等待用户命令输入待创建目录名输入要进入的目录名退出存在同名目录报错建立目录目录存在是否进入目录是Createcdexit否流程图:4.程序清单编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。

#include<stdio.h>#include<stdlib.h>#include<string.h>//主文件结构体struct MasterFile{char username[20]; //用户名char password[20]; //用户名密码char flag; //标志struct MasterFile *next;};//用户文件结构体struct UserFile{int fnum; //文件编号char fname[20]; //文件名int flength; //文件长度char flag; //标志char fpw[20]; //文件保护码struct UserFile *link;};//全局变量int shoudsave; //存储标记int usingnum; //当前用户标记struct MasterFile MFD[20]; //主目录struct UserFile UFD[20][20]; //用户目录//寻找主目录空闲区struct MasterFile*MoveMFDToLast(){for(int i=0;i<20;i++){if(MFD[i].flag==0)usingnum=i;return &MFD[i];}return NULL;}//查找用户struct MasterFile*SearchMFD(char str[]){ for(int i=0;i<20;i++){if(strcmp(str,MFD[i].username)==0){usingnum=i;return &MFD[i];}}return NULL;}//寻找用户目录空闲区struct UserFile *MoveUFDToLast(){for(int i=0;i<20;i++){if(UFD[usingnum][i].flag==0)return &UFD[usingnum][i];}return NULL;}//查找用户文件struct UserFile *SearchUFD(int num){for(int i=0;i<20;i++){if(UFD[usingnum][i].fnum==num)return &UFD[usingnum][i];}return NULL;}//删除用户文件目录void LeftMoveUFD(int num){for(int i=0;i<20;i++){if(UFD[usingnum][i].fnum==num){for(int j=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;}}}}//用户登陆void Login(){char flag1,flag2,flag3;char str1[20],str2[20],str3[20],str4[20];struct MasterFile *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;}else break;}}break;}}}//菜单void menu(){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"); }//列文件目录void Dir(){if(MFD[usingnum].next==0)printf("目前你不存在任何文件!\n");else{for(int i=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);}}}//创建文件void Create(){FILE *fp;int num;struct UserFile *f;char str1[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=(struct MasterFile*)f;f->link=(struct UserFile*)fp; //设置用户目录MFD[usingnum].next=(struct MasterFile*)&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");}//删除文件void Delete(){struct UserFile *f;int num;printf("请输入你要删除的文件编号:");scanf("%d",&num);f=SearchUFD(num); //查找用户文件if(f==NULL) {printf("你要删除的文件不存在!\n");}else{LeftMoveUFD(num); //删除用户文件目录printf("文件已删除!\n");}shoudsave=1; //设置存储标记}//读文件void Read(){char ch;struct UserFile *f;FILE *fp;int num;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");}//写文件void Write(){char ch;struct UserFile *f;FILE *fp;int num;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");}//保存void Save(){FILE *fpm,*fpu;int flag=1,count=0;fpm=fopen("F:\\MasterFile.txt","wb"); //打开主文件if(fpm==NULL){printf("\n提示:重新打开主文件信息文件时发生错误!\n");exit(1);}for(int i=0;i<20;i++)fwrite(&MFD[i],sizeof(struct MasterFile),1,fpm); //保存主文件目录信息fclose(fpm);printf("主文件目录信息保存完毕!\n");fpu=fopen("F:\\UserFile.txt","wb"); //打开用户文件if(fpu==NULL){printf("\n提示:重新打开用户目录信息文件时发生错误!\n");exit(1);}for(int j=0;j<20;j++) //保存用户文件目录信息fwrite(&UFD[j],sizeof(struct UserFile),20,fpu);fclose(fpu);printf("用户文件目录信息保存完毕!\n");}//主函数int main(){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; //文件指针int sel;char ch;char jian;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"); //创建主文件目录的文件else exit(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"); //创建用户文件目录的文件else exit(0);}printf("文件正在打开,请稍等...");for(int i=0;i<20;i++) //读取主文件目录信息fread(&MFD[i],sizeof(struct MasterFile),1,fpm); //将文件的内容放入接点中fclose(fpm); // 关闭文件while(!feof(fpu)){ //读取用户目录文件信息for(int i=0;i<20;i++){if(fread(&UFD[i][0],sizeof(struct UserFile),20,fpu)) //将文件的内容放入接点中MFD[i].next=(struct MasterFile*)&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){case 1:Dir();break; //列文件目录case 2:Create();break; //创建文件case 3:Delete();break; //删除文件case 4:Read();break; //读文件case 5:Write();break; //写文件default: printf("你输的选项有误,请重新输入!\n");break;}}system("PAUSE");return 0;}5.运行情况6.实验体会通过编写和调试此次文件系统,加深了对各种文件操作命令的实质内容和执行过程的了解。

相关主题