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

 *** 作系统课程设计:Nachos的文件管理模块升级,第1张

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

#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 = falsepos = len = 0pChd = pPar = pPre = pNxt = NULL}

}

class DirSystem

{

private:

File* pRoot

public:

DirSystem(){pRoot = new FilepRoot->pChd = new FilepRoot->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 = 0i <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 = 0i <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 = 0i <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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11537017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存