日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

操作系统课程设计:模拟文件系统

發(fā)布時(shí)間:2023/12/10 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统课程设计:模拟文件系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1.實(shí)驗(yàn)要求
  • 2.實(shí)驗(yàn)環(huán)境
  • 3.實(shí)驗(yàn)設(shè)計(jì)
    • 3.1系統(tǒng)流程
    • 3.2文件結(jié)構(gòu)
    • 3.3實(shí)現(xiàn)的命令
  • 4.數(shù)據(jù)結(jié)構(gòu)
    • 4.1 用戶數(shù)據(jù)結(jié)構(gòu)
    • 4.2 文件數(shù)據(jù)結(jié)構(gòu)
    • 4.3 目錄數(shù)據(jù)結(jié)構(gòu)
  • 5.模塊詳解
    • 5.1 用戶指令
      • 5.1.1 cd
      • 5.1.2 ls
      • 5.1.3 mkdir
      • 5.1.4 touch
      • 5.1.5 gedit
      • 5.1.6 rm
      • 5.1.7 cp
      • 5.1.8 rename
      • 5.1.9 su
      • 5.1.10 cls
      • 5.1.11 exit
      • 5.1.12 help
    • 5.2 其他系統(tǒng)操作
      • 5.2.1 登錄
      • 5.2.2 保存系統(tǒng)狀態(tài)
      • 5.2.3 恢復(fù)系統(tǒng)狀態(tài)
      • 5.2.4 路徑解析
  • 6.實(shí)驗(yàn)演示
    • 6.1登錄
    • 6.2幫助文檔與使用說(shuō)明
    • 6.3 cd命令
    • 6.4 ls命令
    • 6.5 mkdir命令
    • 6.6 touch命令
    • 6.7 gedit命令
    • 6.8 rm命令
    • 6.9 cp命令
    • 6.10 用戶權(quán)限
  • 實(shí)現(xiàn)代碼

1.實(shí)驗(yàn)要求

  • 設(shè)計(jì)和實(shí)現(xiàn)一個(gè)模擬文件系統(tǒng),要求包括目錄、普通文件和文件的存儲(chǔ)。。

  • 文件系統(tǒng)的目錄結(jié)構(gòu)采用類似Linux的樹狀結(jié)構(gòu)。

  • 要求模擬的操作包括:

    • 目錄的添加、刪除、重命名;

    • 目錄的顯示(列表);

    • 文件的添加、刪除、重命名;

    • 文件和目錄的拷貝;

    • 文件的讀寫操作。

  • 用戶進(jìn)入時(shí)顯示可用命令列表;用戶輸入help時(shí)顯示所有命令的幫助文檔;
    輸入某個(gè)命令+?時(shí)顯示該條命令的使用說(shuō)明。

  • 用戶輸入exit時(shí)退出該系統(tǒng)。

  • 實(shí)驗(yàn)實(shí)現(xiàn)基于LINUX平臺(tái)。

  • 實(shí)驗(yàn)開(kāi)發(fā)語(yǔ)言必須選用C/C++,不能選用JAVA。

  • 2.實(shí)驗(yàn)環(huán)境

    • 調(diào)試環(huán)境:

    • 操作系統(tǒng):Ubuntu 16.04 TLS;

    • 內(nèi)存:3.5GiB

    • 處理器:AMD E-350 Processor×2

    • 圖形:AMD PALM(DRM 2.50.0/4.15.0-45-generic,LLVM 6.6.6)

    • 操作系統(tǒng)類型:64位

    • 磁盤:30.4GB

    • 開(kāi)發(fā)環(huán)境:

      • 開(kāi)發(fā)工具:Visual Studio 2017;

      • 操作系統(tǒng):Windows 10 家庭中文版;

      • 處理器:Inter? Core? i7-8565u CPU @ 1.8GHz 1.99 GHz;

      • 內(nèi)存:8.00 GB;

      • 系統(tǒng)類型:64位操作系統(tǒng),基于x64的處理器。

    3.實(shí)驗(yàn)設(shè)計(jì)

    3.1系統(tǒng)流程

    整體系統(tǒng)操作模擬Ubuntu命令行,具體流程如下:

    3.2文件結(jié)構(gòu)

    整體系統(tǒng)采用屬性結(jié)構(gòu)組織文件,具體圖示如下:

    3.3實(shí)現(xiàn)的命令

    命令用法說(shuō)明選項(xiàng)
    cdcd [dir]顯示當(dāng)前目錄名或改變當(dāng)前目錄無(wú)
    lsls [dir]顯示當(dāng)前或指定路徑下所有文件和目錄無(wú)
    mkdirmkdir dir在當(dāng)前目錄下建立一個(gè)新目錄無(wú)
    touchtouch file在當(dāng)前目錄下新建一個(gè)新文件無(wú)
    geditgedit file讀寫指定的文件無(wú)
    rmrm -d|-f file|dir刪除指定的目錄或文件-d:刪除目錄 -f:刪除文件
    cpcp -d|-f|-cd|-cf SOURSE DEST從原路徑復(fù)制一個(gè)文件或目錄到目的路徑下-d:復(fù)制目錄 -f:復(fù)制文件 -cd:復(fù)制目錄,但不在原路徑下保留原目錄 -cf:復(fù)制文件,但不在原路徑下保留原文件
    renamerename -d|-f oldname newname更改指定文件或目錄的名字-d:重命名目錄 -f:重命名文件
    susu更改當(dāng)前用戶無(wú)
    clscls清屏無(wú)
    exitexit退出文件系統(tǒng)無(wú)
    helphelp顯示幫助文檔無(wú)

    4.數(shù)據(jù)結(jié)構(gòu)

    為簡(jiǎn)化代碼結(jié)構(gòu),系統(tǒng)未采用面向?qū)ο缶幊痰乃枷搿⒂脩簟⑽募⒛夸浄謩e封裝成一個(gè)struct結(jié)構(gòu)體。

    4.1 用戶數(shù)據(jù)結(jié)構(gòu)

    struct user{string name;//用戶名string password;//密碼};

    說(shuō)明:用戶結(jié)構(gòu)體中包含用戶的用戶名以及密碼。

    4.2 文件數(shù)據(jù)結(jié)構(gòu)

    struct file{string name;//文件名vector<string> content;//文件內(nèi)容user owner;//文件所有者};

    說(shuō)明:文件結(jié)構(gòu)體包含文件名、文件內(nèi)容以及文件所有者。需要特別指出的是,目前系統(tǒng)實(shí)現(xiàn)的多用戶權(quán)限可以概括為:文件創(chuàng)建者為文件所有者,非文件所有者可以知道該文件的存在,但不能對(duì)該文件執(zhí)行讀寫、復(fù)制、刪除等操作。

    4.3 目錄數(shù)據(jù)結(jié)構(gòu)

    struct dir {string name;//目錄名dir* pre;//父目錄map<string, file*> files;//所包含的文件map<string, dir*> next;//子目錄};

    說(shuō)明:目錄結(jié)構(gòu)體包含目錄名、父目錄、當(dāng)前目錄下的文件以及直接子目錄。其中,為方便代碼編寫,后兩個(gè)成員使用map容器包裝,其中map的first為文件名(或目錄名),second為對(duì)應(yīng)的文件指針(或目錄指針)。

    5.模塊詳解

    5.1 用戶指令

    以下按3.3節(jié)展開(kāi)。

    5.1.1 cd

    • 說(shuō)明:顯示當(dāng)前目錄的絕對(duì)路徑或改變當(dāng)前目錄。

    • 流程圖:

    • 關(guān)鍵代碼:
    //cd void cd(string name) { if (name == "") { //顯示當(dāng)前目錄的絕對(duì)路徑 } else { dir* tmp = pathTrans(name);//解析路徑 if (tmp == NULL) { cout << "No Such Directory.\n"; } else { curdir = tmp;//進(jìn)入用戶輸入的路徑 } } }

    5.1.2 ls

    • 說(shuō)明:顯示當(dāng)前目錄下或指定路徑下所有文件和目錄。

    • 流程圖:

    • 關(guān)鍵代碼:
    //ls void ls(string path) { dir *tmp = curdir; if (path != "") { curdir = pathTrans(path);//解析路徑 if (curdir == NULL) { //輸出錯(cuò)誤提示 } } //遍歷輸出文件和目錄信息 for (auto it = curdir->files.begin(); it != curdir->files.end(); it++) { } for (auto it = curdir->next.begin(); it != curdir->next.end(); it++) { } curdir = tmp; }

    5.1.3 mkdir

    • 說(shuō)明:在當(dāng)前目錄下建立一個(gè)新目錄。

    • 用法:mkdir dir,其中dir表示新建目錄的目錄名。

    • 流程圖:

    • 關(guān)鍵代碼:
    //創(chuàng)建目錄 void mkdir(string name) { if (name == "") { cout << "Require Parameters" << endl; } else if (curdir->next.find(name) != curdir->next.end()) { cout << "There is a directory having same name.\n"; } else if (!judgeName(name)) { cout << "Name has at least a illegal character.\n"; } else { dir *tmp = new dir();//一定要這樣創(chuàng)建,否則字符串后面就不能讀取 tmp->name = name; tmp->pre = curdir; curdir->next[name] = tmp; } }

    5.1.4 touch

    • 說(shuō)明:在當(dāng)前目錄下新建一個(gè)新文件。

    • 用法:touch file,其中file表示新建文件的文件名

    • 流程圖:

    • 關(guān)鍵代碼:
    //建立文件 void touch(string name) { if (name == "") { cout << "Require Parameters" << endl; } else if (curdir->files.find(name) != curdir->files.end()) { cout << "There is a same file.\n"; } else if (!judgeName(name)) { cout << "Name has at least a illegal character.\n"; } else { //建立對(duì)應(yīng)的新文件 } }

    5.1.5 gedit

    • 說(shuō)明:讀寫指定的文件。

    • 用法:gedit file,其中file表示需要讀寫的文件,可以用絕對(duì)路徑或相對(duì)路徑指定。

    • 流程圖:

    • 關(guān)鍵代碼:
    //編輯文件 void gedit(string name) { dir *t = curdir; if (name.find_last_of('/') != name.npos) { //解析路徑 } //是否存在目標(biāo)文件 if (curdir->files.find(name) == curdir->files.end()) {} //目標(biāo)文件是否為當(dāng)前用戶所擁有 else if (curdir->files[name]->owner.name != curuser.name) {} else { ofstream out("tmp.dat"); //將文件當(dāng)前內(nèi)容輸入臨時(shí)文件 for (int i = 0; i < curdir->files[name]->content.size(); i++) {} out.close(); //用gedit打開(kāi)臨時(shí)文件 system("gedit tmp.dat"); //讀取臨時(shí)文件中的內(nèi)容,存入文件 ifstream in("tmp.dat"); while (getline(in, t)) { //讀取臨時(shí)文件內(nèi)容 } } curdir = t; }
    • 代碼解釋:

      因本文件系統(tǒng)完全運(yùn)行在內(nèi)存中,創(chuàng)立的文件與目錄并未存在實(shí)際磁盤中。因此,為提高用戶讀寫文件的體驗(yàn),在此引入了一個(gè)臨時(shí)文件機(jī)制:將存儲(chǔ)在內(nèi)存中的文件暫時(shí)存儲(chǔ)到臨時(shí)文件中,然后用gedit打開(kāi)這個(gè)臨時(shí)文件。在用戶編輯完成后,再將臨時(shí)文件中的內(nèi)容轉(zhuǎn)存到內(nèi)存中。

      Gedit是一個(gè)GNOME桌面環(huán)境下兼容UTF-8的文本編輯器。它使用GTK+編寫而成,因此它十分的簡(jiǎn)單易用,有良好的語(yǔ)法高亮,對(duì)中文支持很好,支持包括gb2312、gbk在內(nèi)的多種字符編碼。

      雖然這樣的操作效率不高,但是借助gedit強(qiáng)大的功能,能給用戶帶來(lái)一種編輯真實(shí)文件的體驗(yàn)。

    5.1.6 rm

    • 說(shuō)明:刪除指定的目錄或文件。

    • 用法:rm -d|-f
      file|dir,其中file與dir代表需要?jiǎng)h除的文件或目錄,目錄(或文件)均可用絕對(duì)路徑或者相對(duì)路徑表示。

    • 選項(xiàng):

      • -d:刪除目錄;

      • -f:刪除文件。

    • 流程圖:

    • 關(guān)鍵代碼:
    //刪除 void rm(string tmp) { //選項(xiàng)解析,路徑解析 //刪除目錄 if (option == "-d") { //是否存在目標(biāo)目錄 if (curdir->next.find(name) == curdir->next.end()) {} else { deletedir(curdir->next[name]);//遞歸刪除 } } else if (option == "-f") { //是否存在目標(biāo)目錄 if (curdir->files.find(name) == curdir->files.end()) {} //是否為文件所有者 else if (curdir->files[name]->owner.name != curuser.name) {} else { delete(curdir->files[name]); } } }
    • 代碼解釋:因本系統(tǒng)采用樹形的目錄結(jié)構(gòu),因此在刪除目錄時(shí)需要用到遞歸,如deletedir函數(shù)所示。
    //遞歸刪除目錄 void deletedir(dir *cur) { //先刪文件 for (auto it = cur->files.begin(); it != cur->files.end(); it++) { delete(it->second); } cur->files.clear(); //再刪目錄,要嵌套刪除 for (auto it = cur->next.begin(); it != cur->next.end(); it++) { deletedir(it->second); } cur->next.clear(); delete(cur); }

    5.1.7 cp

    • 說(shuō)明:復(fù)制一個(gè)文件或目錄到指定路徑下。

    • 用法:cp -d|-f|-cd|-cf SOURCE
      DEST,其中SOURCE為需要復(fù)制的文件或目錄,DEST為需要復(fù)制到的路徑。SOURCE與DEST均可用絕對(duì)路徑或者相對(duì)路徑表示。

    • 選項(xiàng):

      • -d:復(fù)制目錄

      • -f:復(fù)制文件

      • -cd:復(fù)制目錄,但不在原路徑下保留原目錄

      • -cf:復(fù)制文件,但不在原路徑下保留原文件

    • 流程圖:

    • 關(guān)鍵代碼:
    //復(fù)制 void cp(string tmp) { //解析選項(xiàng)與路徑 if (option == "-f") { //是否有同名文件 if (den->files.find(name) != den->files.end()) {} //是否存在目標(biāo)文件 else if (sou->files.find(name) == sou->files.end()) {} //是否為當(dāng)前用戶所擁有 else if (curdir->files[name]->owner.name != curuser.name) {} else { file *tmp = new file(*(sou->files[name]));//復(fù)制文件 den->files[name] = tmp;//放入目的目錄下 } } else if (option == "-d") { //是否有同名目錄 if (den->next.find(name) != den->next.end()) {} //是否存在目標(biāo)目錄 else if (sou->next.find(name) == sou->next.end()) {} else { dir *tmp = cpDir(sou->next[name]);//遞歸復(fù)制目錄 tmp->pre = den;den->next[name] = tmp;//放入到目的目錄下 } } else if (option == "-cf") { //是否有同名文件 if (den->files.find(name) != den->files.end()){} //是否存在目標(biāo)文件 else if (sou->files.find(name) == sou->files.end()){} //是否為當(dāng)前用戶所擁有 else if (curdir->files[name]->owner.name != curuser.name){} else { den->files[name] = sou->files[name];//放入到目的目錄下 sou->files.erase(name); } } else if (option == "-cd") { //是否有同名目錄 if (den->next.find(name) != den->next.end()){} //是否存在目標(biāo)目錄 else if (sou->next.find(name) == sou->next.end()){} else { den->next[name] = sou->next[name];//放入到目的目錄下 sou->next.erase(name); } } }
    • 代碼解釋:跟刪除類似,在復(fù)制目錄時(shí)需要用到遞歸復(fù)制,如cpDir所示。
    //遞歸復(fù)制目錄 dir* cpDir(dir *tmp) { dir *goal = new dir(*tmp); //清除原來(lái)的內(nèi)容 goal->next.clear(); goal->files.clear(); //把文件重建 for (auto it = tmp->files.begin(); it != tmp->files.end(); it++) { file *f = new file(*(it->second)); goal->files[it->first] = f; } //重建目錄 for (auto it = tmp->next.begin(); it != tmp->next.end(); it++) { dir *d = cpDir(it->second); d->pre = goal; goal->next[it->first] = d; } return goal; }

    5.1.8 rename

    • 說(shuō)明:更改指定文件或目錄的名字。

    • 用法:rename -d|-f oldname
      newname,oldname代表需要重命名的目錄或文件,newname代表重命名后的名字。oldname可以使用絕對(duì)路徑或相對(duì)路徑。

    • 選項(xiàng):

      • -d:重命名目錄;

      • -f:重命名文件。

    • 流程圖:

    • 關(guān)鍵代碼:
    void rename(string tmp) { //解析路徑與選項(xiàng) if (!judgeName(newname)) {}//新名字中是否有非法字符 if (option == "-d") { if (curdir->next.find(old) == curdir->next.end()) {}//是否存在目標(biāo)目錄 else if (curdir->next.find(newname) != curdir->next.end()) {}//是否存在與新名字重名的目錄 else { //重命名 } } else if (option == "-f") { if (curdir->files.find(old) == curdir->files.end()) {}//是否存在對(duì)應(yīng)文件 else if (curdir->files.find(newname) != curdir->files.end()) {}//是否存在與新名字重名的文件 else if (curdir->files[old]->owner.name != curuser.name) {}//需重命名文件是否為當(dāng)前用戶擁有 else { //重命名 } } }

    5.1.9 su

    • 說(shuō)明:更改當(dāng)前用戶(調(diào)用login函數(shù),詳見(jiàn)下文)。

    5.1.10 cls

    • 說(shuō)明:清屏。

    5.1.11 exit

    • 說(shuō)明:退出文件系統(tǒng)(主要調(diào)用save函數(shù),詳見(jiàn)下文)。

    5.1.12 help

    • 說(shuō)明:顯示幫助文檔。

    5.2 其他系統(tǒng)操作

    5.2.1 登錄

    • 流程圖:

    • 關(guān)鍵代碼:

    void login() { bool flag = 1; map<string, string> users;//所有注冊(cè)用戶 //打印歡迎語(yǔ) ifstream in("user.dat"); string tname, tpass; while (in >> tname >> tpass) {}//讀入所有注冊(cè)用戶的信息 //輸入用戶名 while (flag) { if (users.find(tname) == users.end()) {}//注冊(cè)用戶中是否有輸入用戶 else { if (users[tname] == tpass) { //核對(duì)用戶名與密碼是否匹配 } else { printf("password is incorrect!\n"); } } } if (!flag) { printf("This user is not exist.\nDo you want to creat a new user?(y/n):"); char choice; cin >> choice; if (choice == 'Y' || choice == 'y') { //注冊(cè) } else { login(); } } //重新存回 ofstream out("user.dat"); for (auto it = users.begin(); it != users.end(); it++) {} return; }

    5.2.2 保存系統(tǒng)狀態(tài)

    為提高用戶體驗(yàn),每次用戶使用exit命令退出系統(tǒng)時(shí),系統(tǒng)會(huì)保存退出前的系統(tǒng)狀態(tài)。

    保存系統(tǒng)狀態(tài)的主要實(shí)現(xiàn)思想是:通過(guò)遞歸遍歷系統(tǒng)的目錄結(jié)構(gòu),以字符串向量的形式存儲(chǔ)包括目錄名、文件名、文件內(nèi)容在內(nèi)的所有信息。最后將字符串向量存入record.dat文件。字符串向量?jī)?nèi)部的結(jié)構(gòu)類似xml文件。具體流程圖與代碼如下:

    • 流程圖:

      • exit函數(shù):

    • save函數(shù):

    • 具體代碼:
    //退出系統(tǒng) void exit() { records.clear(); save(root); ofstream outr("record.dat"); for (int i = 0; i < records.size(); i++) { outr << records[i] << endl; } } //存儲(chǔ)目前情況 void save(dir *tmp) { records.push_back(tmp->name);//目錄名 records.push_back(to_string(tmp->files.size()));//文件數(shù) for (auto it = tmp->files.begin(); it != tmp->files.end(); it++) { records.push_back(it->second->name);//文件名 for (int i = 0; i < it->second->content.size(); i++) { records.push_back( it->second->content[i]);//文件內(nèi)容 } records.push_back("content");//文件內(nèi)容結(jié)束符 records.push_back(it->second->owner.name);//所有者用戶名 records.push_back(it->second->owner.password);//所有者密碼 } records.push_back(to_string(tmp->next.size()));//子目錄數(shù) for (auto it = tmp->next.begin(); it != tmp->next.end(); it++) { records.push_back(it->second->name);//子目錄名 save(it->second);//遞歸子目錄 } }

    為方便調(diào)試,record.dat文件以明文存儲(chǔ),文件內(nèi)容如下:

    5.2.3 恢復(fù)系統(tǒng)狀態(tài)

    為提高用戶體驗(yàn),每次打開(kāi)系統(tǒng)時(shí),系統(tǒng)會(huì)根據(jù)record.dat文件存儲(chǔ)的系統(tǒng)狀態(tài)恢復(fù)上一次退出前的系統(tǒng)狀態(tài)。

    恢復(fù)系統(tǒng)狀態(tài)的實(shí)現(xiàn)思想與保存系統(tǒng)狀態(tài)(5.2.2)類似,根據(jù)record.dat的數(shù)據(jù)重建目錄結(jié)構(gòu)。
    具體流程圖與代碼如下:

    • 流程圖:

      • init函數(shù):

    • creat函數(shù):

    • 具體代碼:
    void init() { ifstream inr("record.dat"); string tmp; if (!inr) { initDir(); } while (inr >> tmp) records.push_back(tmp); if (records.size() >= 1) { root = curdir = creat(NULL); } else { initDir(); } } //還原上一次系統(tǒng)關(guān)閉狀態(tài) dir* creat(dir *last) { dir *tmp = new dir();//新建目錄 tmp->name=records[reco++];//讀取目錄名 tmp->pre = last;//設(shè)置父指針 string t; t= records[reco++];//讀取文件數(shù) for (int i = 0; i < stoi(t); i++) { file *tfile = new file();//新建文件 tfile->name= records[reco++];//讀取文件名 while (1) { string ts; ts= records[reco++];//讀取文件內(nèi)容 if (ts != "content") {//不是關(guān)鍵字就持續(xù)讀入內(nèi)容 tfile->content.push_back(ts); } else { break; } } user a; a.name = records[reco++];//讀取用戶名 a.password= records[reco++];//密碼 tfile->owner = a; tmp->files[tfile->name] = tfile;//將新建的文件加入目錄 } t= records[reco++];//子目錄數(shù) for (int i = 0; i < stoi(t); i++) { string name; name= records[reco++];//子目錄名 tmp->next[name] = creat(tmp);//遞歸新建子目錄 } return tmp; }

    5.2.4 路徑解析

    為提高用戶體驗(yàn),系統(tǒng)引入了路徑解析的機(jī)制,可以讓包括cd、ls、gedit在內(nèi)的多種操作同時(shí)支持相對(duì)路徑與絕對(duì)路徑。絕對(duì)路徑與相對(duì)路徑的表示方式與Ubuntu系統(tǒng)相同。

    路徑解析輸入的參數(shù)為絕對(duì)路徑或相對(duì)路徑,返回的結(jié)果是目標(biāo)目錄的指針。具體流程圖與代碼如下:

    • 流程圖:

    • 關(guān)鍵代碼:
    dir* pathTrans(string path) { string tmp = path; //絕對(duì)路徑 if (path[0] == '~' || path[0] == '/') { dir *cur = root; if (path[0] == '/')path = "~" + path; vector<string> tmp = split(path);//按照/分割路徑 for (int i = 1; i < tmp.size(); i++) { if (cur->next.find(tmp[i]) == cur->next.end()) { return NULL; } cur = cur->next[tmp[i]]; } return cur; } //相對(duì)路徑 else { dir *cur = curdir; vector<string> tmp = split(path);//按照/分割路徑 for (int i = 0; i < tmp.size(); i++) { if (tmp[i] == ".") { } else if (tmp[i] == "..") { if (cur == root) {//不能再往上走了 return NULL; } else { cur = cur->pre; } } else if (cur->next.find(tmp[i]) == cur->next.end()) { return NULL; } else if (cur->next.find(tmp[i]) != cur->next.end()) { cur = cur->next[tmp[i]]; } } return cur; } return NULL; }

    6.實(shí)驗(yàn)演示

    6.1登錄

    • 歡迎界面

    • 當(dāng)用戶名與密碼不匹配,系統(tǒng)會(huì)讓用戶反復(fù)輸入密碼,直到正確為止:

    • 當(dāng)輸入用戶名與不在已注冊(cè)用戶中,若用戶同意創(chuàng)建用戶,系統(tǒng)會(huì)根據(jù)先前輸入的用戶名與密碼創(chuàng)建用戶:

    6.2幫助文檔與使用說(shuō)明

    • 用戶輸入help時(shí)顯示所有命令的幫助文檔:

    • 輸入某個(gè)命令+?時(shí)顯示該條命令的使用說(shuō)明:

    6.3 cd命令

    說(shuō)明:紅框?yàn)槟壳案?jié)點(diǎn)下?lián)碛械哪夸?#xff1b;黃框展示使用相對(duì)路徑、絕對(duì)路徑更改目錄,以及回到上一級(jí)目錄的情況;藍(lán)框展示遇到錯(cuò)誤路徑的情況。

    6.4 ls命令

    說(shuō)明:黃框展示有參及無(wú)參ls命令的使用情況;藍(lán)框展示遇到錯(cuò)誤路徑的情況。

    6.5 mkdir命令


    說(shuō)明:紅框展示目前根節(jié)點(diǎn)下?lián)碛械哪夸?#xff1b;黃框展示新建一個(gè)paly目錄的情況;藍(lán)框展示遇到重名目錄的情況;第三張圖展示新建目錄名中存在非法字符的情況。

    6.6 touch命令

    說(shuō)明:紅框展示~/study/college目錄下?lián)碛械奈募?#xff1b;黃框展示新建一個(gè)test2.txt文件的情況;藍(lán)框展示遇到重名文件的情況;展示新建文件名中存在非法字符的情況。

    6.7 gedit命令

    說(shuō)明:紅框展示~/study/college目錄下?lián)碛械奈募?#xff1b;黃框展示讀寫test2.txt文件的情況,截圖下半部為gedit打開(kāi)臨時(shí)文件;藍(lán)框展示遇到缺少文件名及文件非當(dāng)前用戶擁有的情況。

    6.8 rm命令

    說(shuō)明:紅框展示根目錄下?lián)碛械奈募c目錄;黃框展示刪除work目錄的情況;綠框展示刪除test.txt文件的情況;藍(lán)框展示遇到不存在目錄或文件的情況。

    6.9 cp命令

    說(shuō)明:紅框展示~/study目錄與~/work目錄下?lián)碛械奈募c目錄;黃框展示復(fù)制college目錄到~/work目錄的情況。

    說(shuō)明:紅框展示~/work與~/study/college目錄下?lián)碛械奈募c目錄;黃框展示復(fù)制test2.txt文件到~/work目錄的情況。

    說(shuō)明:紅框展示~/work與~/study/college目錄下?lián)碛械奈募c目錄;黃框展示剪貼test2.txt文件到~/work目錄的情況。

    說(shuō)明:紅框展示~/work與~/study目錄下?lián)碛械奈募c目錄;黃框展示剪貼college目錄到~/work目錄的情況。

    6.10 用戶權(quán)限

    系統(tǒng)實(shí)現(xiàn)的多用戶權(quán)限可以概括為:文件創(chuàng)建者為文件所有者,非文件所有者可以知道該文件的存在,但不能對(duì)該文件執(zhí)行讀寫、復(fù)制、刪除等操作。下圖展示了非文件所有者不能對(duì)文件執(zhí)行g(shù)edit、rm、rename、cp命令的情況:

    實(shí)現(xiàn)代碼

    代碼詳見(jiàn)github,歡迎star!

    總結(jié)

    以上是生活随笔為你收集整理的操作系统课程设计:模拟文件系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。