问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

操作系统课程设计:Nachos的文件管理模块升级

发布网友 发布时间:2022-05-14 05:30

我来回答

1个回答

热心网友 时间:2024-02-24 12:15

这是我们做的、基本上满足你的要求

#pragma warning(disable:4786)

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;

struct File
{
string name;
bool isDir;

int pos;
int len;
File* pPre;
File* pNxt;
File* pChd;
File* pPar;
File(){name = "";isDir = false;pos = len = 0;pChd = pPar = pPre = pNxt = NULL;}
};

class DirSystem
{
private:
File* pRoot;

public:
DirSystem(){pRoot = new File;pRoot->pChd = new File;pRoot->pPar = pRoot;}

File* Append(File*& tail,const File& f)
{
tail->pNxt = new File;
tail->pNxt->isDir = f.isDir;
tail->pNxt->len = f.len;
tail->pNxt->pos = f.pos;
tail->pNxt->name = f.name;
tail->pNxt->pChd = tail->pNxt->pNxt = tail->pNxt->pPar = NULL;
tail->pNxt->pPre = tail;
return tail->pNxt;
}

void Md(File*& pCur,const File& f)
{
if(pCur->pChd == NULL)
{
pCur->pChd = new File;
pCur->pChd->pPar = pCur;
Append(pCur->pChd,f);
}
else
{
File* tmp = pCur->pChd;
while(tmp->pNxt != NULL)
tmp = tmp->pNxt;
Append(tmp,f);
}
}

void Show(File* pF)
{
if(pF == NULL)
return;

File* cur = pF->pNxt;
while(cur != NULL)
{
cout << cur->name;
if(cur->isDir)
cout << "(文件夹) " << endl;
else
cout << "(文件) " << endl;
cur = cur->pNxt;
}
}

void Rd(File* pF)
{
if(pF == NULL)
cout << "文件不存在!" << endl;
else if(pF->pChd != NULL)
cout << "该文件夹中还有其它文件,拒绝删除!" << endl;
else
{
pF->pPre->pNxt = pF->pNxt;
if(pF->pNxt != NULL)
pF->pNxt->pPre = pF->pPre;
delete pF;
}
}

void Init()
{
int num;
cout << "输入分区数:" << endl;
cin >> num;

int i,pos;
File f,*t;
pos = 0;
t = pRoot->pChd;
f.isDir = true;
f.pChd = f.pNxt = f.pPar = f.pPre = NULL;
char ch = 'C';
for(i = 0;i < num;++i)
{
cout << "输入分区容量:" << endl;
cin >> f.len;
f.pos = pos;
pos += f.len;
f.name = ch++ + string(":");
t = Append(t,f);
}
}

void Run()
{
File* pCur;
pCur = pRoot->pChd->pNxt;
string hint,cmd,tmp;
hint = pCur->name + "\\>";
while(true)
{
cout << hint;
cin >> cmd;
cmd = Uniform(cmd);
if(cmd == "DIR")
{
cout << pCur->name << endl;
Show(pCur->pChd);
}
else if(cmd == "CD")
{
cin >> cmd;
cmd = Uniform(cmd);
File* ftmp = pCur;
string htmp = hint;
hint = "";
pCur = pRoot;
bool find = false;
vector<string> nm = Parse(cmd);
for(int i = 0;i < nm.size();++i)
{
find = false;
pCur = pCur->pChd->pNxt;
while(pCur != NULL)
{
if(pCur->name == nm[i])
{
hint += nm[i] + '\\';
find = true;
break;
}
pCur = pCur->pNxt;
}
if(!find)
break;
}
if(!find)
{
pCur = ftmp;
hint = htmp;
cout << "没有找到要转向的路径!" << endl;
}
else
{
if(nm.size() > 1)
hint.erase(hint.end()-1);
hint += ">";
}
}
else if(cmd == "MD")
{
cin >> cmd;

File f;
f.isDir = true;
f.pos = 0;
f.len = 100;
f.name = cmd;
f.pChd = f.pPar = f.pNxt = f.pPre = NULL;
Md(pCur,f);
}
else if(cmd == "MF")
{
cin >> cmd;

File f;
f.isDir = false;
f.pos = 0;
f.len = 100;
f.name = cmd;
f.pChd = f.pPar = f.pNxt = f.pPre = NULL;
Md(pCur,f);
}
else if(cmd == "RD")
{
cin >> cmd;
File* tar = pCur->pChd;
while(tar)
{
if(tar->name != cmd)
tar = tar->pNxt;
else
break;
}
Rd(tar);
}
else
{
cout << "您输入的命令本系统不识别!" << endl;
}
}
}

private:
vector<string> Parse(string tar)
{
vector<string> res;
int beg,end;
beg = 0;
end = tar.find('\\',beg);
while(true)
{
res.push_back(tar.substr(beg,end - beg));

if(end == -1)
break;

beg = end + 1;
end = tar.find('\\',beg);
}
return res;
}

string Uniform(string cmd)
{
string res = cmd;
int offset = 'A' - 'a';
for(int i = 0;i < cmd.size();++i)
{
if(cmd[i] >= 'a' && cmd[i] <= 'z')
res[i] = cmd[i] + offset;
}
return res;
}
};

int main()
{
DirSystem ds;
ds.Init();
ds.Run();
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华为freebuds4i切歌怎么操作_华为freebuds4i怎么切歌 华为freebuds pro切歌方法_华为freebuds pro怎么切歌 华为耳机怎么切换下一曲 欧美电影,好像是宠物有一个世界,宠物会想办法跟主人的灵魂互换占据 ...的名字,欧洲中世纪,一个王子的继母把他的灵魂和狗的灵魂互换了... 问一部外国电影的名字 剧情记得不大清楚l了 是前几年的片子 灵魂互换的... HUAWEI 华为 AGS2-W09 10.1英寸平板电脑 (香槟金、64GB+4GB、WiFi版... 诛仙3百法和千法差距大吗 微信怎么解除应用授权登录 授权应用删除方法 微信怎么解除应用授权登录授权应用删除方法 有人熟悉nachos文件系统吗 100hejekele 手机连电脑以后老是新硬件安装出问题,怎么办啊? 手机连接到电脑USB总是提示硬件安装期间出现问题无法正常识别运行,要怎么解决! 硬件安装出现问题新硬件无法使用是电脑问题还是手机问题? 5s a1528,ios10.3,运营商28.3和28.2,破解移动4g的ipcc文件 手机USB连到电脑后,右下角出现说[硬件安装出现一个问题],怎么会事啊??!! 什么叫手机硬件出问题 硬件安装期间出现了一个问题,您的新硬件可能无法正常运行 硬件安装期间出现了一个问题,您的新硬件可能无法正常运行。怎么办 手机连接电脑显示硬件安装出现问题 我的手机连接到电脑,但电脑提示新硬件安装出现问题,无法继续使用? 这是怎么回事啊? 硬件安装期间出现了一个问题,你的硬件可能无法使用 手机插上电脑,总是显示硬件安装期间出现了一个问题,可能无法运行,这是怎么回事? 手机连接电脑时显示硬件安装出现问题 手机连接电脑时说硬件安装时出现了一个问题,请问是什么问题? 为什么手机USB连接时总是提示硬件安装时出现问题 手机连接电脑出现&quot;硬件安装过程中出现问题,您的新硬件可能无法正常运行&quot;这是怎么回事?? 手机连接电脑时显示硬件安装出现问题有哪些 上海985本科落户条件 上海985本科怎么落户 nachos c++的文件系统中,横线这句执行的时候出现段错误(核心已转储) Nachos系统调用实习报告 斗罗大陆200级是什么神 唐三二百级了后面是啥 win8笔记本电脑忘记了登录密码怎么办 斗罗*唐三的魂力是多少?还有他达到了什么级别?最高是什么级别?还有所有的级别!! 200级是什么斗罗? 狮子座女生感情特点 斗罗大陆唐三蓝银皇觉醒后长什么样? 《斗罗大陆》是谁说老杰克是200级神王? 唐三100级的样子 Dellwin8笔记本电脑,忘记密码怎么办 在苏宁买的惠普笔记本电脑(win8系统)忘记了开机密码要怎么办? martinpolo皮带是什么牌子 你好,我是五菱宏光s车型,适合换什么轮胎?多大型号的?谢谢 我车轮胎是185&#47;65R14,想换四个185&#47;70R14的,哪位大神给提个建议,能不能改一下呢? l耶顿香爱懒人帖减肥怎么样? 我的轮胎尺寸是185&#47;70r14-88h,轮胎不换把轮毂换成15寸行不行. 森雅m80原配轮胎185/70 R14 能否改成195/60 R15? 185&#47;70r14和185r14c是啥区别,我的车用185&#47;70r14的轮胎,问可以换185r14