操作系統
課程設計報告
一、 實驗內容:
模擬文件管理系統
為Linux系統設計一個簡單的二級文件系統。要求做到以下幾點:
(1)可以實現下列幾條命令
login 用戶登錄
dir 列文件目錄
create 創建文件
delete 刪除文件
open 打開文件
close 關閉文件
read 讀文件
write 寫文件
(2)列目錄時要列出文件名、物理地址、保護碼和文件長度;
(3)源文件可以進行讀寫保護。
二、 實驗設計原理:
(1)本題使用的數據結構:
磁盤結構體:
typedef struct diskList
{
int maxlength;//磁塊的大小
int start;//磁塊的起始地址
int useFlag;//標志該磁塊是否已使用過
char* text;//存放的文件內容
distList* next;
}diskNode;
文件結構體:
struct fileList
{
string filename;//文件名
int start;//物理地址
int length;//文件長度
int maxlength;//文件的最大長度
char fileKind;//文件類型:只讀0 只寫1 讀寫2
char protect;//保護碼
bool openflag;//打開標志,當為true時標志該文件正打開
};
子目錄結構體:
typedef struct UserFileDirectory
{
fileList* file;//連接文件
UserFileDirectory* next;//連接用戶目錄項
}UFD;
主目錄結構體:
typedef struct MasterFileDirectory
{
string username;
string password;
UFD* user;//連接用戶目錄項
}MFD;
(2)本題主要符號說明:
類型 |
名稱 |
說明 |
diskNode* |
diskHead |
磁盤鏈表頭指針 |
MFD |
User[] |
主目錄集合 |
int |
MaxUser |
最大用戶數 |
int |
Used |
已有用戶數 |
int |
NowUser |
當前用戶 |
string |
Now_Filename |
當前正在使用的文件名 |
bool |
FileOpen |
當前是否有已打開文件 |
(3)本題主要函數說明:
類型 |
名稱 |
說明 |
void |
FreeSpace |
釋放整個文件系統使用到的鏈表指針 |
void |
Initdata |
初始化主要數據 |
void |
userCreate |
為文件系統創建用戶 |
int |
login |
登錄系統 |
int |
requestDisk |
請求分配存儲磁塊 |
void |
fileCreate |
創建文件 |
void |
freeDisk |
釋放文件所占的磁塊 |
void |
fileDelete |
刪除文件 |
void |
fileRead |
讀取文件內容 |
void |
filewrite |
往文件寫入內容 |
void |
fileclose |
關閉文件 |
void |
fileopen |
打開文件 |
void |
SaveData |
保存主目錄、子目錄和已創建的文件 |
void |
fileDir |
列文件目錄 |
string |
GetUser |
獲取當前正在使用系統的用戶名 |
(4)程序流程圖:
五、實驗結果與分析:
初始界面:
首先輸入user命令為文件系統創建用戶並使用login命令登陸剛才創建的用戶:
用戶登錄成功,login命令成功實現。
先查看本地文件夾:
可以看到除了編譯文件和源程序之外是沒有其他文件的
下面使用creat命令創建兩個文件,分別是aaa,bbb,其中aaa為只讀文件,bbb為讀寫文件:
可以看到命令完成后本地文件夾成功創建兩個文件。
下面執行dir命令查看文件信息:
其中物理地址我沒有按照提示那樣去設定,我是這樣設定的:每個文件創建的時候會有分配長度,系統根據輸入信息分配一個相同大小的物理磁塊作為文件的內容存儲空間,文件的物理地址就是其所在磁塊的起始地址。保護碼的設定為讀寫權限的指令標志,即0為只讀文件,2為讀寫文件。
下面使用open命令打開文件:
注意,如果文件沒有提前open就執行read讀操作或者write寫操作視為非法操作。
比如下:
open文件aaa:
使用write命令對文件aaa寫入數據。
可以看到,我們在創建aaa文件時指定的是只讀文件,無法進行寫操作,這就是讀寫保護。
我們先使用close命令關閉當前打開的文件aaa,再使用open命令打開可讀寫文件bbb。
先在本地查看bbb文件的內容:
可以看到無任何內容,然后對bbb執行write寫操作:
可以看到寫入成功,文件內容也發生變化!
下面使用delete命令將文件bbb刪除:
可以看到,上面我們使用bbb文件后還未執行close命令關閉文件,所以無法刪除,我們先close文件bbb,再執行刪除:
可以看到,剛才在上一張截圖中還存在的bbb已經被刪除。
下面執行dir查看當前文件目錄信息:
可以看見bbb已經成功被刪除。
輸入exit命令退出系統,會自動保存主目錄及用戶文件目錄,形成文件,其中主目錄文件MFD存放用戶名稱,用戶目錄文件名為用戶名,存放該用戶下創建的各個文件名。為效果明顯,我在退出之前又創建了用戶A、用戶B,在ywd用戶下多創建了文件ccc和ddd。
查看一下主目錄文件MFD的內容:
ywd文件的內容:
A和B因為沒有在他們下面創建文件所以內容都為空,此處就不放圖。
至此,題目要求的八大功能已全部實現並演示完畢!全部都是同一時間點下的演示,每個截圖最上方有日期和時間可供查看,僅有兩張圖片漏截時間。
五、課設收獲和體會:
本次課程設計讓我對二級文件系統有了很深刻的認知和理解。二級文件系統的文件路徑即為/用戶/文件名,題目截圖中出現了mkdir的命令操作創建一個子目錄,我認為這是沒有必要的,每個用戶的用戶文件目錄表只有一個,不存在多個用戶文件目錄表的情況,如果有了mkdir不就可以在目錄下創建一個子目錄,然后在新建的子目錄下再執行mkdir再創建新的子目錄了嗎,這樣的話題目應該寫為實現樹形文件目錄系統,而不是二級文件目錄系統了。我認為這樣的操作違背了二級文件系統的邏輯結構。所以我在實現的過程中創建用戶就自動為文件分配了文件目錄項,文件目錄項擁有指向下一個文件目錄項的指針和指向文件的指針,具體結構如圖所示(此圖為引用)
此次課程設計雖為設計簡單系統,但我還是堅持花了一個上午的時間在構思完整個系統的全部邏輯模塊后才開始實現。在實現的過程中也遇到了很多問題,最明顯的就是C++指針亂指,鏈式結構在編程時稍不注意就會出現這個問題,但只要每次設計到使用指針的時候多思考全面一些便可以規避這個問題,且及時將臨時申請的內存空間釋放掉是一個很好的編程習慣。
根據題目我所理解的源文件可以進行讀寫保護的意思是:創建文件時可以規定該文件為只讀、只寫和讀寫三種類型的文件。當用戶在文件系統想要對只寫文件進行讀操作時是不允許的,同理當用戶想對只讀文件進行寫操作時也是不允許的。這是我所理解並實現的讀寫保護功能。
面對老師的嚴格要求,我也在很大程度上提升了對自己的要求,力保自己所理解的題意和要求是正確的,不走到彎路跑偏。通過本次課程設計模擬開發了一個小系統,我學到了很多,不僅僅是操作系統這門課上的知識內容,更是程序開發的方方面面的細節,前期准備、中期實現、后期維護,每一步都要為全局考慮,既保證成功實現,也保證邏輯結構緊密,可維護性強,代碼清晰易懂等。同時也提高了我的自信心,想做,去嘗試,就一定能做到!
五、存在問題及改進:
本次我所開發的文件系統僅僅只是個小樣,除了已有功能外,還可以考慮再實現對已保存的本地主目錄、子目錄和活動文件進行讀取的功能,類似於加載存檔的功能,這樣的話在使用完系統后既可以保存創建的文件,下次用戶登錄系統的時候也可以繼續上次的工作狀態。
在后期的話還可以對該文件系統進行可視化,包裝成一個軟件,將通過該軟件創建的文件存儲在一個隱秘的地方,只有通過該軟件才能對文件進行操作等對用戶私人化處理,打造一個私人文件系統。
六:實驗數據及源代碼(學生必須提交自己設計的程序源代碼,並有注釋,源代碼電子版也一並提交),包括思考題的程序。
程序完整代碼請轉至個人GitHub倉庫(如果喜歡,麻煩點個star✨謝謝~)
結語:隨筆僅供參考,千萬不要照抄哦,我相信你可以的~!