文件管理系统

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

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

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

用户文件目录UFD

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

程序代码:

#include  
#include  
#include 
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 UFD;
struct MFDItem {
    string userName;
    UFD ufd;
    MFDItem(string un) {
        userName = un;
    }
};
typedef vector 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" : "")<ufd;
    UFD::iterator it = getFile(fileName, true);
    if (it == ufd.end()) {
        cout<<"文件"<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<<" 文件"<readonly) {
            cout<<" 文件"<data = data; cout<<"文件"<ufd;
    UFD::iterator it = getFile(fileName, true); if (it == ufd.end()) {
        cout<<"文件"<opened = false;
        openedFileCnt--; cout<<"文件"<ufd;
    UFD::iterator it = getFile(fileName);
    if (it == ufd.end()) {
        cout<<"找不到文件"<opened) {
            cout<<"文件"<= MAX_FILE_OPN) {
            cout << "现在已经打开" << MAX_FILE_OPN << "个文件,达到上限。\n";
            return false;
        }
        it->opened = true; openedFileCnt++; cout<<"文件"<ufd;
    UFD::iterator it = getFile(fileName);
    if (it == ufd.end()) {
        cout<<"找不到"<opened) {
            cout<<"文件"<ufd;
    if (ufd.size() >= MAX_FILE_CNT) {
        cout<<"该用户已创建"<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<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

你可能感兴趣的:(文件管理系统)