搜档网
当前位置:搜档网 › 文件管理-实验4

文件管理-实验4

文件管理-实验4
文件管理-实验4

文件管理-实验4

江南大学物联网工程学院实验报告

课程名称《操作系统》实验名称文件系统实验实验日期2015/5/28

班级计算机1206 姓名王成义学号1030412612 仪器编号

实验报告要求1.实验目的2.实验要求3.实验步骤4.程序清单5.运行情况5.实验体会

1.实验目的

用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

2.实验要求

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

3.实验步骤

主目录操作:

等待用户命令输入待创建目录名输入要进入的目录名退出

存在同名目录

报错建立目录目录存在是

否进入目录是Create

cd

exit

流程图:

4.程序清单

编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。

#include

#include

#include

//主文件结构体

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.实验体会

通过编写和调试此次文件系统,加深了对各种文件操作命令的实质内容和执行过程的了解。对文件系统有了更深的了解。

教师评价优良中及

格不

教师

签名

相关主题