美文网首页
文件管理系统

文件管理系统

作者: 萌萌饭团君 | 来源:发表于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
    

    相关文章

      网友评论

          本文标题:文件管理系统

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