美文网首页
文件管理系统

文件管理系统

作者: 萌萌饭团君 | 来源:发表于2019-02-16 09:31 被阅读0次

采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。

1、设计一个有m个用户的文件系统,每个用户最多可保存一个文件。
2、规定用户在一次运行中只能打开K个文件。
3、系统能检查键入命令的正确性,出错时应能显示出错原因。
4、对文件应能设置保护措施,如只能执行、允许读、允许写等。
5、对文件的操作设计提供一套文件操作:
CREATE建立文件;
DELETE删除文件;
OPEN打开文件;
CLOSE关闭文件;
READ读文件;
WRITE写文件。
6、二级目录结构如下:
主文件目录MFD

用户名 用户文件目录地址
UserName *

用户文件目录UFD

文件名 状态(打开/建立) 指针
FileName On/Off *

程序代码:

#include <vector> 
#include <string> 
#include <iostream>
using namespace std;
#define MAX_USER_CNT 10 
#define MAX_FILE_OPN 10 
#define MAX_FILE_CNT 1 
struct UFDItem {
    string fileName;
    bool opened, readonly;
    string data;
    UFDItem(string fn, bool o, bool r) {
        fileName = fn;
        opened = o;
        readonly = r;
        data = "";
    }
};
typedef vector<UFDItem> UFD;
struct MFDItem {
    string userName;
    UFD ufd;
    MFDItem(string un) {
        userName = un;
    }
};
typedef vector<MFDItem> MFD;
MFD mfd;
MFD::iterator currentUser;
int openedFileCnt;

bool checkUser() {
    if (currentUser == mfd.end()) {
        puts("当前没有登录的用户! "); return false;
    }
    return true;
}
UFD::iterator getFile(string fileName, bool opened = false) {
    UFD &ufd = currentUser->ufd;
    for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
        if (it->fileName == fileName && (!opened || it->opened)) return it;
    }
    return ufd.end();
}
void dir(bool opened) {
    if (checkUser()) {
        bool empty = true;
        UFD &ufd = currentUser->ufd;
        for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
            if (!opened || it->opened) {
                cout<< it->fileName.c_str()<<"\t"<<(it->readonly ? "readonly" : "readwrite")<<"\t"<<(it->opened ? "opened" : "")<<endl;
                empty = false;
            }
        }
        if (empty) puts("文件列表为空! ");
    }
} 
bool readFile(string fileName) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    UFD::iterator it = getFile(fileName, true);
    if (it == ufd.end()) {
        cout<<"文件"<<fileName.c_str()<<"不存在或未被打开! \n";
        return false;
    }
    else {
        cout << "文件" << fileName.c_str() << "打开成功!文件内容为:" << it->data.c_str() << endl;
        return true;
    }
} 
bool writeFile(string fileName, string data) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    UFD::iterator it = getFile(fileName, true);
    if (it == ufd.end()) {
        cout<<" 文件"<<fileName.c_str()<<"不存在或未被打开! \n"; return false;
    }
    else {
        if (it->readonly) {
            cout<<" 文件"<<fileName.c_str()<<"是只读的,不能写入文件!\n"; return false;
        }
        else {
            it->data = data; cout<<"文件"<<fileName.c_str()<<"写入成功! \n"; return true;
        }
    }
}
bool closeFile(string fileName) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    UFD::iterator it = getFile(fileName, true); if (it == ufd.end()) {
        cout<<"文件"<<fileName.c_str()<<"不存在或未被打开! \n"; return false;
    }
    else {
        it->opened = false;
        openedFileCnt--; cout<<"文件"<<fileName.c_str()<<"关闭成功! \n"; return true;
    }
} 
bool openFile(string fileName) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    UFD::iterator it = getFile(fileName);
    if (it == ufd.end()) {
        cout<<"找不到文件"<<fileName.c_str()<<"!\n"; return false;
    }
    else {
        if (it->opened) {
            cout<<"文件"<<fileName.c_str()<<"已经打开。 \n"; return false;
        }
        if (openedFileCnt >= MAX_FILE_OPN) {
            cout << "现在已经打开" << MAX_FILE_OPN << "个文件,达到上限。\n";
            return false;
        }
        it->opened = true; openedFileCnt++; cout<<"文件"<<fileName.c_str()<<"打开成功! \n";
        return true;
    }
}  
bool deleteFile(string fileName) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    UFD::iterator it = getFile(fileName);
    if (it == ufd.end()) {
        cout<<"找不到"<<fileName.c_str()<<"文件\n"; return false;
    }
    else {
        if (it->opened) {
            cout<<"文件"<<fileName.c_str()<<"正在被使用,不能被删除! \n"; return false;
        }
        ufd.erase(it); cout<<"文件"<<fileName.c_str()<<"删除成功! \n"; return true;
    }
} 
bool createFile(string fileName, bool readonly) {
    if (!checkUser()) return false;
    UFD &ufd = currentUser->ufd;
    if (ufd.size() >= MAX_FILE_CNT) {
        cout<<"该用户已创建"<<MAX_FILE_CNT<<"个文件,达到上限。 \n"; return false;
    }
    UFD::iterator it = getFile(fileName);
    if (it != ufd.end()) {
        cout<<"文件"<<fileName.c_str()<<"已存在! \n"; return false;
    } ufd.push_back(UFDItem(fileName, false, readonly)); cout<<"文件"<<fileName.c_str()<<"创建成功! \n";
    return true;
} 
bool login(string userName) {
    if (currentUser != mfd.end()) {
        if (currentUser->userName == userName) puts("该用户已登录。 "); else puts("已有用户登录,请使用 switch 命令切换用户。 "); return false;
    }
    for (MFD::iterator it = mfd.begin(); it != mfd.end(); it++) {
        if (it->userName == userName) {
            puts("登录成功! "); currentUser = it;
            UFD &ufd = it->ufd;
            for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
                if (it->opened) it->opened = false;
            }
            openedFileCnt = 0;
            return true;
        }
    } puts("输入的用户名不存在! "); return false;
} 
string getCommand(char *&command) {
    char *&c = command;
    string cmd;
    while (*c) {
        if (*c == ' ' || *c == '\t') {
            if (cmd.empty()) c++;
            else break;
        }
        else cmd.push_back(*c++);
    } return cmd;
}
void help() { 
    puts("可用命令: ");
    puts("用户登录: login 用户名 "); 
    puts("切换用户: switch 用户名 "); 
    puts("创建文件: create 文件名 [-r|-rw]    r:只读;rw:读写"); 
    puts("删除文件: delete 文件名 "); 
    puts("打开文件: open 文件名"); 
    puts("关闭文件: close 文件名"); 
    puts("读文件: read 文件名 "); 
    puts("写文件: write 文件名 文件内容 "); 
    puts("文件列表: dir [-o]    o:打开的文件列表"); 
    puts("帮助: help"); 
    puts("退出: exit"); 
}
int main() {
    mfd.push_back(MFDItem("zhouhao"));
    mfd.push_back(MFDItem("peter"));
    mfd.push_back(MFDItem("ben"));
    currentUser = mfd.end();
    char buffer[100], *command;
    string cmd, para;
    help();
    while (true) {
        if (currentUser == mfd.end()) cout<<">>";
        else cout<<currentUser->userName.c_str()<<">";
        gets_s(buffer);
        command = buffer;
        if (!(cmd = getCommand(command)).empty()) {
            if (cmd == "login") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少用户名! "); continue;
                } login(cmd);
            }
            else if (cmd == "switch") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少用户名! "); continue;
                }
                currentUser = mfd.end(); login(cmd);
            }
            else if (cmd == "create") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                bool readonly = false;
                if (!(para = getCommand(command)).empty()) {
                    if (para == "-r") readonly = true;
                }
                createFile(cmd, readonly);
            }
            else if (cmd == "delete") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                deleteFile(cmd);
            }
            else if (cmd == "open") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                openFile(cmd);
            }
            else if (cmd == "close") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                closeFile(cmd);
            }
            else if (cmd == "read") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                readFile(cmd);
            }
            else if (cmd == "write") {
                if ((cmd = getCommand(command)).empty()) {
                    puts("缺少文件名! "); continue;
                }
                if ((para = getCommand(command)).empty()) {
                    puts("缺少文件内容! "); continue;
                }
                writeFile(cmd, para);
            }
            else if (cmd == "dir") {
                bool opened = false;
                if (!(para = getCommand(command)).empty()) {
                    if (para == "-o") opened = true;
                }
                dir(opened);
            }
            else if (cmd == "help") help();
            else if (cmd == "exit") break; else puts("输入的命令有误。 ");
        }
    }
    return 0;
}

运行结果:

可用命令:
用户登录: login 用户名
切换用户: switch 用户名
创建文件: create 文件名 [-r|-rw]    r:只读;rw:读写
删除文件: delete 文件名
打开文件: open 文件名
关闭文件: close 文件名
读文件: read 文件名
写文件: write 文件名 文件内容
文件列表: dir [-o]    o:打开的文件列表
帮助: help
退出: exit
>>login ben
登录成功!
ben>switch zhouhao
登录成功!
zhouhao>create text.txt -rw
文件text.txt创建成功!
zhouhao>open text.txt
文件text.txt打开成功!
zhouhao>write text.txt 你好!
文件text.txt写入成功!
zhouhao>read text.txt
文件text.txt打开成功!文件内容为:你好!
zhouhao>close text.txt
文件text.txt关闭成功!
zhouhao>delete text.txt
文件text.txt删除成功!
zhouhao>exit

相关文章

  • 20170810 高级文件系统管理

    文件系统配额管理RAIDLVM逻辑卷管理器 一、文件系统配额管理 文件系统配额:在内核中启用,以文件系统为管理单位...

  • Linux磁盘与文件管理系统

    文件系统简介 什么是文件系统? 操作系统中负责管理和存储文件信息的软件称为文件管理系统,即文件系统。 主要职能: ...

  • 文件总结

    文件的操作,首先我最先想到学操作系统的时候,文件的管理。c语言文件的管理,linux系统文件的管理。 文件系统是操...

  • ASP.NET Core WebApi+EF Core轻量级文件

    一、课程介绍 1、什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件...

  • Linux文件管理

    Linux 文件管理系统 Linux的文件管理系统有很多,例如:本地文件系统:ext3,ext4,xfs,btrf...

  • android webview 文件上传

    1、唤出系统文件管理器 开启文件上传,可使用HTML5标签 唤出系统文件管理器或自定义文件管理器,然后选择文件...

  • Linux 常用命令

    文件系统 磁盘管理 用户管理 系统及其他 网络配置管理

  • 考研计算机操作系统思维导图

    操作系统 文件管理 内存管理

  • Hadoop 之 HDFS

    文件系统 文件系统由三部分组成文件管理软件:Explorer , Total Commander被管理文件: /h...

  • 运维体系

    KodExplorer 文件管理系统

网友评论

      本文标题:文件管理系统

      本文链接:https://www.haomeiwen.com/subject/qhqyeqtx.html