操作系统课程设计:模拟文件系统
文章目錄
- 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)的命令
| cd | cd [dir] | 顯示當(dāng)前目錄名或改變當(dāng)前目錄 | 無(wú) |
| ls | ls [dir] | 顯示當(dāng)前或指定路徑下所有文件和目錄 | 無(wú) |
| mkdir | mkdir dir | 在當(dāng)前目錄下建立一個(gè)新目錄 | 無(wú) |
| touch | touch file | 在當(dāng)前目錄下新建一個(gè)新文件 | 無(wú) |
| gedit | gedit file | 讀寫指定的文件 | 無(wú) |
| rm | rm -d|-f file|dir | 刪除指定的目錄或文件 | -d:刪除目錄 -f:刪除文件 |
| cp | cp -d|-f|-cd|-cf SOURSE DEST | 從原路徑復(fù)制一個(gè)文件或目錄到目的路徑下 | -d:復(fù)制目錄 -f:復(fù)制文件 -cd:復(fù)制目錄,但不在原路徑下保留原目錄 -cf:復(fù)制文件,但不在原路徑下保留原文件 |
| rename | rename -d|-f oldname newname | 更改指定文件或目錄的名字 | -d:重命名目錄 -f:重命名文件 |
| su | su | 更改當(dāng)前用戶 | 無(wú) |
| cls | cls | 清屏 | 無(wú) |
| exit | exit | 退出文件系統(tǒng) | 無(wú) |
| help | help | 顯示幫助文檔 | 無(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)鍵代碼:
5.1.2 ls
-
說(shuō)明:顯示當(dāng)前目錄下或指定路徑下所有文件和目錄。
-
流程圖:
- 關(guān)鍵代碼:
5.1.3 mkdir
-
說(shuō)明:在當(dāng)前目錄下建立一個(gè)新目錄。
-
用法:mkdir dir,其中dir表示新建目錄的目錄名。
-
流程圖:
- 關(guān)鍵代碼:
5.1.4 touch
-
說(shuō)明:在當(dāng)前目錄下新建一個(gè)新文件。
-
用法:touch file,其中file表示新建文件的文件名
-
流程圖:
- 關(guān)鍵代碼:
5.1.5 gedit
-
說(shuō)明:讀寫指定的文件。
-
用法:gedit file,其中file表示需要讀寫的文件,可以用絕對(duì)路徑或相對(duì)路徑指定。
-
流程圖:
- 關(guān)鍵代碼:
-
代碼解釋:
因本文件系統(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)鍵代碼:
- 代碼解釋:因本系統(tǒng)采用樹形的目錄結(jié)構(gòu),因此在刪除目錄時(shí)需要用到遞歸,如deletedir函數(shù)所示。
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ù)制目錄時(shí)需要用到遞歸復(fù)制,如cpDir所示。
5.1.8 rename
-
說(shuō)明:更改指定文件或目錄的名字。
-
用法:rename -d|-f oldname
newname,oldname代表需要重命名的目錄或文件,newname代表重命名后的名字。oldname可以使用絕對(duì)路徑或相對(duì)路徑。 -
選項(xiàng):
-
-d:重命名目錄;
-
-f:重命名文件。
-
-
流程圖:
- 關(guān)鍵代碼:
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)鍵代碼:
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ù):
- 具體代碼:
為方便調(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ù):
- 具體代碼:
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)鍵代碼:
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)題。
- 上一篇: “睡服”面试官系列第九篇之数值的扩展(建
- 下一篇: 计算机操作系统教程——分区存储管理