操作系统课程设计:模拟文件系统
文章目錄
- 1.實驗要求
- 2.實驗環境
- 3.實驗設計
- 3.1系統流程
- 3.2文件結構
- 3.3實現的命令
- 4.數據結構
- 4.1 用戶數據結構
- 4.2 文件數據結構
- 4.3 目錄數據結構
- 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 其他系統操作
- 5.2.1 登錄
- 5.2.2 保存系統狀態
- 5.2.3 恢復系統狀態
- 5.2.4 路徑解析
- 6.實驗演示
- 6.1登錄
- 6.2幫助文檔與使用說明
- 6.3 cd命令
- 6.4 ls命令
- 6.5 mkdir命令
- 6.6 touch命令
- 6.7 gedit命令
- 6.8 rm命令
- 6.9 cp命令
- 6.10 用戶權限
- 實現代碼
1.實驗要求
設計和實現一個模擬文件系統,要求包括目錄、普通文件和文件的存儲。。
文件系統的目錄結構采用類似Linux的樹狀結構。
要求模擬的操作包括:
-
目錄的添加、刪除、重命名;
-
目錄的顯示(列表);
-
文件的添加、刪除、重命名;
-
文件和目錄的拷貝;
-
文件的讀寫操作。
用戶進入時顯示可用命令列表;用戶輸入help時顯示所有命令的幫助文檔;
輸入某個命令+?時顯示該條命令的使用說明。
用戶輸入exit時退出該系統。
實驗實現基于LINUX平臺。
實驗開發語言必須選用C/C++,不能選用JAVA。
2.實驗環境
-
調試環境:
-
操作系統:Ubuntu 16.04 TLS;
-
內存:3.5GiB
-
處理器:AMD E-350 Processor×2
-
圖形:AMD PALM(DRM 2.50.0/4.15.0-45-generic,LLVM 6.6.6)
-
操作系統類型:64位
-
磁盤:30.4GB
-
開發環境:
-
開發工具:Visual Studio 2017;
-
操作系統:Windows 10 家庭中文版;
-
處理器:Inter? Core? i7-8565u CPU @ 1.8GHz 1.99 GHz;
-
內存:8.00 GB;
-
系統類型:64位操作系統,基于x64的處理器。
-
3.實驗設計
3.1系統流程
整體系統操作模擬Ubuntu命令行,具體流程如下:
3.2文件結構
整體系統采用屬性結構組織文件,具體圖示如下:
3.3實現的命令
| cd | cd [dir] | 顯示當前目錄名或改變當前目錄 | 無 |
| ls | ls [dir] | 顯示當前或指定路徑下所有文件和目錄 | 無 |
| mkdir | mkdir dir | 在當前目錄下建立一個新目錄 | 無 |
| touch | touch file | 在當前目錄下新建一個新文件 | 無 |
| gedit | gedit file | 讀寫指定的文件 | 無 |
| rm | rm -d|-f file|dir | 刪除指定的目錄或文件 | -d:刪除目錄 -f:刪除文件 |
| cp | cp -d|-f|-cd|-cf SOURSE DEST | 從原路徑復制一個文件或目錄到目的路徑下 | -d:復制目錄 -f:復制文件 -cd:復制目錄,但不在原路徑下保留原目錄 -cf:復制文件,但不在原路徑下保留原文件 |
| rename | rename -d|-f oldname newname | 更改指定文件或目錄的名字 | -d:重命名目錄 -f:重命名文件 |
| su | su | 更改當前用戶 | 無 |
| cls | cls | 清屏 | 無 |
| exit | exit | 退出文件系統 | 無 |
| help | help | 顯示幫助文檔 | 無 |
4.數據結構
為簡化代碼結構,系統未采用面向對象編程的思想。將用戶、文件、目錄分別封裝成一個struct結構體。
4.1 用戶數據結構
struct user{string name;//用戶名string password;//密碼};說明:用戶結構體中包含用戶的用戶名以及密碼。
4.2 文件數據結構
struct file{string name;//文件名vector<string> content;//文件內容user owner;//文件所有者};說明:文件結構體包含文件名、文件內容以及文件所有者。需要特別指出的是,目前系統實現的多用戶權限可以概括為:文件創建者為文件所有者,非文件所有者可以知道該文件的存在,但不能對該文件執行讀寫、復制、刪除等操作。
4.3 目錄數據結構
struct dir {string name;//目錄名dir* pre;//父目錄map<string, file*> files;//所包含的文件map<string, dir*> next;//子目錄};說明:目錄結構體包含目錄名、父目錄、當前目錄下的文件以及直接子目錄。其中,為方便代碼編寫,后兩個成員使用map容器包裝,其中map的first為文件名(或目錄名),second為對應的文件指針(或目錄指針)。
5.模塊詳解
5.1 用戶指令
以下按3.3節展開。
5.1.1 cd
-
說明:顯示當前目錄的絕對路徑或改變當前目錄。
-
流程圖:
- 關鍵代碼:
5.1.2 ls
-
說明:顯示當前目錄下或指定路徑下所有文件和目錄。
-
流程圖:
- 關鍵代碼:
5.1.3 mkdir
-
說明:在當前目錄下建立一個新目錄。
-
用法:mkdir dir,其中dir表示新建目錄的目錄名。
-
流程圖:
- 關鍵代碼:
5.1.4 touch
-
說明:在當前目錄下新建一個新文件。
-
用法:touch file,其中file表示新建文件的文件名
-
流程圖:
- 關鍵代碼:
5.1.5 gedit
-
說明:讀寫指定的文件。
-
用法:gedit file,其中file表示需要讀寫的文件,可以用絕對路徑或相對路徑指定。
-
流程圖:
- 關鍵代碼:
-
代碼解釋:
因本文件系統完全運行在內存中,創立的文件與目錄并未存在實際磁盤中。因此,為提高用戶讀寫文件的體驗,在此引入了一個臨時文件機制:將存儲在內存中的文件暫時存儲到臨時文件中,然后用gedit打開這個臨時文件。在用戶編輯完成后,再將臨時文件中的內容轉存到內存中。
Gedit是一個GNOME桌面環境下兼容UTF-8的文本編輯器。它使用GTK+編寫而成,因此它十分的簡單易用,有良好的語法高亮,對中文支持很好,支持包括gb2312、gbk在內的多種字符編碼。
雖然這樣的操作效率不高,但是借助gedit強大的功能,能給用戶帶來一種編輯真實文件的體驗。
5.1.6 rm
-
說明:刪除指定的目錄或文件。
-
用法:rm -d|-f
file|dir,其中file與dir代表需要刪除的文件或目錄,目錄(或文件)均可用絕對路徑或者相對路徑表示。 -
選項:
-
-d:刪除目錄;
-
-f:刪除文件。
-
-
流程圖:
- 關鍵代碼:
- 代碼解釋:因本系統采用樹形的目錄結構,因此在刪除目錄時需要用到遞歸,如deletedir函數所示。
5.1.7 cp
-
說明:復制一個文件或目錄到指定路徑下。
-
用法:cp -d|-f|-cd|-cf SOURCE
DEST,其中SOURCE為需要復制的文件或目錄,DEST為需要復制到的路徑。SOURCE與DEST均可用絕對路徑或者相對路徑表示。 -
選項:
-
-d:復制目錄
-
-f:復制文件
-
-cd:復制目錄,但不在原路徑下保留原目錄
-
-cf:復制文件,但不在原路徑下保留原文件
-
-
流程圖:
- 關鍵代碼:
- 代碼解釋:跟刪除類似,在復制目錄時需要用到遞歸復制,如cpDir所示。
5.1.8 rename
-
說明:更改指定文件或目錄的名字。
-
用法:rename -d|-f oldname
newname,oldname代表需要重命名的目錄或文件,newname代表重命名后的名字。oldname可以使用絕對路徑或相對路徑。 -
選項:
-
-d:重命名目錄;
-
-f:重命名文件。
-
-
流程圖:
- 關鍵代碼:
5.1.9 su
- 說明:更改當前用戶(調用login函數,詳見下文)。
5.1.10 cls
- 說明:清屏。
5.1.11 exit
- 說明:退出文件系統(主要調用save函數,詳見下文)。
5.1.12 help
- 說明:顯示幫助文檔。
5.2 其他系統操作
5.2.1 登錄
-
流程圖:
-
關鍵代碼:
5.2.2 保存系統狀態
為提高用戶體驗,每次用戶使用exit命令退出系統時,系統會保存退出前的系統狀態。
保存系統狀態的主要實現思想是:通過遞歸遍歷系統的目錄結構,以字符串向量的形式存儲包括目錄名、文件名、文件內容在內的所有信息。最后將字符串向量存入record.dat文件。字符串向量內部的結構類似xml文件。具體流程圖與代碼如下:
-
流程圖:
- exit函數:
- save函數:
- 具體代碼:
為方便調試,record.dat文件以明文存儲,文件內容如下:
5.2.3 恢復系統狀態
為提高用戶體驗,每次打開系統時,系統會根據record.dat文件存儲的系統狀態恢復上一次退出前的系統狀態。
恢復系統狀態的實現思想與保存系統狀態(5.2.2)類似,根據record.dat的數據重建目錄結構。
具體流程圖與代碼如下:
-
流程圖:
- init函數:
- creat函數:
- 具體代碼:
5.2.4 路徑解析
為提高用戶體驗,系統引入了路徑解析的機制,可以讓包括cd、ls、gedit在內的多種操作同時支持相對路徑與絕對路徑。絕對路徑與相對路徑的表示方式與Ubuntu系統相同。
路徑解析輸入的參數為絕對路徑或相對路徑,返回的結果是目標目錄的指針。具體流程圖與代碼如下:
- 流程圖:
- 關鍵代碼:
6.實驗演示
6.1登錄
- 歡迎界面
- 當用戶名與密碼不匹配,系統會讓用戶反復輸入密碼,直到正確為止:
- 當輸入用戶名與不在已注冊用戶中,若用戶同意創建用戶,系統會根據先前輸入的用戶名與密碼創建用戶:
6.2幫助文檔與使用說明
- 用戶輸入help時顯示所有命令的幫助文檔:
- 輸入某個命令+?時顯示該條命令的使用說明:
6.3 cd命令
說明:紅框為目前根節點下擁有的目錄;黃框展示使用相對路徑、絕對路徑更改目錄,以及回到上一級目錄的情況;藍框展示遇到錯誤路徑的情況。
6.4 ls命令
說明:黃框展示有參及無參ls命令的使用情況;藍框展示遇到錯誤路徑的情況。
6.5 mkdir命令
說明:紅框展示目前根節點下擁有的目錄;黃框展示新建一個paly目錄的情況;藍框展示遇到重名目錄的情況;第三張圖展示新建目錄名中存在非法字符的情況。
6.6 touch命令
說明:紅框展示~/study/college目錄下擁有的文件;黃框展示新建一個test2.txt文件的情況;藍框展示遇到重名文件的情況;展示新建文件名中存在非法字符的情況。
6.7 gedit命令
說明:紅框展示~/study/college目錄下擁有的文件;黃框展示讀寫test2.txt文件的情況,截圖下半部為gedit打開臨時文件;藍框展示遇到缺少文件名及文件非當前用戶擁有的情況。
6.8 rm命令
說明:紅框展示根目錄下擁有的文件與目錄;黃框展示刪除work目錄的情況;綠框展示刪除test.txt文件的情況;藍框展示遇到不存在目錄或文件的情況。
6.9 cp命令
說明:紅框展示~/study目錄與~/work目錄下擁有的文件與目錄;黃框展示復制college目錄到~/work目錄的情況。
說明:紅框展示~/work與~/study/college目錄下擁有的文件與目錄;黃框展示復制test2.txt文件到~/work目錄的情況。
說明:紅框展示~/work與~/study/college目錄下擁有的文件與目錄;黃框展示剪貼test2.txt文件到~/work目錄的情況。
說明:紅框展示~/work與~/study目錄下擁有的文件與目錄;黃框展示剪貼college目錄到~/work目錄的情況。
6.10 用戶權限
系統實現的多用戶權限可以概括為:文件創建者為文件所有者,非文件所有者可以知道該文件的存在,但不能對該文件執行讀寫、復制、刪除等操作。下圖展示了非文件所有者不能對文件執行gedit、rm、rename、cp命令的情況:
實現代碼
代碼詳見github,歡迎star!
總結
以上是生活随笔為你收集整理的操作系统课程设计:模拟文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “睡服”面试官系列第九篇之数值的扩展(建
- 下一篇: 前端学习(1986)vue之电商管理系统