实验二文件系统模拟设计.docx

上传人:b****5 文档编号:11849239 上传时间:2023-04-06 格式:DOCX 页数:22 大小:28.96KB
下载 相关 举报
实验二文件系统模拟设计.docx_第1页
第1页 / 共22页
实验二文件系统模拟设计.docx_第2页
第2页 / 共22页
实验二文件系统模拟设计.docx_第3页
第3页 / 共22页
实验二文件系统模拟设计.docx_第4页
第4页 / 共22页
实验二文件系统模拟设计.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

实验二文件系统模拟设计.docx

《实验二文件系统模拟设计.docx》由会员分享,可在线阅读,更多相关《实验二文件系统模拟设计.docx(22页珍藏版)》请在冰豆网上搜索。

实验二文件系统模拟设计.docx

实验二文件系统模拟设计

实验二文件系统模拟设计

一、实验目的

通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

二、实验内容

为linux系统设计一个简单的二级文件系统。

要求做到以下几点:

(1)可以实现下列几条命令(至少4条);

login用户登录

dir列文件目录

create创建文件

delete删除文件

open打开文件

close关闭文件

read读文件

write写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保

三、实验内容指导提示

(1)首先应确定文件系统的数据结构:

主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。

如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。

★★★★★《程序设计思想参考》

<程序设计>

(1)设计思想

本系统是模拟实现多用户多目录的文件系统(8个用户),在系统出现登录后,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。

系统的命令与其命令的具体实现,此模拟系统共提供了上述命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。

该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。

【注:

在linux下用g++编译C++】

(2)主要数据结构

用户结构:

账号与密码结构

typedefstructusers

{

 char    name[8];

 char    pwd[10];

}users;

本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。

usersusrarray[8]=

{

 "usr1","usr1",

 "usr2","usr2",

 "usr3","usr3",

 "usr4","usr4",

 "usr5","usr5",

 "usr6","usr6",

 "usr7","usr7",

 "usr8","usr8",

};

(3)数据结构说明

a)文件结构链表

structfnode

{

   charfilename[FILENAME_LENGTH];

 int isdir;

 intisopen;

 charcontent[255];

 fnode*parent;

 fnode*child;

 fnode*prev;

 fnode*next;

};

b)函数介绍

fnode*initfile(charfilename[],intisdir);//初始化文件或目录 

 voidcreateroot();//建立系统根目录

 intrun();系统运行

 intfindpara(char*topara);对参数进行处理

 boolchklogin(char*users,char*pwd);检查账号与口令

 voidhelp();命令列表

 intmkdir();建立目录

 intcreate();建立文件

 intread();读取文件

 intwrite();写入文件

 intdel();删除文件

 intcd();切换目录

 intdir();文件与目录列表

(4)各模块流程图

      

(5)、模拟文件系统参考程序清单

#include"stdio.h"

#include"iostream.h"

#include"string.h"

#include"iomanip.h"

#defineFILENAME_LENGTH10//文件名称长度

#defineCOMMAND_LENGTH10 //命令行长度

#definePARA_LENGTH30   //参数长度

 

 

//账号结构

 typedefstructusers

{

 char    name[8];

 char    pwd[10];

}users;

 //文件结构

structfnode

{

   charfilename[FILENAME_LENGTH];

 int isdir;

 intisopen;

 charcontent[255];

 fnode*parent;

 fnode*child;

 fnode*prev;

 fnode*next;

};

//账号

usersusrarray[8]=

{

 "usr1","usr1",

 "usr2","usr2",

 "usr3","usr3",

 "usr4","usr4",

 "usr5","usr5",

 "usr6","usr6",

 "usr7","usr7",

 "usr8","usr8",

};

 fnode*initfile(charfilename[],intisdir);

 voidcreateroot();

 intrun();

 intfindpara(char*topara);

 boolchklogin(char*users,char*pwd);

 voidhelp();

 intmkdir();

 intcreate();

 intread();

 intwrite();

 intdel();

 intcd();

 intdir();

fnode*root,*recent,*temp,*ttemp;

charpara[PARA_LENGTH],command[COMMAND_LENGTH],temppara[PARA_LENGTH],recentpara[PARA_LENGTH];

//创建文件与目录结点

 fnode*initfile(charfilename[],intisdir)

{

   fnode*node=newfnode;

   strcpy(node->filename,filename);

   node->isdir=isdir;

 node->isopen=0;

 node->parent=NULL;

   node->child=NULL;

 node->prev=NULL;

 node->next=NULL;

 returnnode;

}

//创建文件存储结点

voidcreateroot()

{

  recent=root=initfile("/",1);

  root->parent=NULL;

  root->child=NULL;

  root->prev=root->next=NULL;

  strcpy(para,"/");

  

  }

intmkdir()

 temp=initfile("",1);

 cin>>temp->filename;

 if(recent->child==NULL) 

  {

    temp->parent=recent;

 temp->child=NULL;

 recent->child=temp;

 temp->prev=temp->next=NULL;

    

  }

  else

  {

   ttemp=recent->child;

 while(ttemp->next)

 {

   ttemp=ttemp->next;

   if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==1)

   {

       printf("对不起,目录已存在!

");

    return1;

    }

 }

     ttemp->next=temp;

  temp->parent=NULL;

  temp->child=NULL;

  temp->prev=ttemp;

  temp->next=NULL;

  

  }

return1;

}

intcreate()

 temp=initfile("",0);

 cin>>temp->filename;

 cin>>temp->content;

 if(recent->child==NULL) 

  {

    temp->parent=recent;

 temp->child=NULL;

 recent->child=temp;

 temp->prev=temp->next=NULL;

 cout<<"文件建立成功!

"<

  }

  else

  {

   ttemp=recent->child;

 while(ttemp->next)

 {

   ttemp=ttemp->next;

   if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==0)

   {

       printf("对不起,文件已存在!

");

    return1;

    }

 }

     ttemp->next=temp;

  temp->parent=NULL;

  temp->child=NULL;

  temp->prev=ttemp;

  temp->next=NULL;

  cout<<"文件建立成功!

"<

  }

   

return1;

}

intdir()

{

inti=0,j=0;

temp=newfnode;

temp=recent;

if(temp!

=root)

{cout<<"     

                        "<<".."<

if(temp->child==NULL)

{

   cout<<"Total:

"<<"directors                 "<

 return1;

}

temp=temp->child;

while(temp)

{

   if(temp->isdir)

 {cout<<"     

                       "<filename<

 else

 {cout<<"                           "<filename<

 temp=temp->next;

 }

cout<<"Total:

"<<"directors                 "<

}

intread()

{

charfilename[FILENAME_LENGTH];

cin>>filename;

  if(recent->child==NULL)

  {

  cout<<"文件不存在!

"<

  return1;

  }

  if(strcmp(recent->child->filename,filename)==0)

  {

   cout<child->content<

   return1;

  }

  else

  {

  temp=recent->child;

  while(temp->next)

  {

  if(strcmp(temp->next->filename,filename)==0)

  {cout<next->content<

  return1;}

  }

  cout<<"文件不存在!

"<

  

  }

 

}

intwrite()

{

charfilename[FILENAME_LENGTH];

cin>>filename;

  if(recent->child==NULL)

  {

  cout<<"文件不存在!

"<

  return1;

  }

  if(strcmp(recent->child->filename,filename)==0)

  {

   recent->child->isopen=1;//设置文件标记为打开

   cin>>recent->child->content;

   recent->child->isopen=0;//设置文件标记为关闭

   cout<<"文件写入成功!

"<

   return1;

  }

  else

  {

  temp=recent->child;

  while(temp->next)

  {

  if(strcmp(temp->next->filename,filename)==0)

  {

   recent->child->isopen=1;//设置文件标记为打开

     cin>>temp->next->content;

   recent->child->isopen=0;//设置文件标记为关闭

   cout<<"文件写入成功!

"<

  return1;}

  }

  cout<<"文件不存在!

"<

  

  }

}

intcd()

{ chartopara[PARA_LENGTH];

 cin>>topara;

  if(strcmp(topara,"..")==0)

  {

     inti;

  while(recent->prev)

  recent=recent->prev;

  if(recent->parent)

  {

  recent=recent->parent;

  }

     

  i=strlen(para);

  while(para[i]!

='/'&&i>0)i--;

  if(i!

=0)

   para[i]='\0';

  else

   para[i+1]='\0';

}

else

{

 findpara(topara);

}

return1;

}

intfindpara(char*topara)

{

  inti=0;

  intsign=1;

  if(strcmp(topara,"/")==0)

  {

   recent=root;

   strcpy(para,"/");

   return1;

  }

  temp=recent;

  strcpy(temppara,para);

  if(topara[0]=='/')

  {

   recent=root->child;

   i++;

   strcpy(para,"/");

  }

  else

  {

     if(recent!

=NULL&&recent!

=root)

         strcat(para,"/");

       if(recent&&recent->child)

  {

   if(recent->isdir)

          recent=recent->child;

        else

  {

     printf("路径错误!

\n");

  return1;

  }

  }

}

  while(i<=strlen(topara)&&recent)

  {

   intj=0;

   if(topara[i]=='/'&&recent->child)

   {

   i++;

   if(recent->isdir)

       recent=recent->child;

   else

   {printf("路径错误\n");

       return0;

   }

   strcat(para,"/");

  }

  while(topara[i]!

='/'&&i<=strlen(topara))

  {

     recentpara[j]=topara[i];

  i++;j++;

  }

  recentpara[j]='\0';

  while((strcmp(recent->filename,recentpara)!

=0||(recent->isdir!

=1))&&recent->next!

=NULL)

  {

      recent=recent->next;

  }

  if(strcmp(recent->filename,recentpara)==0)

  {

   if(recent->isdir==0)

   {strcpy(para,temppara);

   recent=temp;

   printf("是文件不是目录。

\n");

   return0;

   }

   strcat(para,recent->filename);

  }

  if(strcmp(recent->filename,recentpara)!

=0||recent==NULL)

  {

  strcpy(para,temppara);

  recent=temp;

  printf("输入路径错误\n");

  return0;

  }

  }

return1;

}

intdel()

{

 charfilename[FILENAME_LENGTH];

 cin>>filename;

 

 temp=newfnode;

 

 

 if(recent->child)

 {

   temp=recent->child;

 while(temp->next&&(strcmp(temp->filename,filename)!

=0||temp->isdir!

=0))

       temp=temp->next;

 if(strcmp(temp->filename,filename)!

=0)

 {

   cout<<"不存在该文件!

"<

   return0;

 }

 }

 else

 {

   cout<<"不存在该文件!

"<

 return0;

 }

 

 if(temp->parent==NULL)

 {

  temp->prev->next=temp->next;

  if(temp->next)

    temp->next->prev=temp->prev;

       temp->prev=temp->next=NULL;

 }

 else

 {

  if(temp->next)

   temp->next->parent=temp->parent;

  temp->parent->child=temp->next;

 }

 deletetemp;

 cout<<"文件已删除!

"<

}

 

boolchklogin(char*users,char*pwd)

{

 inti;

 for(i=0;i<8;i++)

 {

  if((strcmp(users,usrarray[i].name)==0) &&(strcmp(pwd,usrarray[i].pwd)==0))

   returntrue;

 }

 returnfalse;

}

voidhelp(void)

{

 cout<<"                 命 令 一 览              "<

 cout<

 cout<<"create:

            建立文件。

               "<

 cout<<"read:

              读取文件。

                 "<

 cout<<"write:

             写入文件,支持多线程         "<

 cout<<"del  :

            删除文件。

                 "<

 cout<<"mkdir:

             建立目录。

               "<

 cout<<"cd:

                切换目录。

                 "<

 cout<<"logout:

            退出登录。

               "<

}

intrun()

{

 cout<<"linux:

"<";

 cin>>command;

  if(strcmp(command,"mkdir")==0)

  mkdir();

 elseif(strcmp(command,"dir")==0)

  dir();

 elseif(strcmp(command,"cd")==0)

  cd();

 elseif(strcmp(command,"create")==0)

  create();

 elseif(strcmp(command,"read")==0)

  read();

 elseif(strcmp(command,"write")==0)

  write();

elseif(strcmp(command,"del")==0)

  del();

elseif(strcmp(command,"help")==0)

  help();

 elseif(strcmp(command,"logout")==0)

 return0;

   else

 cout<<"请参考help提供的命令列表!

"<

 }

intmain()

{

inti=0;

boolin=false;

charusers[8],pwd[12];

  cout<<"|----

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1