在外存中模拟分区分块的操作系统

#include<bits/stdc++.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <ctime>
#include <chrono>
#include <thread>
#include <mutex>
#include <condition_variable>
#include<map>
#include<conio.h>
#include <filesystem>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;

#define MAX_DISK_NUM 3   // 最多支持3个磁盘分区
#define MAX_PATH_LEN 256  // 最大路径长度
#define BLOCK_SIZE 1024    //块大小1024字节  64*1024*1024

int Current_disknum;
int FAT[64 * 1024];
int BLOCK_CNT = 1;
int sum; //磁盘有多少个文件 每用一次sum归0
int get_cnt = 0;
struct File {
    string creat_time; //创建时间
    string name;   // 文件名
    int size;         // 文件大小(字节数)
    vector<string> content;//文件内容
    int block_cnt;  //块号
};

struct Directory {
    string creat_time; //创建时间
    string name;   // 目录名
    int size;   //目录大小(字节数)
    Directory* parent;                // 父目录的节点
    map<string, File*> files;           // 所包含的文件
    map<string, Directory*> subDirs;         // 子目录
};

// 磁盘结构体
struct Disk {
    string name;        // 盘符
    int size;           // 分区大小(单位:MB)
    int start_block;    //起始块
    int block_num;
    int used_size;      // 已使用空间大小(单位:KB)
    //map<string, File*> files;       // 所包含的文件
    //map<string, Directory*> subDirs; //子目录
    Directory* root;//根目录
};

Disk disk[MAX_DISK_NUM];   // 磁盘数组
int current_disk = -1;      // 当前所在的磁盘编号
int* bitmap;//a盘用位示图

vector<string> records;//存放信息
Directory* curdir;//当前目录

string getTime()
{
    // 获取当前时间
    time_t t = time(nullptr);

    // 将时间转换为本地时间
    tm tm;
    localtime_s(&tm, &t);

    // 格式化时间为字符串
    char buffer[80];
    strftime(buffer, 80, "%Y-%m-%d-%H:%M", &tm);

    return string(buffer);
}

Directory* initDir(string name) {
    Directory* root = new Directory();
    root->name = name;
    root->creat_time = getTime();
    root->parent = NULL;
    return root;
}

void remove_sistem();

void InitDisk() {
    cout << "初始化硬盘命令:InitDisk  A xxM, B yyM, C zzM" << endl;
    string s;
    getline(cin, s);
    istringstream ss(s);
    vector<string> words;
    string word;
    while (ss >> word) {
        words.push_back(word);
    }
    int start = 0;
    int z;
    for (int i = 1, j = 0; i < words.size(); i += 2, j++) {
        disk[j].name = words[i];
        disk[j].used_size = 0;
        disk[j].start_block = start;
        if (j == 0) { disk[j].root = initDir("A#"); }
        if (j == 1) { disk[j].root = initDir("B#"); }
        if (j == 2) { disk[j].root = initDir("C#"); }
        string a = words[i + 1];
        string size = a.substr(0, 2);
        disk[j].size = atoi(size.c_str());
        disk[j].block_num = disk[j].size * 1024;
        start += disk[j].size * 1024;
        z = j;
    }
    Current_disknum = z;
    int temp = disk[0].block_num;
    bitmap = new int[temp]();//初始化为0
    current_disk = 0;
    curdir = disk[0].root;
}

void init() {
    ifstream inf("test.bin");
    if (!inf.is_open()) {
        ofstream outFile("test.bin", ios::binary | ios::out | ios::trunc);
        outFile.close();
    }

    memset(FAT, -1, sizeof(FAT));
    inf.seekg(0, ios::end);
    int size = inf.tellg();
    inf.close();
    //cout << size << endl;
    if (size < 10) {
        InitDisk();
    }
    else {
        current_disk = 0;//初始化并且把文件读入。
        remove_sistem();
        Current_disknum--;//remove_sistrm中计算磁盘数目多1 造成权限访问冲突
        BLOCK_CNT = disk[current_disk].used_size;
    }
    //InitDisk();
}

string displayPath(Directory* cur)
{
    string pathname = "";
    Directory* now = new Directory();
    now = cur;
    while (now)
    {
        string null;
        null = now->name;
        pathname = null + "\\" + pathname;
        now = now->parent;
    }

    return pathname;
}
void cnt_file(Directory* cur)
{
    for (auto& file : cur->files) {
        sum++;
    }
    for (auto& subDir : cur->subDirs) {
        cnt_file(subDir.second);
    }
}
void ChgDisk() {
    string name;
    cin >> name;
    for (int i = 0; i < MAX_DISK_NUM; i++) {
        if (disk[i].name.compare(name) == 0) {
            current_disk = i;
            curdir = disk[i].root;
            cnt_file(curdir);
            int cnt = sum;//定位
            sum = 0;
            BLOCK_CNT = disk[i].start_block + 1 + cnt;
        }
    }
}

void help() {

}

Directory* find_dir(string name, Directory* cur)//找到某目录下的指定目录
{
    for (auto& subDir : cur->subDirs) {
        if (subDir.second->name == name)
        {
            return subDir.second;
        }
    }
    return NULL;
}

File* find_file(string name, Directory* cur)
{
    for (auto& file : cur->files) {
        if (file.second->name == name)
        {
            return file.second;
        }
    }
    cout << "不存在该文件" << endl;
    return NULL;
}


void mkdir(Directory* cur, string name)
{
    Directory* now = cur;
    if (name.find('\\') != -1)//绝对路径
    {
        istringstream ss(name);
        string Substr;
        int i = 0;
        while (getline(ss, Substr, '\\'))
        {
            if (i == 0) {
                if (Substr.compare("A#") == 0) {
                    current_disk = 0;
                    now = disk[0].root;
                }
                if (Substr.compare("B#") == 0) {
                    current_disk = 1;
                    now = disk[1].root;
                }
                if (Substr.compare("C#") == 0) {
                    current_disk = 2;
                    now = disk[2].root;
                }
                i++;
            }
            else {
                int flag = 0;
                for (auto& subDir : now->subDirs) {//是否已有路径文件夹,确保绝对路径不会覆盖已有的路径文件夹。
                    if (subDir.second->name == Substr)
                    {
                        now = find_dir(Substr, now);
                        flag = 1;
                    }
                }
                if (flag == 0) {
                    Directory* New = new Directory();
                    New->creat_time = getTime();
                    New->size = 0;
                    New->name = Substr;
                    New->parent = now;
                    now->subDirs[Substr] = New;
                    now = find_dir(Substr, now);
                }
            }
        }
    }
    else {
        //相对路径
        for (auto& subDir : cur->subDirs) {//防止名字重复
            if (subDir.second->name == name)
            {
                name = name + "-1";
            }
        }
        Directory* New = new Directory();
        New->creat_time = getTime();
        New->name = name;
        New->parent = cur;
        cur->subDirs[name] = New;
    }
}
void deldir(Directory* cur, string name)
{
    Directory* now = cur;
    if (name.find('\\') != -1)//绝对路径
    {
        istringstream ss(name);
        string Substr;
        int i = 0;
        while (getline(ss, Substr, '\\'))
        {
            if (i == 0) {
                if (Substr.compare("A#") == 0) {
                    current_disk = 0;
                    now = disk[0].root;
                }
                if (Substr.compare("B#") == 0) {
                    current_disk = 1;
                    now = disk[1].root;
                }
                if (Substr.compare("C#") == 0) {
                    current_disk = 2;
                    now = disk[2].root;
                }
                i++;
            }
            else {
                now = find_dir(Substr, now);
                if (!now) {//不存在
                    cout << "未找到该文件夹!" << endl;
                    return;
                }
            }
        }
        Directory* temp = now->parent;
        if (now->size == 0) {
            temp->subDirs.erase(now->name);
            cout << "删除成功" << endl;
        }
        else {
            cout << "目录非空" << endl;
        }
    }
    else {
        now = find_dir(name, cur);
        if (!now) {
            cout << "未找到该文件夹!" << endl;
            return;
        }
        if (now->size == 0) {
            cur->subDirs.erase(now->name);
            cout << "删除成功" << endl;
        }
        else {
            cout << "该目录非空!" << endl;
        }
    }
}

void dir(Directory* cur, string name)
{
    if (name == "1") {
        cout << "子目录如下:" << endl;
        for (auto& subDir : cur->subDirs) {
            cout << subDir.second->name << "  创建时间:" << subDir.second->creat_time << " 文件大小:" << subDir.second->size << endl;
        }
        for (auto& files : cur->files) {
            cout << files.second->name << "  创建时间:" << files.second->creat_time << " 文件大小:" << files.second->size << "文件地址:" << files.second->block_cnt << endl;
        }
        cout << endl;
    }
    else {
        Directory* now = cur;
        istringstream ss(name);
        string Substr;
        int i = 0;
        while (getline(ss, Substr, '\\'))
        {
            if (i == 0) {
                if (Substr.compare("A#") == 0) {
                    current_disk = 0;
                    now = disk[0].root;
                }
                if (Substr.compare("B#") == 0) {
                    current_disk = 1;
                    now = disk[1].root;
                }
                if (Substr.compare("C#") == 0) {
                    current_disk = 2;
                    now = disk[2].root;
                }
                i++;
            }
            else {
                now = find_dir(Substr, now);
                if (!now) { cout << "该路径不存在"; return; }
            }
        }
        cout << "子目录如下:" << endl;
        for (auto& subDir : now->subDirs) {
            cout << subDir.second->name << "  创建时间:" << subDir.second->creat_time << " 文件大小:" << subDir.second->size << endl;
        }
        for (auto& files : now->files) {
            cout << files.second->name << "  创建时间:" << files.second->creat_time << " 文件大小:" << files.second->size << endl;
        }
        cout << endl;
    }
}

void chgdir(Directory* cur, string name)
{
    if (name == "..")//如果是输入..,返回父节点
    {
        if (cur->parent)
        {
            curdir = cur->parent;
        }
        return;
    }
    Directory* now = cur;
    if (name.find("\\") != -1)//如果是路径输入,则按照路径方式查找
    {
        istringstream ss(name);
        string Substr;
        int i = 0;
        while (getline(ss, Substr, '\\'))
        {
            if (i == 0) {
                if (Substr.compare("A#") == 0) {
                    current_disk = 0;
                    now = disk[0].root;
                }
                if (Substr.compare("B#") == 0) {
                    current_disk = 1;
                    now = disk[1].root;
                }
                if (Substr.compare("C#") == 0) {
                    current_disk = 2;
                    now = disk[2].root;
                }
                i++;
            }
            else {
                now = find_dir(Substr, now);
                if (!now) { cout << "该路径不存在" << endl; return; }
            }
        }
        curdir = now;
        return;
    }
    else {
        for (auto& subDir : cur->subDirs) {//直接在当前目录下查找
            if (subDir.second->name == name)
            {
                curdir = subDir.second;
                return;
            }

        }
        cout << "该目录不存在" << endl;
    }
}
Directory* jiexi(string name) {
    Directory* now = NULL;
    istringstream ss(name);
    string Substr;
    int i = 0;
    while (getline(ss, Substr, '\\'))
    {
        if (i == 0) {
            if (Substr.compare("A#") == 0) {
                current_disk = 0;
                now = disk[0].root;
            }
            if (Substr.compare("B#") == 0) {
                current_disk = 1;
                now = disk[1].root;
            }
            if (Substr.compare("C#") == 0) {
                current_disk = 2;
                now = disk[2].root;
            }
            i++;
        }//A#\b\c\d.txt
        else {
            if (Substr.find(".") == -1) {//对目录 now指向该目录,对文件,now指向它所处目录。
                now = find_dir(Substr, now);
                if (!now) { cout << "该路径不存在" << endl; return NULL; }
            }
        }
    }
    return now;
}

void movedir(Directory* cur, string name)
{
    istringstream s(name);
    vector<string> words;
    string word;
    while (s >> word) {
        words.push_back(word);
    }
    if (words[0].find("\\") == -1 && words[1].find("\\") != -1) //0相对路径 1绝对
    {
        Directory* temp = find_dir(words[0], cur);
        if (!temp) {
            cout << "未找到该文件夹!" << endl;
            return;
        }
        Directory* now = jiexi(words[1]);
        if (now == NULL) { return; }
        for (auto& subDir : now->subDirs) {//防止名字重复
            if (subDir.second->name == temp->name)
            {
                Directory* New = new Directory();
                *New = *temp;
                now->subDirs[New->name + "-1"] = New;
            }
        }
        Directory* New = new Directory();
        *New = *temp;
        now->subDirs[New->name] = New;
        deldir(cur, words[0]);
    }
    else if (words[1].find("\\") != -1 && words[0].find("\\") == -1)//0绝对 1相对
    {
        Directory* now = jiexi(words[0]);
        if (now == NULL) { return; }
        for (auto& subDir : cur->subDirs) {//防止名字重复
            if (subDir.second->name == now->name)
            {
                Directory* New = new Directory();
                *New = *now;
                cur->subDirs[New->name + "-1"] = New;
            }
        }
        Directory* New = new Directory();
        *New = *now;
        cur->subDirs[New->name + "-1"] = New;
        deldir(cur, words[0]);
    }
    else {
        Directory* now_0 = jiexi(words[0]);
        Directory* now_1 = jiexi(words[1]);
        if (now_0 == NULL || now_1 == NULL) { return; }
        Directory* New = new Directory();
        *New = *now_0;
        for (auto& subDir : now_1->subDirs) {//防止名字重复
            if (subDir.second->name == New->name)
            {
                now_1->subDirs[New->name + "-1"] = New;
            }
        }
        now_1->subDirs[New->name] = New;
    }
}
string getname(string name) {//获取绝对路径中的文件名
    if (name.find("\\") != -1) {//绝对路径
        istringstream ss(name);
        string word;
        string s;
        while (getline(ss, word, '\\')) {
            s = word;
        }
        return s;
    }
}

void create(Directory* cur, string name)
{

    if (name.find('\\') != -1)//绝对路径
    {
        Directory* now = jiexi(name);
        File* New = new File();
        New->size = 0;
        New->creat_time = getTime();
        for (auto& files : now->files) {
            if (files.second->name == getname(name))
            {
                name = getname(name) + "-1";
            }
        }
        New->name = getname(name);
        now->files[getname(name)] = New;
        New->block_cnt = BLOCK_CNT;
        FAT[BLOCK_CNT] = 0;
        BLOCK_CNT++;
    }
    else {
        //相对路径
        File* New = new File();
        New->size = 0;
        New->creat_time = getTime();
        for (auto& files : cur->files) {
            if (files.second->name == name)
            {
                name = name + "-1";
            }
        }
        New->name = name;
        cur->files[name] = New;
        New->block_cnt = BLOCK_CNT;
        FAT[BLOCK_CNT] = 0;
        BLOCK_CNT++;
    }
}

void Delete(Directory* cur, string name)
{
    if (name.find('\\') != -1)//绝对路径
    {
        Directory* now = jiexi(name);
        now->files.erase(getname(name));
        cout << "删除成功" << endl;
        /*for (auto& files : now->files) {
            if (files.second->name == getname(name))
            {
                now->files.erase(getname(name));
                cout << "删除成功" << endl;
            }
        }*/

    }
    else {
        //相对路径
       /* for (auto it = cur->files.begin(); it != cur->files.end();) {
            if (it->second->name == name) {
                cur->files.erase(it);
            }
        }Debug X和Release √*/
        File* now = find_file(name, cur);
        cur->files.erase(now->name);
        cout << "删除成功" << endl;
        /*for (auto& files : cur->files) {
            if (files.second->name == now->name)
            {
                cur->files.erase(name);
                cout << "删除成功" << endl;
            }
        }*/

    }
}

void copy(Directory* cur, string name)
{
    istringstream s(name);
    vector<string> words;
    string word;
    while (s >> word) {
        words.push_back(word);
    }
    if (words[0].find("\\") == -1 && words[1].find("\\") != -1) //0相对路径 1绝对  当前路径下文件复制到别的地方
    {
        File* temp = find_file(words[0], cur);
        if (!temp) {
            cout << "未找到该文件夹!" << endl;
            return;
        }
        Directory* now = jiexi(words[1]);
        if (now == NULL) { return; }

        File* New = new File();
        *New = *temp;
        for (auto& file : now->files) {//防止名字重复
            if (file.second->name == temp->name)
            {
                cout << "已存在该文件,重命名扣1,覆盖扣2" << endl;
                string a; cin >> a;
                string na;
                if (a == "1") {
                    cin >> na;
                }
                now->files[na] = New;
            }
        }
        now->files[New->name] = New;
    }
    else if (words[1].find("\\") != -1 && words[0].find("\\") == -1)//0绝对 1相对
    {
        Directory* now = jiexi(words[0]);
        if (now == NULL) { return; }
        File* temp = find_file(getname(words[0]), now);
        File* New = new File();
        *New = *temp;
        for (auto& file : cur->subDirs) {//防止名字重复
            if (file.second->name == getname(words[0]))
            {
                cout << "已存在该文件,重命名扣1,覆盖扣2" << endl;
                string a; cin >> a;
                string na;
                if (a == "1") {
                    cin >> na;
                }
                cur->files[na] = New;
            }
        }
        cur->files[New->name] = New;
    }
    else {
        Directory* now_0 = jiexi(words[0]);
        Directory* now_1 = jiexi(words[1]);
        File* no0 = find_file(getname(words[0]), now_0);
        if (now_0 == NULL || now_1 == NULL || no0 == NULL) { return; }
        File* New = new File();
        *New = *no0;
        for (auto& file : now_1->files) {//防止名字重复
            if (file.second->name == New->name)
            {
                cout << "已存在该文件,重命名扣1,覆盖扣2" << endl;
                string a; cin >> a;
                string na;
                if (a == "1") {
                    cin >> na;
                }
                now_1->files[na] = New;
            }
        }
        now_1->files[New->name] = New;
    }
}
int input(File* cur)
{
    string in;
    // 输入exit 结束输入
    int sum1 = cur->size;
    int sum2 = sum1;
    while (true) {
        getline(cin, in);
        if (in == "exit") {
            break;
        }
        cur->content.push_back(in);
        sum1 = sum1 + in.size();
    }
    cur->size = sum1;
    return sum1 - sum2;
}

void write(Directory* cur, string name)
{
    if (name.find("\\") == -1) {//相对路径
        File* f = find_file(name, cur);
        if (!f) return;
        Directory* temp = cur;
        int a = input(f);
        while (temp)
        {
            temp->size += a;
            temp = temp->parent;
        }
    }
    else {//绝对路径
        Directory* now = jiexi(name);
        File* f = find_file(getname(name), now);
        if (!now || !f) return;
        Directory* temp = now;
        int a = input(f);
        while (temp)
        {
            temp->size += a;
            temp = temp->parent;
        }
    }
}

void read(Directory* cur, string name)
{
    if (name.find("\\") == -1) {//相对路径
        File* f = find_file(name, cur);
        if (!f) { return; }
        for (auto tmp : f->content) {
            cout << tmp << endl;
        }
    }
    else {
        Directory* now = jiexi(name);
        File* f = find_file(getname(name), now);
        if (!now || !f) return;
        for (auto tmp : f->content) {
            cout << tmp << endl;
        }
    }
}

void Export(Directory* cur, string name)
{
    istringstream s(name);
    vector<string> words;
    string word;
    while (s >> word) {
        words.push_back(word);
    }
    if (words[0].find("\\") == -1 && words[1].find("\\") != -1) //0相对路径 1绝对  当前路径下文件复制到外存
    {
        File* temp = find_file(words[0], cur);
        if (!temp) {
            cout << "未找到该文件夹!" << endl;
            return;
        }
        string name2 = words[1] + "\\" + words[0];
        ofstream inr(name2);
        for (auto it = temp->content.begin(); it != temp->content.end(); it++)
        {
            inr << *it << endl;
        }
        inr.close();
    }
    else if (words[1].find("\\") != -1 && words[0].find("\\") != -1)//都相对
    {
        File* temp = find_file(words[0], cur);
        if (!temp) {
            cout << "未找到该文件夹!" << endl;
            return;
        }
        ofstream inr(words[1]);
        for (auto it = temp->content.begin(); it != temp->content.end(); it++)
        {
            inr << *it << endl;
        }
        inr.close();
    }
    else if (words[1].find("\\") != -1 && words[0].find("\\") == -1)//0绝对 1相对
    {
        Directory* now = jiexi(words[0]);
        if (now == NULL) { return; }
        File* temp = find_file(getname(words[0]), now);
        ofstream inr(words[1]);
        for (auto it = temp->content.begin(); it != temp->content.end(); it++)
        {
            inr << *it << endl;
        }
        inr.close();
    }
    else {
        Directory* now_0 = jiexi(words[0]);
        File* temp = find_file(getname(words[0]), now_0);
        if (now_0 == NULL || temp == NULL) { return; }
        string name2 = words[1] + "\\" + getname(words[0]);
        ofstream inr(name2);
        for (auto it = temp->content.begin(); it != temp->content.end(); it++)
        {
            inr << *it << endl;
        }
        inr.close();
    }
}
void ShowDisk(string name)
{
    /*for (int i = 0; i < MAX_DISK_NUM; i++) {
        if (disk[i].name.compare(name) == 0) {
            current_disk = i;
            cnt_file(disk[current_disk].root);
            int cnt = sum;//定位
            sum = 0;
            disk[current_disk].used_size = (cnt + 1);
            break;
        }
    }*/
    cout << "空间总大小:" << disk[current_disk].size << "MB" << endl;
    cout << "已用空间大小:" << disk[current_disk].used_size << "KB" << endl;
    cout << "可用空间大小:" << disk[current_disk].size * 1024 - disk[current_disk].used_size << "KB" << endl;
}

void used_cnt()
{
    for (int i = 0; i <= Current_disknum; i++) {
        cnt_file(disk[i].root);
        int cnt = sum;//定位
        sum = 0;
        disk[i].used_size = (cnt + 1);
    }
}

void put(Directory* cur, ofstream& inr, int i)
{
    inr << cur->name << " " << cur->size << " " << cur->creat_time << " ";
    for (auto& subDirs : cur->subDirs) {//将子文件夹所包含的文件夹名称写入
        inr << subDirs.second->name << " ";
        //inr << subDirs.second->size << " ";
        //inr << subDirs.second->creat_time << " ";
    }
    inr << endl;
    for (auto& files : cur->files) {//将子文件及其内容写入文件
        inr << files.second->name << " " << files.second->size << " " << files.second->creat_time << " " << files.second->block_cnt - disk[i].start_block << endl;
    }
    streampos pos = inr.tellp();
    for (auto& files : cur->files) {
        int a = files.second->block_cnt * 1024;
        inr.seekp(a, ios::beg);
        inr << "begin" << endl;
        for (auto it = files.second->content.begin(); it != files.second->content.end(); it++)//文件内容
        {
            inr << *it << endl;
        }
        inr << "exit" << endl;
    }
    inr.seekp(pos, ios::beg);
    for (auto& subDirs : cur->subDirs) {
        put(subDirs.second, inr, i);
    }
}

void remove_disk()
{
    ofstream inr("test.bin", ios::binary | ios::out | ios::trunc);
    inr << Current_disknum << endl;
    for (int i = 0; i <= Current_disknum; i++)
    {
        int a = disk[i].start_block * BLOCK_SIZE;
        inr.seekp(a, ios::beg);
        inr << disk[i].name << " " << disk[i].size << " " << disk[i].start_block << " " << disk[i].block_num << " " << disk[i].used_size << endl;
        put(disk[i].root, inr, i);
    }
    inr.close();
}

Directory* path(Directory* cur, string name)//获得所需要文件的节点或者文件夹的所在目录的节点。
{
    for (auto& files : cur->files) {
        if (files.second->name == name)
        {
            return cur;
        }
    }
    Directory* now;
    for (auto& subDirs : cur->subDirs) {
        if (subDirs.second->name == name)
        {
            return subDirs.second;
        }
        now = path(subDirs.second, name);
        if (now)
        {
            return now;
        }
    }
    return NULL;
}

string trims(const string& str) {
    size_t first = str.find_first_not_of(" \t\n\r\f\v");
    if (first == string::npos) {
        return "";
    }
    size_t last = str.find_last_not_of(" \t\n\r\f\v");
    return str.substr(first, last - first + 1);
}

string trim(const string& str) {
    size_t start = 0;
    size_t end = str.length();

    // 寻找第一个非空字符的位置
    while (start < end && str[start] == '\0'|| start < end && str[start] == 32) {
        start++;
    }

    // 寻找最后一个非空字符的位置
    while (end > start && str[end - 1] == '\0' || start < end && str[start] == 32) {
        end--;
    }

    // 返回除去两边空字符后的子串
    return str.substr(start, end - start);
}


void remove_sistem()
{
    ifstream inr("test.bin");
    string temp;

    while (getline(inr, temp)) {
        temp = trim(temp);
        if (!temp.empty()) {
            records.push_back(temp);
        }
    }
    inr.close();

    /*for (int i = 0; i < records.size(); i++)
    {
        if (records[i].length() == 0) { records[i] = "begin"; }
        cout << records[i] << endl;
    }
    /*for (int i = 0; i < records.size(); i++)
    {
        cout << records[i] <<i<< endl;
    }*/
    /*先读第一个书 循环初始化*/
    disk[0].root = initDir("A#");
    disk[1].root = initDir("B#");
    //disk[2].root = initDir("C#"); 
    curdir = disk[0].root;

    int p = 0;
    Directory* now = NULL;
    int num_disk = 0;
    for (int i = 0; i < records.size(); i++)
    {
        string s = records[i];
        istringstream ss(s);
        string substr;
        int nnn = 0;
        if (nnn == 0)
        {
            //int p = 0;
            if (p == 0)
            {
                int bj = 0;
                while (getline(ss, substr, ' '))
                {
                    if (bj == 0) {
                        disk[num_disk].name = substr;
                        p++;
                    }
                    if (bj == 1) {
                        disk[num_disk].size = stoi(substr);
                        p++;
                    }
                    if (bj == 2) {
                        disk[num_disk].start_block = stoi(substr);
                        p++;
                    }
                    if (bj == 3) {
                        disk[num_disk].block_num = stoi(substr);
                        p++;
                    }
                    if (bj == 4) {
                        disk[num_disk].used_size = stoi(substr);
                        p++;
                    }
                    bj++;
                }
            }
            else
            {
                int chishu = 0;
                while (getline(ss, substr, ' '))
                {
                    if (substr.find('.') == -1)
                    {//如果是目录
                        if (substr.find(disk[num_disk].name) != -1)
                        {//是不是根目录
                            now = disk[num_disk].root;
                        }
                        else
                        {
                            now = path(disk[num_disk].root, substr);
                        }
                        now->name = substr;
                        string txt;
                        int n = 0;
                        while (getline(ss, txt, ' '))
                        {
                            if (n == 0) {
                                now->size = stoi(txt);
                                n++;
                            }
                            else if (n == 1) {
                                now->creat_time = txt;
                                n++;
                            }
                            else {
                                mkdir(now, txt);
                            }
                        }
                    }
                    else
                    {//如果是文件
                        create(now, substr);
                        get_cnt++;//------------------------------------  dengyu used_size-1  直接跳到B
                        File* cur = now->files[substr];
                        string txt;
                        int n = 0;
                        while (getline(ss, txt, ' '))
                        {
                            if (n == 0) {
                                cur->size = stoi(txt);
                                n++;
                            }
                            else if (n == 1) {
                                cur->creat_time = txt;
                                n++;
                            }
                            else
                            {
                                int pos = stoi(txt);
                                cur->block_cnt = pos + disk[num_disk].start_block;
                                int z = 0;
                                for (int j = i; j < records.size(); j++)
                                {
                                    if (records[j].find("begin") != -1) { z++; }
                                    if (z == pos) {
                                        for (int k = j + 1; k < records.size(); k++) {
                                            if (records[k].compare("exit") == 0) { break; }
                                            cur->content.push_back(records[k]);
                                        }
                                        break;
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }
        if (get_cnt == disk[num_disk].used_size - 1)
        {
            int pos = get_cnt;
            int z = 0;
            Current_disknum++;
            for (int j = i; j < records.size(); j++)
            {
                if (records[j].find("exit") != -1) { z++; }
                if (z == pos) {
                    i = j;
                    num_disk++;
                    get_cnt = 0;
                    p = 0;
                    break;
                }
            }
        }
    }
}

void tree(Directory* cur,int n)
{
    for (auto& files : cur->files) {
        for (int i = 0; i < n; i++) { cout << "\t"; }
        cout << files.second->name << endl;
    }
    for (auto& subDirs : cur->subDirs) {
        for (int i = 0; i < n; i++) { cout << "\t"; }
        cout << subDirs.second->name << "------" << endl;
        tree(subDirs.second,n+1);
    }
}
int main() {
    init();
    while (1)
    {
        /*if (current_disk == 0)cout << "A#";
        else if(current_disk==1)cout << "B#";
        else if(current_disk==2)cout<< "C#";
        else {
            cout << endl;
            cout << "不存在该盘" << endl;
        }*/
        cout << displayPath(curdir);
        string command;
        cin >> command;
        if (command == "ChgDisk") ChgDisk();
        else if (command == "MKDir") { string name; cin >> name; mkdir(curdir, name); cout << "创建成功" << endl; }
        else if (command == "DelDir") { string name; cin >> name; deldir(curdir, name); }
        else if (command == "Dir") { cout << "输入1表示当前目录,查看其它目录请输入路径:" << endl; string name; cin >> name; dir(curdir, name); }
        else if (command == "ChgDir") { string name; cin >> name; chgdir(curdir, name); }
        else if (command == "MoveDir") { string name; getline(cin, name); movedir(curdir, name); }
        else if (command == "Create") { string name; cin >> name; create(curdir, name); }
        else if (command == "Delete") { string name; cin >> name; Delete(curdir, name); }
        else if (command == "Copy") { string name; getline(cin, name); copy(curdir, name); }//no accomplish
        else if (command == "Write") { string name; cin >> name; write(curdir, name); }
        else if (command == "Read") { string name; cin >> name; read(curdir, name); }
        else if (command == "Export") { string name; getline(cin, name); Export(curdir, name); }
        else if (command == "ShowDisk") { string name; cin >> name; ShowDisk(name); }
        else if (command == "TreeDir") { tree(curdir,0); }
        else if (command == "time") { cout << getTime() << endl; }
        //else if (command == "cnt") { cnt_file(curdir); cout << sum << endl; }
        else if (command == "exit") {
            break;
        }
        else {
            cout << "命令无法识别,请参照一下提示进行输入:\n";
            help();
        }
        used_cnt();
        remove_disk();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值