二级文件管理系统——操作系统

该系统包含

login  用户登陆

dir        列目录

create    创建文件

delete    删除文件

open    打开文件

close    关闭文件

read    读文件

write    写文件

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

3.源文件可进行读写保护

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<iostream>


using namespace std;
#define MaxDisk 512  //一个扇区512字节
char Disk[MaxDisk];   //磁盘空间;
int usertype=0;//全局变量,当前用户类型
char usernowname[10];//全局变量,当前用户名
int nowlevel; //全局变量,当前目录层次
char usernowpath[200] = "root\\\0";
int snum=-1;
int fcount=0;   //文件数
//用户类型定义
int ucount=0; //
struct users
{
    char name[10];//用户名
    int num;        //用户编号
    char pass[10];//用户密码
}user[10];
struct F_Disk
{
    int surplus;             //文件剩余空间
int nlength;          //文件当前占用
}fdisk[100];
struct UFD
{
string Fname;             //文件名
int Start;                  //文件在磁盘存储空间的起始地址
int num;                    //文件的上级  -1表示文件删除
int type;                      //0关闭 1打开
    int limit;                    //文件读写权限   1读 2读写
int M_length;      //文件的最大长度
}file[100];
//WENJIAN
void Main_screen();
void index();
int login();
bool createuser();
int digit();
bool createfile();




bool createfile(){
    string fname;
    int M_length;
    int start;
    cout<<"请输入要创建的文件名: ";
cin>>fname;
    for(int i=0;i<fcount;i++){
        if(snum==file[i].num){
            if(fname==file[i].Fname)
            {
                printf("文件已存在!\n");
                return false;
            }
        }
        start+=file[i].M_length;
    }
cout<<"请输入文件的最大容量:";
cin>>M_length;
if(MaxDisk<=start+M_length){


        cout<<"磁盘空间不足!\n"<<endl;
        return false;
}
cout<<"文件创建成功!"<<endl;
file[fcount].Fname=fname;         //文件名
file[fcount].limit=2;
file[fcount].M_length=M_length;     //文件长度
file[fcount].num=snum;              //文件节点
file[fcount].Start=start;
file[fcount].type=0;          //文件关闭状态
fdisk[fcount].nlength=0;
fdisk[fcount].surplus=M_length;
fcount++;
    return true;
}
int login(){
    char name[10];
    char psw[10];
    cout<<"\n\t\t用户名:";
    cin>>name;
    cout<<"\t\t密  码:";
    cin>>psw;
    if(strcmp(name,"root")==0&&strcmp(psw,"root")==0){//管理员
        usertype=1;
        strcat(usernowname,"root");
        return 1;
    }
    int i;
    for(i=0;i<ucount;i++){ //普通用户登陆
            if(strcmp(user[i].name,name)==0&&strcmp(user[i].pass,psw)==0)
            {
                printf("登陆成功!\n");
                    strcat(usernowname,user[i].name);
                    snum=user[i].num;
                    strcpy(usernowname,name);//记录当前用户的主路径
                    nowlevel=-1;//记录当前目录层次
                //设置路径
                    if(strcmp(usernowpath,"root\\")!=0){ //不是根目录就添加斜杠
                        strcat(usernowpath,"\\");
                    }
                    strcat(usernowpath,usernowname);
                    return 2;
            }
        }
        if(i==ucount+1){
            printf("输入错误\n");
            return 0;
        }


}
bool open(){
    string fname;
    cout<<"请输入文件名: ";
    cin>>fname;
    for(int i=0;i<fcount;i++){
        if(file[i].Fname==fname){
            if(snum==file[i].num){
                if(file[i].type==1){
                    cout<<"该文件已打开!"<<endl;
                    return false ;


                }
                else{
                    int type;
                    cout<<"请选择文件打开方式<1-只读,2-可读可写>:";
                    cin>>type;
                    if(type==1)
                        file[i].limit=1;
                    else if(type==2)
                        file[i].limit=2;
                    else{
                        cout<<"输入错误!";
                        return false;
                    }
                    file[i].type=1;
                    cout<<"文件已打开!"<<endl;
                    return true;
                }


            }
        }
    }
    printf("文件不存在!\n");
    return false;
}
bool close(){
    string fname;
    cout<<"请输入文件名:";
    cin>>fname;
    for(int i=0;i<fcount;i++){
        if(file[i].Fname==fname){
            if(snum==file[i].num){
                if(file[i].type==0){
                    cout<<"该文件未打开!"<<endl;
                    return false ;
                }
                else{
                    file[i].type=0;
                    cout<<"文件关闭!"<<endl;
                    return true;
                }


            }
        }
    }
    printf("文件不存在!\n");
    return false;


}
void logout(){
    strcpy(usernowname," ");
    nowlevel=-1;
    snum=-1;
    strcpy(usernowpath,"root\\");
}
bool createuser(){
    char name[10];
    char psw[10];
    cout<<"\n用户名:";
    cin>>name;
    if(strcmp(name,"root")==0){
        printf("Error!用户已存在\n");
        return false;
    }
    else{
        for(int i=0;i<ucount;i++){
            if(strcmp(user[i].name,name)==0){
                cout<<"用户已存在!"<<endl;
                return false;
            }
        }


                cout<<"密  码:";
                cin>>psw;
                cout<<"用户创建成功"<<endl;
                user[ucount].num=ucount;
                strcpy(user[ucount].name,name);
                strcpy(user[ucount].pass,psw);
                ucount++;
                return true;
    }
}
bool Delete(){
    string fname;
    cout<<"请输入文件名: ";
    cin>>fname;
    for(int i=0;i<fcount;i++){
        if(file[i].Fname==fname){
            if(snum==file[i].num){
                    char s;
                    cout<<"确认删除该文件<y or n>:";
                    cin>>s;
                    if(s=='y'){
                        file[i].num=-1;
                        cout<<"该文件已删除!占用资源已释放!"<<endl;
                        return true ;
                    }
                    else
                        return true;
            }


        }
    }
    printf("文件不存在!\n");
    return false;




}
bool rename(){
    string fname;
    cout<<"请输入文件名: ";
    cin>>fname;
    for(int i=0;i<fcount;i++){
        if(file[i].Fname==fname){
            if(snum==file[i].num){
                    string rename;
                    cout<<"重命名:";
                    cin>>rename;
                    file[i].Fname=rename;
                    return true ;
            }
            else{
                printf("文件不存在!\n");
                return false;
            }


        }
    }
    printf("文件不存在!\n");
    return false;
}
bool ls(){
    int c=0;
    for(int i=0;i<fcount;i++){


            if(snum==file[i].num){
                cout<<"文件名\t文件空间\t起始位置\t文件路径\t文件权限"<<endl;
                cout<<file[i].Fname<<"\t"<<file[i].M_length<<"\t\t"<<file[i].Start<<"\t\t";
                strcat(usernowpath,"\\");
                    cout<<usernowpath<<file[i].Fname;
                    if(file[i].limit==2)
                    cout<<"\t r-w"<<endl;
                    else
                    cout<<"\t r-x"<<endl;
                c++;
                strcpy(usernowpath,"root\\");
                strcat(usernowpath,usernowname);
            }


            if(fcount-1==i&&c!=0)
            return true;


    }
    printf("文件不存在!\n");
    return false;
}
bool WriteFile(){


    string fname;
    int length;
    char temp[MaxDisk]={'\0'};
    cout<<"请输入文件名:";
    cin>>fname;
    int n=0;
    for(int i=0;i<fcount;i++){


        if(file[i].Fname==fname){


            if(snum==file[i].num){




                if(file[i].type==1){
                        if(file[i].limit==1){
                            cout<<"文件:"<<fname<<"不可写"<<endl;
                            return false;
                        }
                        if(file[i].limit==2){
                            cout<<"请输入要写入的长度:";
                            cin>>length;
                            if(length>fdisk[i].surplus){
                                printf("数据长度超限!\n");
                                return true;
                            }
                            else{
                                cout<<"请写入指定长度的内容:<以回车作为结束符>"<<endl;
                                scanf("%s",temp);
                                if(strlen(temp)<=length){
                                    int j=0;


                                    n=file[i].Start+fdisk[i].nlength;
                                    for(int k=n;k<n+strlen(temp);k++){
                                        Disk[k]=temp[j];
                                        j++;
                                    }
                                    fdisk[i].nlength+=strlen(temp);
                                    fdisk[i].surplus-=strlen(temp);
                                }
                                else{
                                    int j=0;
                                    for(int k=n;k<n+length;k++){
                                        Disk[k]=temp[j];
                                        j++;
                                    }
                                    fdisk[i].nlength+=length;
                                     fdisk[i].surplus-=length;
                                }
                                cout<<"文件"<<fname<<"写入成功!!!"<<endl;
                                return true;
                            }
                        }
                }
                if(file[i].type==0){
                    cout<<"该文件未打开!"<<endl;
                    return false ;
                }


            }
        }
    }
    printf("文件不存在!\n");
    return false;


}
//读文件
bool ReadFile(){
    string fname;
    cout<<"请输入文件名:";
    cin>>fname;
    for(int i=0;i<fcount;i++){


        if(file[i].Fname==fname){


            if(snum==file[i].num){


                if(file[i].type==0){
                    cout<<"该文件未打开!"<<endl;
                    return false ;
                }


                else{
                    if(fdisk[i].nlength==0){
                        cout<<"文件为空!"<<endl;
                        return true;
                    }
                    for(int k=file[i].Start;k<file[i].Start+fdisk[i].nlength;k++)
                        cout<<Disk[k];
                        cout<<endl;
                    return true;
                }


            }
        }
    }
    printf("文件不存在!\n");
    return false;


}


void Sdisk(){


        int surplus=0;
        cout<<"磁盘空间\t占用资源\t剩余资源"<<endl;


            cout<< MaxDisk<<"\t\t";
            if(fcount!=0){
                surplus=file[fcount-1].Start+file[fcount-1].M_length;
                surplus=MaxDisk-surplus;
                for(int i=0;i<fcount;i++){
                    if(file[i].num!=-1)
                        surplus+=file[i].M_length;
                }
                cout<<surplus<<"\t\t";
                cout<<MaxDisk-surplus<<"\t"<<endl;
            }
            else{
                cout<<MaxDisk<<"\t\t";
                 cout<<MaxDisk-surplus<<"\t"<<endl;
            }


    return ;


}


void index(){
        int t;
        int choice;
        while(1){
            system("cls");
            while(1){
                system("cls");
                printf("\n\n");
                printf("\t*************************************\n");
                printf("\t*        欢迎来到文件管理系统    *\n");
                printf("\t    *********用 户 登 录*********\n");
                printf("\t*************************************\n");
                t=login();
                if(t!=0) break;
            }
        if(t==1){
            bool out=false;
            system("cls");
            printf("\t  *************************************\n");
            printf("\t  *     1.创建用户  2.退出登陆    *\n");
            printf("\t      *       3.查看磁盘     *\n");
            printf("\t    ***********欢迎登陆*********\n");
            printf("\t 请选择操作:");
            printf("\t %d:",ucount);
            while(1){
                     fflush(stdin);
                      cin>>choice;
                        switch(choice){
                            case 1:
                                createuser();break;
                            case 2:
                                out=true;
                                logout();break;
                            case 3:
                                Sdisk();break;
                            default:
                                printf("Error:错误命令\n");
                                break;
                        }
                         printf("\t 请选择操作:");printf("\t %d:",ucount);
                        if(out)
                            break;
                    }


        }
        else if(t==2){
            system("cls");
            cout<<"****************文件系统**************"<<endl;
            cout<<"|\t         指    令           |"<<endl;
            cout<<"|\t 1.创建文件    6.写入文件   |"<<endl;
            cout<<"|\t 2.删除文件    7.文件目录   |"<<endl;
            cout<<"|\t 3.打开文件    8.重命文件   |"<<endl;
            cout<<"|\t 4.关闭文件    9.退出系统   |"<<endl;
            cout<<"|\t 5.读取文件    0.清    屏   |"<<endl;
            cout<<"**************************************"<<endl;
            while(1){
            cout<<"\t请选择操作:";


            int select;
                cin>>select;
                switch(select){
                    case 0:
                    system("cls");
            cout<<"****************文件系统**************"<<endl;
            cout<<"|\t          指    令          |"<<endl;
            cout<<"|\t 1.创建文件    6.写入文件   |"<<endl;
            cout<<"|\t 2.删除文件    7.文件目录   |"<<endl;
            cout<<"|\t 3.打开文件    8.重命文件   |"<<endl;
            cout<<"|\t 4.关闭文件    9.退出系统   |"<<endl;
            cout<<"|\t 5.读取文件    0.清    屏   |"<<endl;
            cout<<"**************************************"<<endl;break;
                    case 1:
                    createfile();
                        break;


                    case 2:
                    Delete();
                    break;


                    case 3:
                        open();
                        break;


                    case 4:
                        close();
                        break;
                    case 5:
                        ReadFile();
                        break;
                    case 6:
                        WriteFile();
                        break;
                    case 8:
                        rename();
                        break;
                    case 7:
                        ls();
                        break;
                    case 9:
                        logout();
                        index();
                        break;
                    }
            }
        }


    }


}




int main(){


    index();


}
共两个不同设计例子,都含详细的文档资料。 任务2.设计一个简单的二级文件系统 设计要求: 在任一OS下,建立一个大文件,把它假象成硬盘,在其中实现一个简单的模拟文件系统。 编写一管理程序对此空间进行管理,要求: 1. 实现盘块管理 2. 实现文件的读写操作 3. 每组最多2人,小组内要有明确分工,课程设计报告中设计部分可以相同,个人实现部分不同 参考建议: 将模拟硬盘的文件空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。 设计技术参数(数据结构)参考: #define MaxSize 100 #define Disk 512 //每个盘块大小为512bit #define NumDisk 2048 //有2048个盘块,既可分配空间为 1M /*************目录和文件的结构定义***********************/ struct DirectoryNode { char name[9]; /*目录或文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct DirectoryNode *next; /*指向下一个兄弟结点的指针*/ struct DirectoryNode *preDirFile; /*指向父结点的指针*/ struct DirectoryNode *subFile; /*指向第一个子结点的指针*/ int size; /*如果是文件则表示文件的大小*/ int first; /*起始盘块号*/ int last; /*末尾盘块号*/ int order; /*备用*/ }; //连续分配 struct FileSys { int VacTable[NumDisk]; //空闲表,0为空闲,1为被用 struct DirectoryNode root; //根目录 struct DirectoryNode Directory[NumDisk]; } *filesys; typedef struct { struct DirectoryNode *DirFile; char name[9]; }DataType; //包含一个指向目录的指针和名字 typedef struct { //队列结构的实现 DataType data[MaxSize]; int front,rear; //分别表示队列的头结点和尾结点 }Tp; void InitQueue(Tp *sq) //队列初始化 int EnAddQueue(Tp *sq,DataType data) //在队列中增加元素 DataType EnDelQueue(Tp *sq) //从队列中删除一个元素 int Empty(Tp *sq) //判断队列是否为空,返回0表示队列为空 ①.Dir:显示目录内容命令,显示当前目录下的文件和子目录。 ②.Md:创建目录操作。 ③.Create:创建文件,在当前目录下创建一个文件。 ④. all:显示从根目录开始的所有目录和文件及其层次结点。 ⑤.Cd:改变目录。 ⑥.Del:删除文件操作。 ⑦. Rd:删除目录操作,删除当前目录下的子目录。 ⑧. Ren:重命名函数 ⑨. Exit:退出命令
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值