实验四:文件管理
一、实验目的
- 本课程设计的目的是设计一个简单多用户文件系统,切身体验理解文件体统的内部构造,实现对文件,目录的操作,运用链表模拟实现各种功能,同时实现一级索引,二级索引等完成对空间的分配操作。
- 通过本课程设计理解文件系统的内部功能及内部实现,完善课本上各种文件系统的操作与认识。
二、实验要求及内容
1.delete 删除文件
2.open 打开文件
3.close 关闭文件
4.read 读文件
5.write 写文件
三、实验代码
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<iomanip>
using namespace std;
#if _MSC_VER>1000
#pragma once
#endif //_MSC_VER>1000
extern int disk_block[10000];
extern int disk_empty;
typedef struct UFD //存储文件信息
{
char name[10]; //文件名
int attribute; //属性
int length; //长度
int a[10]; //为文件本身分配10个空间
int *p1; //一级索引,100个空间
int (*p2)[100]; //二级索引,100*100个空间
struct UFD *next;
}UFD;
typedef struct DIR //存储目录信息
{
DIR* above; //上一结点
char name[10];
int length;
DIR *next; //下一结点
UFD *File_head; //此目录下的文件指针
DIR *Dir_head; //此目录下目录链表指针
}DIR;
class Cuse //定义管理用户目录的类
{
DIR *now; //当前目录
UFD *Fhead; //文件的头结点
DIR *Dhead; //根目录的目录链头结点
char code[10]; //密码
char name[10]; //用户名
int length; //用户空间大小
int status; //是否获得空间
public:
void set_status(int);
int dele_user();
int dis_file(); //显示文件所占外存块号
int dis_dir(DIR *d);//当前路径
int get_length();
char const *get_name();
char const *get_code();
int get_status();
int set_user(char *,char *);//设置用户名与密码
DIR *get_now();
int dele_file(UFD *f); //删除文件
int dele_dir(DIR*); //删除目录
Cuse(); //构造
~Cuse(); //析构
int goback(); //返回上级
int dis_now(); //显示当前目录
int new_file();
int new_dir();
int open_dir();
int open_file();
int first_dele_file(); //删除文件的前部分工作
int first_dele_dir(); //删除目录的前部分工作
int set_code();
};
class Cdisk{
//用户类
public:
Cuse user[5]; //用户个数最多为5
char code[10];
int dis_disk();
int first_dele_user();
int dele_user(int);
int new_user(); //查看当前用户与外存空间使用情况,后创建新用户
int set_code(); //设置新密码
int login(char); //登陆
Cdisk();
virtual~Cdisk(); //虚函数,析构
};
int disk_block[10000];
int disk_empty;
Cdisk::Cdisk() //管理磁盘的类,构造函数
{
int i=0;
char code[10]="123456";
for(i=0;i<10000;i++) //初始化所有磁盘块为空闲
disk_block[i]=0;
//this->user[0].set_user("student","123");//默认一个用户
disk_empty=10000;
cout.setf(ios::left); //设置输出方式
}
Cdisk::~Cdisk() //析构
{
}
int Cdisk::dele_user(int i) //Cdisk类dele_user的构造
{
Cuse C;
C=user[i];
user[i].dele_user(); //调用Cuse类的成员函数 int dele_user()
return 1;
}
int Cdisk::dis_disk() //检查磁盘信息
{
int i=0;
cout<<setw(14)<<"用户名"<<setw(14)<<"占用空间大小"<<endl;
for(i=0;i<5;i++)
if(user[i].get_status()==1) //存在的用户的信息
cout<<setw(14)<<user[i].get_name()<<setw(14)<<user[i].get_length()<<endl;
cout<<"已用空间:"<<10000-disk_empty<<endl<<"剩余空间:"<<disk_empty<<endl;
return 1;
}
int Cdisk::login(char b) //登陆
{
char n[10],c[10];
int i;
if(b=='1')
{
cout<<"用户:管理员"<<endl;
cout<<"密码:默认\n"<<endl;
system("pause");
return 1;
}
else
{
if(!user[0].get_status()) //当前不存在用户
{
i=0;
cout<<"当前用户为空,欢迎注册!"<<endl;
user[i].set_status(1); //为新用户分配权利
cout<<"请输入用户名:"<<endl;
cin>>n;
cout<<"请输入密码:"<<endl;
cin>>c;
user[i].set_user(n,c); //调用Cuse的成员函数,传递用户名与密码
cout<<"恭喜,创建用户成功!"<<endl;
return i;
}
else
{
cout<<"用户名:";
cin>>n;
cout<<"密码:";
cin>>c;
cout<<endl;
for(i=0;i<5;i++) //查找是否存在此用户
{
if(user[i].get_status()) //存在方比较
if(!strcmp(n,user[i].get_name())) //相等时为0,此判断为匹配
if(!strcmp(c,user[i].get_code())) //密码匹配
{
cout<<"登陆成功!"<<endl;
cout<<"欢迎"<<user[i].get_name()<<"登陆"<<endl;
return i;
}
else
{
cout<<"密码错误"<<endl;
return -1;
}
}
cout<<"此用户不存在!"<<endl;
return -1;
}
}
}
int Cdisk::set_code() //设置新密码
{
char temp1[10],temp2