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

  1. 可以实现常用文件目录和文件操作,比如:
    login 用户登录
    dir 列文件目录
    create 创建文件
    delete 删除文件
    open 打开文件
    close 关闭文件
    read 读文件
    write 写文件

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

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

#include<bits/stdc++.h>
class File {
public:
    std::string name;
    std::string content;
    int address;
    int protectionCode;
    int length;
    File()=default;
    File(const std::string& name,int addr, int prot)
            : name(name), address(addr), protectionCode(prot), length(0) {}
};
class Directory {
public:
    std::string name;
    std::map<std::string, File> files;
    std::map<std::string,int> fileopen;
    Directory(const std::string& n) : name(n) {}
    Directory()=default;
    void createFile(const std::string fileName, int protectionCode) {
        int addr=0;
        for(auto t: files)
        {
            addr=std::max(addr,t.second.address+t.second.length+1);
        }
        files[fileName] =  File(fileName, addr, protectionCode);
    }
    void deleteFile(const std::string& fileName) {
        files.erase(fileName);
        fileopen.erase(name);
    }
    void open(const std::string name)
    {
        fileopen[name]=1;
    }
    void close(const std::string name)
    {
        fileopen[name]=0;
    }
    void read(const std::string name)
    {
        if(fileopen[name]==0)
        {
            std::cout<<"文件未打开\n";
            return;
        }
        if(files[name].protectionCode>>1&1){
            std::cout<<files[name].content<<std::endl;
        }else
        {
            std::cout<<"无读取权限\n";
        }
    }
    void write(const std::string name)
    {
        if(fileopen[name]==0)
        {
            std::cout<<"文件未打开\n";
            return;
        }
        if(files[name].protectionCode&1) {
            std::cout << "输入写入内容:\n";
            getline(std::cin,files[name].content);
            files[name].length=files[name].content.size();
        }else
        {
            std::cout<<"无写入权限\n";
        }
    }
    void listContents() const {
        std::cout << "目录:" << name << "\n";

        for (const auto& entry : files) {
            const File& file = entry.second;
            std::cout << "文件:" << file.name << " | 地址:" << file.address
                      << " | 保护码:" << file.protectionCode << " | 长度:" << file.length << "\n";
        }
    }
};

class User {
public:
    std::string username;
    Directory homeDirectory;
    User(const User &user)
    {
        username=user.username;
        homeDirectory=user.homeDirectory;
    }
    User()=default;
    User(const std::string& name) : username(name), homeDirectory(name) {}
};

class FileSystem {
public:
    std::map<std::string, User> users;
    User* currentUser;

    FileSystem() : currentUser(nullptr) {}

    void login(const std::string& username) {
        if (users.find(username) != users.end()) {
            currentUser = &users[username];
            std::cout << "用户" << username << "登录成功\n";
        } else {
            std::cout << "用户" << username << "不存在\n";
        }
    }
    void executeCommand(const std::string& command) {
        std::istringstream iss(command);
        std::vector<std::string> tokens{std::istream_iterator<std::string>{iss},
                                        std::istream_iterator<std::string>{}};

        if (tokens.empty()) {
            return;
        }

        const std::string& cmd = tokens[0];
        if (cmd == "login") {
            if (tokens.size() ==2) {
                login(tokens[1]);
            } else {
                std::cout << "登录: login <username>\n";
            }
        } else if (currentUser) {
            if (cmd == "dir") {
                currentUser->homeDirectory.listContents();
            } else if (cmd == "create") {
                if (tokens.size() ==3) { //cmd,filename,protection(11);
                    currentUser->homeDirectory.createFile(tokens[1], stoi(tokens[2])); 
                } else {
                    std::cout << "创建: create <filename> <protectCode>\n";
                }
            } else if (cmd == "delete") {
                if (tokens.size() ==2) {
                    currentUser->homeDirectory.deleteFile(tokens[1]);
                } else {
                    std::cout << "删除: delete <filename>\n";
                }
            } else if (cmd == "open") {
                if (tokens.size() ==2) {
                    currentUser->homeDirectory.open(tokens[1]);
                } else {
                    std::cout << "打开: open <filename>\n";
                }
            } else if (cmd == "close") {
                if (tokens.size() ==2) {
                    currentUser->homeDirectory.close(tokens[1]);
                } else {
                    std::cout << "关闭: open <filename>\n";
                }
            } else if (cmd == "read") {
                if (tokens.size() ==2) {
                    currentUser->homeDirectory.read(tokens[1]);
                } else {
                    std::cout << "读取: read <filename>\n";
                }
            } else if (cmd == "write") {
                if (tokens.size() ==2) {
                    currentUser->homeDirectory.write(tokens[1]);
                } else {
                    std::cout << "写入: write <filename>\n";
                }
            } else {
                std::cout << "未知命令\n";
            }
        } else {
            std::cout << "未登录\n";
        }
    }
};

int main() {
    FileSystem fileSystem;

    fileSystem.users["user1"] = User("user1");
    fileSystem.users["user2"] = User("user2");

    std::cout<<"输入用户名:";
    std::string name;
    std::cin>>name;
    fileSystem.login(name);
    while(true)
    {
        std::string cmd;
        getline(std::cin,cmd);
        fileSystem.executeCommand(cmd);
    }

}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值