模擬文件系統實驗報告.doc
《模擬文件系統實驗報告.doc》由會員分享,可在線閱讀,更多相關《模擬文件系統實驗報告.doc(17頁珍藏版)》請在裝配圖網上搜索。
操作系統大型試驗 實 驗 報 告 姓名:XX 班級:軟件工程110x 學號:201126630xxx 一、名稱 操作系統大型試驗。 二、目的 用C++編寫出一個簡單的模擬文件系統,實現目錄的添加、刪除、重命名,文件的添加、刪除、重命名、文件和目錄、文件的拷貝。 三、要求 開發(fā)工具:word,vc win32api 1.設計和實現一個簡單的文件系統,要求包括目錄、普通文件和文件的存儲 2.文件系統的目錄結構采用類似Linux的樹狀結構; 3.要求模擬的操作包括: a)目錄的添加、刪除、重命名; b)目錄的顯示(列表) c)文件的添加、刪除、重命名 d)文件和目錄的拷貝 4.用戶進入時顯示可用命令列表;用戶輸入help時顯示所有命令的幫助文檔; 輸入某個命令+?時顯示該條命令的使用說明 5.用戶輸入exit時退出該系統 6.實驗實現基于windows平臺; 7.實驗開發(fā)語言可以選用C/c++等 四、設計 1.主要思路說明 本模擬系統通過一個大小固定的數組要代表物理盤塊,假設共有1024塊,新增目錄占一塊,新增文件占一塊,文件中可輸入內容,內容假設定義為5個字符占一塊,超出則應新申請空間。模擬物理盤塊的數組中,數組內容為-99代表改物理盤塊內容為空,可使用,其他數字均代表該物理盤塊被占用,其中-3代表是占用文件的末結點,其他整數代表是文件內容的下一個尋址下標,另有一個string類型的數組來存儲內容,模擬文件寫入了對應下標的物理盤塊中。設置了一個全局指針指向根結點,一個全局指針指向當前操作目錄。搜索空白物理盤塊時采用順序搜索物理盤塊數組。存儲形式主要采用類似二叉樹結構,如目錄為根,目錄下的第一個文件或目錄存在根的子節(jié)點,目錄下的其他文件或目錄存在第一個文件或目錄的兄弟節(jié)點,以此類推。 本程序僅seperate()函數使用現成代碼,此函數功能為將輸入命令串分離,僅僅起到美觀作用,其余所有代碼均為原創(chuàng)! 2.申優(yōu)功能: 1)能實現動態(tài)增長,即當輸入文件的內容大小大于分配的模擬物理盤塊時系統能夠自動尋找空物理盤塊并分配,將超出的內容保存在新的物理盤塊中,若超出模擬磁盤大小,則超出部分不保存且返回提示。 2)能實現級聯刪除,即當刪除目錄(文件夾)時,目錄下的所有內容也應當刪除并正確釋放物理盤塊空間。 3)能實現目錄的復制,即復制目錄時(文件夾)時,該目錄下的所有文件和目錄也應準確復制至目標目錄中,并正確分配物理盤塊空間。 3.主要函數和類的定義 1)主要函數定義 #define show_bnum 20 //顯示物理盤塊的塊數 #define block_size 1024 //物理盤塊塊數 int block[block_size]; //假設有block_size塊物理盤塊 string content[block_size]; //存放文件內容 int Msize=5; //此處為模擬磁盤大小為輸入5個字符 fnode *root=new fnode("WP:",0,0); //設置根目錄 fnode *current_path=new fnode(); //當前路徑 fnode *seek_flag=new fnode(); //作為查找標志 fnode *cp_flag=new fnode(); //作為復制的位置標志 void initialize(); //初始化 int seekTarget(string name); //搜索文件或目錄 int seek_log(string name); //搜索目錄 void delete_node(string name); //刪除節(jié)點 int freeblock(fnode *); //釋放物理盤塊 int seekfreeblock(); //搜索可用物理盤塊 void show_current_path(); //顯示當前路徑 void add_file(string name,int t); //增加目錄、文件 void show_curpath_all(); //顯示當前目錄下的所有文件 void rename_file(string Oname,string Nname); //重命名 void seperate(); //分離命令 void cd(); //進入目錄 void add_File(); //增加文件功能入口 void add_Log(); //增加目錄功能入口 void delete_file(); //刪除文件或目錄功能入口 void show_memory(); //顯示物理盤塊占用情況 void re_name(); //重命名功能入口 void help(); //查看幫助 void show_content(); //查看文件內容 void write_file(); //寫文件 void Clear_(); //清屏 void Exit(); //退出 void cp(); //復制功能入口 void cp_log(fnode *target,fnode *source); //復制目錄 void cp_file(fnode *target,fnode *source); //復制文件 void cp_node(fnode *target,fnode *source); //復制節(jié)點 int find_target_log(); //找到復制的目標目錄 int calculate_logsizeMain(fnode *); //計算目錄大小 int calculate_logsize(fnode *); 2)文件節(jié)點類的定義: class fnode { public: string filename; //文件名 int type; //文件類型,1為普通文件,0為目錄文件 fnode *parent; //父節(jié)點 fnode *child; //子節(jié)點 fnode *brother; //兄弟節(jié)點 int block_num; //表示占用的物理盤塊塊號 int isBro; //表示是否是在同級目錄下,0表示不是,1表示是 int isCld; //是否為目錄下第一個節(jié)點,1表示是,0表示不是 fnode() //初始化 { type=-1; parent=NULL; child=NULL; brother=NULL; block_num=-1; isBro=0; isCld=0; } fnode(string n,int t,int b) //根節(jié)點初始化 { type=t; filename=n; parent=NULL; child=NULL; brother=NULL; block_num=b; block[block_num]=-3; isBro=0; isCld=0; } fnode(fnode *p,string name,int t,int b) //文件節(jié)點初始化 { parent=p; filename=name; type=t; child=NULL; brother=NULL; block_num=b; block[block_num]=-3; isBro=0; isCld=0; } void copy(fnode *cp) //拷貝函數 { filename=cp->filename; type=cp->type; parent=cp->parent; child=cp->child; brother=cp->brother; block_num=cp->block_num; } }; 4.命令: 命令 解釋 echo echo命令可以在當前目錄下創(chuàng)建一個文件,具體格式:echo+name md md命令可以在當前目錄下創(chuàng)建一個目錄文件,具體格式:md+name del del命令可以在當前目錄下刪除一個已存在的文件或目錄(支持級聯刪除),具體格式:del+name cd cd命令可以進入下一級目錄或返回上級目錄、根目錄,具體格式:cd+name或cd+.或cd+.. cp cp命令可以復制當前目錄下一個指定的文件或目錄至指定的目錄,具體格式:cp+name+road dir dir命令可以顯示當前目錄下的所有文件和目錄,具體格式:del ren ren命令可以重命名一個存在于當前目錄下的文件或目錄,具體格式:ren+name +new name typ typ命令可以查看當前目錄下一個文件的內容,具體格式:typ+name wrt wrt命令可以在當前目錄下寫內容至一個已存在的文件,具體格式:wrt+name +content mem mem命令可以查看模擬物理盤塊的使用情況,具體格式:mem cls cls命令為清屏命令,具體格式:cls exit exit命令為退出命令,具體格式:exit 五、關鍵技術流程圖及說明 提示:若圖中文字無法看清,可用Micorsoft Visio打開壓縮包下“部分程序流程圖”文件夾的繪圖文件查看。 1.增加文件或目錄(此功能比較簡單,流程圖寫的較詳細就不做說明): 2.刪除目錄(實現級聯刪除): 說明:刪除目錄時刪除文件和刪除目錄本身放在同一個函數中,刪除目錄下的所有文件放在freeblock函數里,這樣比較好處理。下面給只給出遞歸函數的流程圖。 3.將內容寫入文件(實現動態(tài)增長): 說明:圖中Msize為模擬規(guī)定的文件塊字符串大小,比如Msize=5,那么一個物理盤塊只能存5個字符,超出則要申請新的空間。主要采用雙重循環(huán)方法寫入,外層循環(huán)為需要的塊數,內層循環(huán)為Msize,用string累加字符串內容,內層循環(huán)退出后新申請一個空間并將對應下標賦給上一個物理盤塊數組,再將對應內容存入content(為string類型的數組,模擬存儲內容)數組中,直至退出外層循環(huán)。 4.復制目錄: 說明:這里和刪除目錄一樣,寫了兩個復制函數,這樣寫同樣因為遞歸調用是比較方便,第一個函數傳入參數為目標目錄指針和被復制的目錄的指針,第一個函數里新建了一個階段復制被復制的目錄的內容,然后將新建節(jié)點的子節(jié)點和被復制目錄的子結點傳入下一個遞歸調用函數(因為目錄的內容存于目錄的子節(jié)點,與兄弟節(jié)點無關),第二個函數就是遞歸調用函數cp_node,下面就只給出cp_node的流程圖(復制之前同樣進行了路徑的判誤操作,內存大小的判斷操作,是否重名的判斷操作,被復制目錄是否存在判斷操作,這些操作在遞歸函數之前完成,所以下面的遞歸函數不體現這些操作)。 六、運行結果 1.主界面展示: 圖:主界面展示 2.help命令展示: 圖:help命令展示 3.echo命令展示: 圖:echo命令展示 4.del命令展示: 圖:del命令展示-普通刪除 說明:創(chuàng)建了目錄log1,在log1中創(chuàng)建一系列文件和目錄,磁盤使用情況顯示已分配,實用del刪除命令后查看磁盤分配證明級聯刪除是可靠的。 圖:del命令展示-級聯刪除 5.md命令展示: 圖:md命令展示 6.cd命令展示: 說明:圖中展示了cd+name、cd+.、cd+..三種cd命令的使用和判別情況。 圖:cd命令展示 7.dir命令展示: 圖:dir命令展示 8.typ命令展示: 圖:typ命令展示 9.ren命令展示: 圖:ren命令展示 10.wrt命令展示: 圖:wrt命令展示 說明:此處為了實驗方便,將磁盤大小限定為5,每塊磁盤輸入的字符數限2,輸入的內容112233445566778899需要9塊磁盤塊,而磁盤塊為5,根目錄占用一塊,只能輸入4塊大小的內容,即11223344,所有文件file只寫入了11223344 。 圖:wrt動態(tài)增長展示 11.mem命令展示: 圖:mem命令展示 12.cls命令展示: 圖:cls命令展示-1 圖:cls命令展示-2 13.cp命令展示: 說明:圖中根目錄(WP:)下創(chuàng)建了目錄a(md a)、目錄b(md b),在a目錄下創(chuàng)建了b目錄(md b),在b目錄中創(chuàng)建了文件a(echo a)、目錄c(md c),文件a中輸入1111122222(wrt a 111112222)內容代表占了兩塊物理盤塊(程序中Msize模擬大小,設為5個字符了),再進入目錄c(cd c),c中先創(chuàng)建目錄f(md f)再創(chuàng)建文件g(與之前創(chuàng)建順序不同說明程序在不同情況下能正常運行),在g中輸入5個3,5個2,5個1(wrt g 333332222211111)代表占用3塊物理盤塊空間,再返回目錄a(cd . cd .),將目錄a下的目錄b復制給目錄WP下的目錄c(cp b WP:\c),再將目錄a中的目錄b刪除(del b證明的確是復制而非簡單指針指向),進入WP下的目錄c查看剛復制的內容(dir)。物理盤塊使用情況中第一個-3為根目錄占用,第二個-3是目錄a,第三個-3是目錄c,接下來的8個-99是目錄a中原目錄b占用的空間(此處證明刪除是可靠的),圖中顯示目錄c中確實成功復制了目錄b及目錄下的所有內容(使用dir命令查看)。 圖:cp命令展示 14.exit命令展示: 圖:exit命令展示 15.綜合展示: 說明:echo a在根目錄(WP:)下創(chuàng)建了文件a,md b在根目錄(WP:)下創(chuàng)建了目錄b,dir顯示根目錄下的所有文件和目錄,wrt a aaaaabbbbbccccc在文件a中輸入了一串內容,typ a顯示文件a中的內容,cd b進入目錄b,md a在目錄b下創(chuàng)建了目錄a,cd a進入目錄a,cd .返回目錄b,cd .返回根目錄WP:,ren b newname將目錄b重命名為newname,mem顯示內存情況,第一個-3代表根節(jié)點占用,第二個3代表文件a占用且下一塊盤塊下標為3,第三個-3代表目錄b占用,之后的4代表被文件a占用且的下一塊盤塊的尋找下標為4,下一個-3代表文件a的末盤塊,下一個-3代表目錄b內的目錄a占用,del a在根目錄WP:下刪除文件a,mem查看物理盤塊實驗情況,圖中顯示原文件a占用的內存空間已經變?yōu)?99,代表成功刪除a并釋放磁盤空間(-99代表磁盤空間空閑可用),dir顯示根目錄WP:下所有文件和目錄,顯示只有newname,則證明重命名和刪除操作是成功的。 圖:綜合展示 七、心得體會和調試中遇到的問題及解決辦法 編寫調試過程中遇到許多問題,一類是指針指向空還繼續(xù)操作造成程序停止運行,經檢查后修改正確,一類是邏輯上出現錯誤導致級聯刪除或者目錄復制出錯,經改正后成功實現。 主要的難點在于兄弟結點和子結點的處理,所以再程序中引入了isBro這個標志位來判斷是否是兄弟結點即與父節(jié)點是否在同級目錄,若不在同級目錄則父節(jié)點為真父節(jié)點(是指向本目錄而非本目錄中上個文件)。還有一個難點是在進行遞歸調用刪除或復制目錄時發(fā)現處理目錄和目錄下的內容不太合適放在同一個遞歸程序中,所以單獨寫了兩個函數處理目錄的復制或刪除,然后對應兩個遞歸程序處理目錄下的所有內容。 實驗總結及有待改進的問題。 因為時間比較緊張,在幾門考試中抽空寫了這個小程序,所以并沒有實現存盤,另因為對輸入命令字符串的處理上有點瑕疵,所有在寫文件內容中只能寫入連續(xù)的字符串(中間不能插入空格),否則會被判定為命令輸入錯誤,并且只實現了文件的寫入,不能修改或插入,有待改進。沒有實現目錄樹的展示,只能顯示目錄下所有文件,有待改進。但相信時間再充裕一些這些小問題都能很好地解決。 八、源代碼 在壓縮包內“源代碼”文件夾內。- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 模擬 文件系統 實驗 報告
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://kudomayuko.com/p-9428828.html