模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件_第1頁
模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件_第2頁
模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件_第3頁
模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件_第4頁
模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

年4月19日模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)操作系統(tǒng)大作業(yè)含源文件文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。華南理工大學(xué)“計算機(jī)操作系統(tǒng)”課程設(shè)計大作業(yè)(含答案)一、題目:模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)多用戶、多目錄的文件系統(tǒng)的設(shè)計用VC或Delphi編程模擬文件系統(tǒng)的管理二、目的經(jīng)過OS文件子系統(tǒng)的設(shè)計、增強(qiáng)OS設(shè)計的技巧,達(dá)到提高解決實際OS的設(shè)計能力的提高。三、內(nèi)容多用戶的多級目錄的文件系統(tǒng)設(shè)計。四、功能要求1.多用戶:usr1,usr2,usr3,……,usr8(1-8個用戶)2.多級目錄:可有多級子目錄;3.具有l(wèi)ogin(用戶登錄)4.系統(tǒng)初始化(分配內(nèi)存空間,創(chuàng)立文件卷,初始化根目錄)5.文件的創(chuàng)立:create6.文件的打開:open7.文件的讀:read文件的寫:write9.文件關(guān)閉:close10.刪除文件:delete11.創(chuàng)立目錄(建立子目錄):mkdir12.改變當(dāng)前目錄:cd13.列出文件目錄:dir(包括文件屬性)14.刪除目錄:rmdir15.退出:logout五、實現(xiàn)方法該大作業(yè)是實現(xiàn)一個類似unix的文件系統(tǒng),只需要實現(xiàn)上述功能要求中所列出的功能,代碼中不能調(diào)用OS系統(tǒng)提供的與文件操作和磁盤操作有關(guān)的系統(tǒng)調(diào)用。設(shè)計提示:用內(nèi)存模擬磁盤操作,對文件和目錄的創(chuàng)立、刪除、讀寫都用對內(nèi)存的操作來模擬。文件的屬性信息用內(nèi)存數(shù)據(jù)結(jié)構(gòu)保存;所有文件內(nèi)容和目錄信息保存在內(nèi)存中。文件屬性包括:文件名,所有者,創(chuàng)立時間,最后訪問時間,文件大小,數(shù)據(jù)區(qū)指針或I-node指針等。當(dāng)程序運行結(jié)束時回收內(nèi)存,信息不需要保存到磁盤,下次重新運行程序時重頭開始。六、實驗要求每人完成一份大作業(yè)實驗報告。報告分設(shè)計思想、數(shù)據(jù)定義、處理流程、源程序、運行結(jié)果截圖、設(shè)計體會等部分。給出數(shù)據(jù)定義和詳細(xì)說明;給出實現(xiàn)思想和設(shè)計流程;調(diào)試完成源程序;屏幕觀察運行結(jié)果;總結(jié)自己的設(shè)計體會;編程語言及操作系統(tǒng)平臺不限。七、提交內(nèi)容本大作業(yè)每個人必須單獨完成。最后需提交的內(nèi)容包括:源程序(關(guān)鍵代碼需要注釋說明)、可運行程序、算法思路及流程圖、心得體會。大作業(yè)必須以WORD附件的形式提交。大作業(yè)嚴(yán)禁抄襲。發(fā)現(xiàn)抄襲一律以不及格論。大作業(yè)內(nèi)容要完整,一定要有算法思路、流程圖、心得體會、運行輸出信息截屏等內(nèi)容,如果只提交源代碼則大作業(yè)成績記為不合格。-3-20目錄TOC\o"1-3"\h\z1. 摘要 22. 問題描述 23. 設(shè)計目的 24. 設(shè)計要求 25. 詳細(xì)設(shè)計 25.1界面設(shè)計 35.1算法設(shè)計. 36. 設(shè)計總結(jié) 37.參考文獻(xiàn) 48. 致謝 49. 附錄 22

模擬UNIX文件系統(tǒng)的設(shè)計及實現(xiàn)課程設(shè)計內(nèi)容多用戶的多級目錄的文件系統(tǒng)設(shè)計。概述UNIX采用樹型目錄結(jié)構(gòu),每個目錄表稱為一個目錄文件。一個目錄文件是由目錄項組成的。每個目錄項包含16B,一個輔存磁盤塊(512B)包含32個目錄項。在目錄項中,第1、2字節(jié)為相應(yīng)文件的外存i節(jié)點號,是該文件的內(nèi)部標(biāo)識;后14B為文件名,是該文件的外部標(biāo)識。因此,文件目錄項記錄了文件內(nèi)、外部標(biāo)識的對照關(guān)系。根據(jù)文件名能夠找到輔存i節(jié)點號,由此便得到該文件的所有者、存取權(quán)、文件數(shù)據(jù)的地址健在等信息。UNIX的存儲介質(zhì)以512B為單位劃分為塊,從0開始直到最大容量并順序加以編號就成了一個文件卷,也叫文件系統(tǒng)。UNIX中的文件系統(tǒng)磁盤存儲區(qū)分配圖如下:0#1#2#…K#K+1#K+2#K+3#…n#i節(jié)點區(qū)i節(jié)點區(qū)文件存儲區(qū)引導(dǎo)區(qū)管理區(qū) 本次課程設(shè)計是要實現(xiàn)一個簡單的模擬UNIX文件系統(tǒng)。我們在內(nèi)存中開辟一個虛擬磁盤空間(1MB)作為文件存儲器,并將該虛擬文件系統(tǒng)保存到磁盤上(以一個文件的形式),以便下次能夠再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。文件存儲空間的管理可采用位示圖方法。課程設(shè)計任務(wù)及要求設(shè)計任務(wù)多用戶、多級目錄結(jié)構(gòu)文件系統(tǒng)的設(shè)計與實現(xiàn)。能夠?qū)崿F(xiàn)下列幾條命令login用戶登錄logout退出當(dāng)前用戶dir列文件目錄creat創(chuàng)立文件delete刪除文件open打開文件close關(guān)閉文件read讀文件write寫文件mkdir創(chuàng)立目錄ch改變文件目錄rd刪除目錄樹format格式化文件系統(tǒng)quit退出文件系統(tǒng)設(shè)計要求1)多用戶:usr1,usr2,usr3,……,usr8(1-8個用戶)2)多級目錄:可有多級子目錄;3)具有l(wèi)ogin(用戶登錄)4)系統(tǒng)初始化(建文件卷、提供登錄模塊)5)文件的創(chuàng)立:create(用命令行來實現(xiàn))6)文件的打開:open7)文件的讀:read8)文件的寫:write9)文件關(guān)閉:close10)刪除文件:delete11)創(chuàng)立目錄(建立子目錄):mkdir12)改變當(dāng)前目錄:cd13)列出文件目錄:dir14)退出:logout新增加的功能:15)刪除目錄樹:rd16)格式化文件系統(tǒng):format算法及數(shù)據(jù)結(jié)構(gòu)算法的總體思想本課程設(shè)計是要求我們模擬UNIX文件系統(tǒng)功能設(shè)計一個虛擬文件系統(tǒng),依據(jù)UNIX文件系統(tǒng)的特點,其設(shè)計思想是:申請1M的內(nèi)存空間來虛擬文件系統(tǒng),將其以512B每塊劃分2048塊,采用位示圖管理文件系統(tǒng)的方法,利用其原理將第1塊作為位圖區(qū)(512B),共有對i節(jié)點區(qū)和數(shù)據(jù)塊區(qū)分別建立位圖;每個i節(jié)點占16B,每塊有512/16=32個i節(jié)點,用2、3共兩塊作為i節(jié)點,總共有64個i節(jié)點,在位圖區(qū)占用8B;其余2045塊作為數(shù)據(jù)區(qū)(本課設(shè)要求只用到512塊),在位圖區(qū)占用接近256B(2045位)。文件系統(tǒng)存儲區(qū)分配圖如下:位圖區(qū)i節(jié)點區(qū)數(shù)據(jù)區(qū)位圖:用0表示未使用,1表示使用;i節(jié)點:文件控制塊(FCB),描述文件信息的一個數(shù)據(jù)結(jié)構(gòu);數(shù)據(jù)區(qū):存放用戶數(shù)據(jù),包括目錄文件。位示圖用以反映整個存儲空間的分配情況,由若干字節(jié)構(gòu)成,每個字節(jié)中的每一位對應(yīng)文件存儲器中的一塊,“1”狀態(tài)表示相應(yīng)塊已占用,“0”狀態(tài)表示該塊為空閑。存儲塊分配時,只要把找到的空閑塊所對應(yīng)的位由"0"改為"1",而在釋放時,只要把被釋放的物理塊所對應(yīng)的位由"1"改為"0"即可。分配和釋放都能夠在內(nèi)存的位示圖上完成,而且速度較快。磁盤i節(jié)點利用在內(nèi)存中生成鏈表或者數(shù)組的方法來生成,而且限制磁盤節(jié)點數(shù)的最大值。同樣內(nèi)存i節(jié)點利用鏈表的方法在內(nèi)存中生成。同時在往文件中寫或者讀的時候我們都是對內(nèi)存中有內(nèi)容進(jìn)行讀寫。在該文件系統(tǒng)中,規(guī)定一個文件最多只能占用2個數(shù)據(jù)塊,這兩個數(shù)據(jù)塊能夠是不連續(xù)的,其塊號記錄在一個索引塊中,該索引塊稱為inode結(jié)構(gòu)。讀入一個文件時,先根據(jù)目錄找到相應(yīng)的i節(jié)點號,將i節(jié)點讀入主存i節(jié)點,建立打開文件表指向該主存i節(jié)點,再將文件內(nèi)容讀入主存數(shù)據(jù)區(qū)。系統(tǒng)總體框架圖系統(tǒng)總體流程圖開始開始文件系統(tǒng)是否建立?在內(nèi)存中申請1M內(nèi)存空間將磁盤上的文件系統(tǒng)讀入內(nèi)存YN用戶登錄模塊,輸入用戶名和密碼,能夠在程序中設(shè)定,不用保存在文件系統(tǒng)中用戶名、密碼對嗎?執(zhí)行init(),進(jìn)行初始化操作,進(jìn)入用戶子目錄執(zhí)行command(),對用戶輸入的命令進(jìn)行解析和執(zhí)行。若數(shù)據(jù)被修改或新建立,則保存主存i節(jié)點和數(shù)據(jù)塊的內(nèi)容到內(nèi)存的文件系統(tǒng),并寫回磁盤,保存修改。若輸入錯誤命令則顯示出錯信息。退出用戶(logout)嗎?用戶輸入quit嗎?結(jié)束執(zhí)行format(),建立文件系統(tǒng)NNNYYY各模塊功能說明4.4.1format模塊功能:格式化文件系統(tǒng),即初始化文件系統(tǒng),相當(dāng)于硬盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部還原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設(shè)計的文件系統(tǒng)格式重建新的文件系統(tǒng)。4.4.2get_blknum和release_blk模塊功能:實現(xiàn)i節(jié)點的分配和回收;算法:當(dāng)一個新的文件被建立時,在給該文件分配磁盤存儲區(qū)之前,應(yīng)為該文件分配存放該文件的說明信息的磁盤i節(jié)點。反之,當(dāng)從文件系統(tǒng)中刪除某個文件時,則要首先刪除它的i節(jié)點項。4.4.3功能:進(jìn)入文件系統(tǒng)算法:初始化用戶打開文件系表。在內(nèi)存中申請一個虛擬存儲空間,此空間必須大于或等于可格式化時的空間。將文件系統(tǒng)文件讀入虛擬磁盤。4.4.4功能:退出文件系統(tǒng)函數(shù)quit()算法:將虛擬磁盤內(nèi)容保存到磁盤上。釋放虛擬磁盤所占據(jù)的空間。撤消用用戶打開文件表。4.4.5功能:創(chuàng)立文件用法:creatfilename算法:分配一空目錄項,分配磁盤塊。可用位示圖。填寫該空目錄項。如文件長度(0),文件名,類型等。分配一個用戶打開文件表項,并填寫相關(guān)目錄,讀寫指針=0。4.4.6功能:打開文件open()用法:openfilename算法:if(該文件已打開or該文件不存在)報錯(出錯信息)。分配一個用戶打開文件表項。4.4.7功能:關(guān)閉文件close()用法:closefilename算法:釋放該文件的用戶占據(jù)的內(nèi)存空間。清空該文件的用戶打開文件表目。4.4.8功能:寫文件write(fd,buf,len)用法:writefilename,需要先打開文件。算法:指定寫入內(nèi)容長度。buf。修改打開文件表讀/寫指針。修改目錄項中的文件長度。4.4.9功能:read(fd,buf,len)用法:readfilename,需先打開文件。算法:文件信息.修改讀/寫指針。4.4.10功能:刪除文件delete()用法:deletefilename算法:若文件不存在,報錯?;厥沾疟P空間。回收目錄項。該文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和申明函數(shù)//用戶(20B)typedefstruct{ charuser_name[10]; //用戶名 charpassword[10]; //密碼}User;//i節(jié)點(32B)typedefstruct{ short inum; //文件i節(jié)點號 char file_name[10]; //文件名 char type; //文件類型 charuser_name[10];//文件所有者 short iparent; //父目錄的i節(jié)點號 short length; //文件長度 short address[2]; //存放文件的地址 }Inode;//打開文件表(16B)typedefstruct{ shortinum; //i節(jié)點號 charfile_name[10]; //文件名 shortmode; //讀寫模式(1:read,2:write,3:readandwrite) shortoffset; //偏移量}File_table;//申明函數(shù)voidlogin(void);用戶登錄,如果是新用戶則創(chuàng)立用戶voidinit(void);程序初始化,將所有i節(jié)點讀入內(nèi)存intanalyse(char*);輸入?yún)?shù)分析,分析用戶命令voidsave_inode(int);將num號i節(jié)點保存到虛擬磁盤文件hd.datintget_blknum(void);申請一個數(shù)據(jù)塊voidread_blk(int);將i節(jié)點號為num的文件讀入tempvoidwrite_blk(int);將temp的內(nèi)容寫入hd.dat的數(shù)據(jù)區(qū)voidrelease_blk(int);釋放文件塊號為num的文件占用的空間voidpathset();打印當(dāng)前路徑voiddeltree(intinnum);實現(xiàn)刪除目錄樹函數(shù)intcheck(int);檢查用戶權(quán)限//用戶命令處理函數(shù)voidhelp(void);命令提示幫助函數(shù)voidcd(void);改變當(dāng)前目錄voiddir(void);顯示當(dāng)前目錄下所有文件和目錄voidmkdir(void);創(chuàng)立目錄voidrd(void);刪除目錄voidcreat(void);創(chuàng)立文件voidopen(void);打開voidread(void);讀文件voidwrite(void);寫文件voidclose(void);關(guān)閉文件voiddel(void);刪除文件voidlogout(void);用戶注銷voidcommand(void);命令管理函數(shù)voidformat(void);格式化虛擬磁盤程序設(shè)計與實現(xiàn)主要函數(shù)列表函數(shù)原型功能入口、出口參數(shù)說明voidlogin(void)用戶登陸voidinit(void))程序初始化intanalyse(char*)輸入?yún)?shù)分析命令行字符串voidsave_inode(int)保存i節(jié)點到虛擬磁盤文件i節(jié)點號intget_blknum(void)分配一個磁盤塊voidread_blk(int)讀磁盤快內(nèi)容i節(jié)點號voidwrite_blk(int)寫磁盤塊i節(jié)點號voidrelease_blk(int)釋放一個磁盤塊i節(jié)點號voidpathset();打印當(dāng)前路徑voiddeltree(intinnum);實現(xiàn)刪除目錄樹函數(shù)i節(jié)點號intcheck(int);檢查用戶權(quán)限i節(jié)點號voidhelp(void)命令提示幫助函數(shù)voiddir(void)顯示當(dāng)前目錄下所有文件和目錄voidmkdir(void)創(chuàng)立目錄voidcreat(void)創(chuàng)立文件voidopen(void)打開文件voidread(void)讀文件voidwrite(void)寫文件voidclose(void)關(guān)閉文件voiddel(void)刪除文件voidlogout(void)用戶登出voidcommand(void)命令管理函數(shù)voidrd(void)刪除目錄voidformat(void);格式化虛擬磁盤函數(shù)之間的關(guān)系mainmain()login()init()command()analyse()help()cd()dir()mkdir()creat()open()read()write()close()del()logout()cls()errcmd()format()quit()rd()save_inode()read_blk()get_blknum()write_blk()release_blk()delet()程序流程圖各功能模塊流程圖是否否是否否是提示輸入用戶名和密碼用戶名是否存在創(chuàng)立新用戶讀入用戶信息到內(nèi)存開始密碼是否正確結(jié)束用戶登陸login()讀入位示圖信息到內(nèi)存讀入i節(jié)點信息到內(nèi)存當(dāng)前目錄為根目錄初始化打開文件表結(jié)束開始初始化函數(shù)init() 是是否是是否否遍歷i節(jié)點區(qū)argv[1]=”..”目錄是否存在找到的目錄i節(jié)點號送當(dāng)前目錄inum_cur當(dāng)前目錄的父i節(jié)點號送當(dāng)前目錄inum_cur開始結(jié)束改變當(dāng)前目錄cd()是是否否遍歷i節(jié)點區(qū)i節(jié)點的父節(jié)點是否為當(dāng)前目錄i節(jié)點區(qū)是否遍歷完輸出文件名或目錄名開始結(jié)束顯示目錄dir()是是否是是否否遍歷i節(jié)點區(qū)要創(chuàng)立的目錄是否存在是否有空的i節(jié)點遍歷i節(jié)點區(qū)分配一個目錄i節(jié)點開始結(jié)束創(chuàng)立目錄mkdir()是是否否遍歷i節(jié)點區(qū)要創(chuàng)立的文件是否存在是否有空的i節(jié)點遍歷i節(jié)點區(qū)分配一個文件i節(jié)點開始結(jié)束創(chuàng)立文件creat()是是否是否是否遍歷i節(jié)點區(qū)要打開的文件是否存在提示輸入打開模式將打開文件信息寫入打開文件信息表file_array[]遍歷打開文件表file_array[]文件是否已經(jīng)打開提示輸入開始位置和讀字節(jié)數(shù)調(diào)用讀塊操作,讀出塊內(nèi)字符模式是否為可讀開始結(jié)束開始結(jié)束打開文件open()讀文件read()是是否是否遍歷打開文件表file_array[]文件是否已經(jīng)打開提示輸入寫入字節(jié)數(shù)調(diào)用寫塊操作,寫入塊內(nèi)字符模式是否為可寫是否遍歷打開文件表file_array[]文件是否已經(jīng)打開將打開文件表項標(biāo)志位置-1file_array[i].inum=-1開始結(jié)束寫文件write()開始結(jié)束關(guān)閉文件close()是否遍歷i節(jié)點區(qū)要刪除的文件是否存在是否遍歷i節(jié)點區(qū)要刪除的文件是否存在釋放文件對應(yīng)的i節(jié)點區(qū)inode_array[i].inum=-1釋放兩個磁盤塊文件是否大于的一塊釋放一個磁盤塊是否開始結(jié)束刪除文件del()開始遍歷i節(jié)點區(qū)是待刪除目錄嗎?遍歷子目錄子目錄為空嗎?是文件嗎?是空目錄嗎?結(jié)束調(diào)用delet()刪除目錄或文件是空目錄嗎?刪除目錄樹rd()是是否否否否否是是是是是否遍歷位示圖表查找空閑塊bitmap[]是否有空閑塊分配一塊,將位示圖位置置’1’。返回找到的空閑塊號將位示圖位置置’0’。bitmap[i]='0清空塊內(nèi)容開始結(jié)束分配磁盤塊get_blk()開始結(jié)束釋放磁盤塊release_blk(int)是是否輸出給定i節(jié)點對應(yīng)的第1塊內(nèi)容文件是否大于1塊輸出給定i節(jié)點對應(yīng)的第2塊內(nèi)容是否將緩沖區(qū)buf內(nèi)容寫入第1塊buf內(nèi)容是否大于512字節(jié)將緩沖區(qū)buf的512字節(jié)后面的內(nèi)容寫入第2塊開始結(jié)束寫磁盤塊write_blk(int)開始結(jié)束讀磁盤塊read_blk(int)源程序/*main.c*/#include"head.h"char choice;int argc; //用戶命令的參數(shù)個數(shù)char *argv[5]; //用戶命令的參數(shù)int inum_cur; //當(dāng)前目錄char temp[2*BLKSIZE]; //緩沖區(qū)User user; //當(dāng)前的用戶char bitmap[BLKNUM]; //位圖數(shù)組Inode inode_array[INODENUM]; //i節(jié)點數(shù)組File_tablefile_array[FILENUM]; //打開文件表數(shù)組char image_name[10]="hd.dat"; //文件系統(tǒng)名稱FILE *fp; //打開文件指針//創(chuàng)立映像hd,并將所有用戶和文件清除voidformat(void){FILE*fp;inti;Inodeinode;printf("Willbetoformatfilesystem...\n");printf("WARNING:ALLDATAONTHISFILESYSTEMWILLBELOST!\n");printf("ProceedwithFormat(Y/N)?");scanf("%c",&choice);gets(temp);if((choice=='y')||(choice=='Y')){if((fp=fopen(image_name,"w+b"))==NULL){ printf("Can'tcreatefile%s\n",image_name); exit(-1); } for(i=0;i<BLKSIZE;i++) fputc('0',fp); inode.inum=0; strcpy(inode.file_name,"/"); inode.type='d'; strcpy(inode.user_name,"all"); inode.iparent=0; inode.length=0; inode.address[0]=-1; inode.address[1]=-1; fwrite(&inode,sizeof(Inode),1,fp); inode.inum=-1; for(i=0;i<31;i++) fwrite(&inode,sizeof(Inode),1,fp); for(i=0;i<BLKNUM*BLKSIZE;i++) fputc('\0',fp); fclose(fp); //打開文件user.txt if((fp=fopen("user.txt","w+"))==NULL) { printf("Can'tcreatefile%s\n","user.txt"); exit(-1); } fclose(fp); printf("Filesystemcreatedsuccessful.Pleasefirstlogin!\n");}return;}//功能:用戶登陸,如果是新用戶則創(chuàng)立用戶voidlogin(void){char*p;intflag;charuser_name[10];charpassword[10];charfile_name[10]="user.txt";do{printf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()){if(*p==0x0d)//當(dāng)輸入回車鍵時,0x0d為回車鍵的ASCII碼{*p='\0';//將輸入的回車鍵轉(zhuǎn)換成空格break;}printf("*");//將輸入的密碼以"*"號顯示p++;}flag=0;if((fp=fopen(file_name,"r+"))==NULL){printf("\nCan'topenfile%s.\n",file_name);printf("Thisfilesystemnotexist,itwillbecreate!\n");format();login();}while(!feof(fp)){fread(&user,sizeof(User),1,fp);//已經(jīng)存在的用戶,且密碼正確if(!strcmp(user.user_name,user_name)&&!strcmp(user.password,password)){fclose(fp);printf("\n");return;}//已經(jīng)存在的用戶,但密碼錯誤elseif(!strcmp(user.user_name,user_name)){printf("\nThisuserisexist,butpasswordisincorrect.\n");flag=1;fclose(fp);break;}}if(flag==0)break;}while(flag);//創(chuàng)立新用戶if(flag==0){printf("\nDoyouwanttocreatanewuser?(y/n):");scanf("%c",&choice);gets(temp);if((choice=='y')||(choice=='Y')){strcpy(user.user_name,user_name);strcpy(user.password,password);fwrite(&user,sizeof(User),1,fp);fclose(fp);return;}if((choice=='n')||(choice=='N'))login();}}//功能:將所有i節(jié)點讀入內(nèi)存voidinit(void){inti;if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s.\n",image_name);exit(-1);}//讀入位圖for(i=0;i<BLKNUM;i++)bitmap[i]=fgetc(fp);//顯示位圖//讀入i節(jié)點信息for(i=0;i<INODENUM;i++)fread(&inode_array[i],sizeof(Inode),1,fp);//顯示i節(jié)點//當(dāng)前目錄為根目錄inum_cur=0;//初始化打開文件表for(i=0;i<FILENUM;i++)file_array[i].inum=-1;}//功能:分析用戶命令,將分析結(jié)果填充argc和argv//結(jié)果:0-14為系統(tǒng)命令,15為命令錯誤intanalyse(char*str){inti;chartemp[20];char*ptr_char;char*syscmd[]={"help","cd","dir","mkdir","creat","open","read","write","close","delete","logout","clear","format","quit","rd"};argc=0;for(i=0,ptr_char=str;*ptr_char!='\0';ptr_char++){if(*ptr_char!=''){while(*ptr_char!=''&&(*ptr_char!='\0'))temp[i++]=*ptr_char++;argv[argc]=(char*)malloc(i+1);strncpy(argv[argc],temp,i);argv[argc][i]='\0';argc++;i=0;if(*ptr_char=='\0')break;}}if(argc!=0){for(i=0;(i<15)&&strcmp(argv[0],syscmd[i]);i++);returni;}elsereturn15;}//功能:將num號i節(jié)點保存到hd.datvoidsave_inode(intnum){if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s\n",image_name);exit(-1);}fseek(fp,512+num*sizeof(Inode),SEEK_SET);fwrite(&inode_array[num],sizeof(Inode),1,fp);fclose(fp);}//功能:申請一個數(shù)據(jù)塊intget_blknum(void){inti;for(i=0;i<BLKNUM;i++)if(bitmap[i]=='0')break;//未找到空閑數(shù)據(jù)塊if(i==BLKNUM){printf("Dataareaisfull.\n");exit(-1);}bitmap[i]='1';if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s\n",image_name);exit(-1);}fseek(fp,i,SEEK_SET);fputc('1',fp);fclose(fp);returni;}//功能:將i節(jié)點號為num的文件讀入tempvoidread_blk(intnum){inti,len;charch;intadd0,add1;len=inode_array[num].length;add0=inode_array[num].address[0];if(len>512)add1=inode_array[num].address[1];if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s.\n",image_name);exit(-1);}fseek(fp,1536+add0*BLKSIZE,SEEK_SET);ch=fgetc(fp);for(i=0;(i<len)&&(ch!='\0')&&(i<512);i++){temp[i]=ch;ch=fgetc(fp);}if(i>=512){fseek(fp,1536+add1*BLKSIZE,SEEK_SET);ch=fgetc(fp);for(;(i<len)&&(ch!='\0');i++){temp[i]=ch;ch=fgetc(fp); }}temp[i]='\0';fclose(fp);}//功能:將temp的內(nèi)容輸入hd的數(shù)據(jù)區(qū)voidwrite_blk(intnum){inti,len;intadd0,add1;add0=inode_array[num].address[0];len=inode_array[num].length;if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s.\n",image_name);exit(-1);}fseek(fp,1536+add0*BLKSIZE,SEEK_SET);for(i=0;(i<len)&&(temp[i]!='\0')&&(i<512);i++)fputc(temp[i],fp);if(i==512){add1=inode_array[num].address[1];fseek(fp,1536+add1*BLKSIZE,SEEK_SET);for(;(i<len)&&(temp[i]!='\0');i++)fputc(temp[i],fp);}fputc('\0',fp);fclose(fp);}//功能:釋放文件塊號為num的文件占用的空間voidrelease_blk(intnum){FILE*fp;if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topenfile%s\n",image_name);exit(-1);}bitmap[num]='0';fseek(fp,num,SEEK_SET);fputc('0',fp);fclose(fp);}//功能:顯示幫助命令voidhelp(void){printf("command:\n\helpshowhelpmenu\n\clearclearthescreen\n\cdchangedirectory\n\mkdirmakedirectory\n\creatcreateanewfile\n\openopenaexistfile\n\readreadafile\n\writewritesomethingtoafile\n\closecloseafile\n\deletedeleteaexistfile\n\formatformataexistfilesystem\n\logoutexituser\n\rddeleteadirectory\n\quitexitthissystem\n");}//設(shè)置文件路徑voidpathset(){charpath[50];intm,n;if(inode_array[inum_cur].inum==0)strcpy(path,user.user_name);else{strcpy(path,user.user_name);m=0;n=inum_cur;while(m!=inum_cur){while(inode_array[n].iparent!=m){n=inode_array[n].iparent;}strcat(path,"/");strcat(path,inode_array[n].file_name);m=n;n=inum_cur;}}printf("[%s]@",path);}//功能:切換目錄(cd..或者cddir1)voidcd(void){inti;if(argc!=2){printf("Commandcdmusthavetwoargs.\n");return;}if(!strcmp(argv[1],".."))inum_cur=inode_array[inum_cur].iparent;else{//遍歷i節(jié)點數(shù)組for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&&(inode_array[i].iparent==inum_cur)&&!strcmp(inode_array[i].file_name,argv[1])&&check(i))break;if(i==INODENUM)printf("Thisdirectoryisn'texsited.\n");elseinum_cur=i;}}//功能:顯示當(dāng)前目錄下的子目錄和文件(dir)voiddir(void){inti;intdcount=0,fcount=0;shortbcount=0;if(argc!=1){printf("Commanddirmusthaveoneargs.\n");return;}//遍歷i節(jié)點數(shù)組,顯示當(dāng)前目錄下的子目錄和文件名for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].iparent==inum_cur)){if(inode_array[i].type=='d'&&check(i)){dcount++;printf("%-20s<DIR>\n",inode_array[i].file_name);}if(inode_array[i].type=='-'&&check(i)){fcount++;bcount+=inode_array[i].length;printf("%-20s%12dbytes\n",inode_array[i].file_name,inode_array[i].length);}}printf("\n%dfile(s)%11dbytes\n",fcount,bcount);printf("%ddir(s)%11dbytesFreeSpace\n",dcount,1024*1024-bcount); }//功能:刪除目錄樹(rddir1)voidrd(){inti,j,t,flag=0;if(argc!=2){printf("Commanddeletemusthaveoneargs.\n");return;}for(i=0;i<INODENUM;i++)//查找待刪除目錄if((inode_array[i].inum>0)&&//是否為空(inode_array[i].iparent==inum_cur)&&(inode_array[i].type=='d')&&(!strcmp(inode_array[i].file_name,argv[1]))){chk=check(i);//檢查用戶權(quán)限if(chk!=1){printf("Thisdirectoryisnotyour!\n");return;}elsej=inode_array[i].inum;for(t=0;t<INODENUM;t++){if((inode_array[t].inum>0)&&(inode_array[t].iparent==j)&&(inode_array[i].type=='-'))delet(t);//目錄下有文件則刪除elseif((inode_array[t].inum>0)&&(inode_array[t].iparent==j)&&(inode_array[i].type=='d'))delet(t);//目錄下有空目錄則刪除}if(t==INODENUM)delet(j);//下層目錄為空刪除之}if(i==INODENUM)delet(i);//待刪除目錄為空刪除之return;}//功能:在當(dāng)前目錄下創(chuàng)立子目錄(mkdirdir1)voidmkdir(void){inti;if(argc!=2){printf("commandmkdirmusthavetwoargs.\n");return;}//遍歷i節(jié)點數(shù)組,查找未用的i節(jié)點for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break;if(i==INODENUM){printf("Inodeisfull.\n");exit(-1);}inode_array[i].inum=i;strcpy(inode_array[i].file_name,argv[1]);inode_array[i].type='d';strcpy(inode_array[i].user_name,user.user_name);inode_array[i].iparent=inum_cur;inode_array[i].length=0;save_inode(i);}//功能:在當(dāng)前目錄下創(chuàng)立文件(creatfile1)voidcreat(void){inti;if(argc!=2){printf("commandcreatmusthaveoneargs.\n");return;}for(i=0;i<INODENUM;i++){if((inode_array[i].inum>0)&&(inode_array[i].type=='-')&&!strcmp(inode_array[i].file_name,argv[1])){printf("Thisfileisexsit.\n");return;}}for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break;if(i==INODENUM){printf("Inodeisfull.\n");exit(-1);}inode_array[i].inum=i;strcpy(inode_array[i].file_name,argv[1]);inode_array[i].type='-';strcpy(inode_array[i].user_name,user.user_name);inode_array[i].iparent=inum_cur;inode_array[i].length=0;save_inode(i);}//功能:打開當(dāng)前目錄下的文件(openfile1)voidopen(){inti,inum,mode,filenum,chk;if(argc!=2){printf("commandopenmusthaveoneargs.\n");return;}for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='-')&&!strcmp(inode_array[i].file_name,argv[1]))break;if(i==INODENUM){printf("Thefileyouwanttoopendoesn'texsited.\n");return;}inum=i;chk=check(i);if(chk!=1){printf("Thisfileisnotyour!\n");return;}printf("Pleaseinputopenmode:(1:read,2:write,3:readandwrite):");scanf("%d",&mode);gets(temp);if((mode<1)||(mode>3)){printf("Openmodeiswrong.\n");return;}for(i=0;i<FILENUM;i++)if(file_array[i].inum<0)break;if(i==FILENUM){printf("Thefiletableisfull,pleaseclosesomefile.\n");return;}filenum=i;file_array[filenum].inum=inum;strcpy(file_array[filenum].file_name,inode_array[inum].file_name);file_array[filenum].mode=mode;file_array[filenum].offset=0;printf("Openfile%sby",file_array[filenum].file_name);if(mode==1)printf("readonly.\n");elseif(mode==2)printf("writeonly.\n");elseprintf("readandwrite.\n");}//功能:從文件中讀出字符(readfile1)voidread(){inti,start,num,inum;if(argc!=2){printf("commandreadmusthaveoneargs.\n");return;}for(i=0;i<FILENUM;i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1]))break;if(i==FILENUM){printf("Open%sfirst.\n",argv[1]);return;}elseif(file_array[i].mode==2){printf("Can'tread%s.\n",argv[1]);return;}inum=file_array[i].inum;printf("Thelengthof%s:%d.\n",argv[1],inode_array[inum].length);if(inode_array[inum].length>0){printf("Thestartposition:"); scanf("%d",&start); gets(temp);if((start<0)||(start>=inode_array[inum].length)){printf("Startpositioniswrong.\n");return;}printf("Thebytesyouwanttoread:");scanf("%d",&num);gets(temp);if(num<=0){printf("Thenumyouwanttoreadiswrong.\n");return;}read_blk(inum); for(i=0;(i<num)&&(temp[i]!='\0');i++)printf("%c",temp[start+i]);printf("\n");}}//功能:向文件中寫入字符(writefile1)voidwrite(){inti,inum,length;if(argc!=2){printf("Commandwritemusthaveoneargs.\n");return;}for(i=0;i<FILENUM;i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1]))break;if(i==FILENUM){printf("Open%sfirst.\n",argv[1]);return;}elseif(file_array[i].mode==1){printf("Can'twrite%s.\n",argv[1]);return;}inum=file_array[i].inum;printf("Thelengthof%s:%d\n",inode_array[inum].file_name,inode_array[inum].length);if(inode_array[inum].length==0){printf("Thelengthyouwanttowrite(0-1024):");scanf("%d",&length);gets(temp);if((length<0)&&(length>1024)){printf("Inputwrong.\n");return;}inode_array[inum].length=length;inode_array[inum].address[0]=get_blknum();if(length>512)inode_array[inum].address[1]=get_blknum();save_inode(inum);printf("Inputthedata(Entertoend):\n");gets(temp);write_blk(inum);}elseprintf("Thisfilecan'tbewritten.\n");}//功能:關(guān)閉已經(jīng)打開的文件(closefile1)voidclose(void){inti;if(argc!=2){printf("Commandclosemusthaveoneargs.\n");return;}for(i=0;i<FILENUM;i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1]))break;if(i==FILENUM){printf("Thisfiledoesn'tbeopened.\n");return;}else{file_array[i].inum=-1;printf("Close%ssuccessful!\n",argv[1]);}}//刪除目錄樹voiddelet(intinnum){/*intchk;chk=check(innum);if(chk!=1){//printf("Thisdirectoryisnotyours!\n");return;}*/inode_array[innum].inum=-1;if(inode_array[innum].length>=0){release_blk(inode_array[innum].address[0]);if(inode_array[innum].length>=512)release_blk(inode_array[innum].address[1]);}save_inode(innum); }//功能:刪除文件(deletefile1)voiddel(void){inti,chk;if(argc!=2){printf("Commanddeletemusthaveoneargs.\n");return;}for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='-')&&!strcmp(inode_array[i].file_name,argv[1]))break;if(i==INODENUM){printf("Thisfiledoesn'texist.\n");return;}chk=check(i);if(chk!=1){printf("Thisfileisnotyour!\n");return;}/*inode_array[i].inum=-1;if(inode_array[i].length>0){release_blk(inode_array[i].address[0]);if(inode_array[i].length>512)release_blk(inode_array[i].address[1]);}save_inode(i);*/delet(i); }//功能:退出當(dāng)前用戶(logout)voidlogout(){charchoice;printf("Doyouwanttoexitthisuser(y/n)?");scanf("%c",&choice);gets(temp);if((choice=='y')||(choice=='Y')){printf("\nCurrentuserexited!\nPleasetologinbyotheruser!\n");login();}return;}//檢查當(dāng)前I節(jié)點的文件是否屬于當(dāng)前用戶intcheck(inti){intj;char*uuser,*fuser;uuser=user.user_name;fuser=inode_array[i].user_name;j=strcmp(fuser,uuser);if(j==0)return1;elsereturn0;}//功能:退出文件系統(tǒng)(quit)voidquit(){charchoice;printf("Doyouwanttoexist(y/n):");scanf("%c",&choice);gets(temp);if((choice=='y')||(choice=='Y'))exit(0);}//功能:顯示錯誤voiderrcmd(){printf("CommandError!!!\n");}//清空內(nèi)存中存在的用戶名free_user(){inti;for(i=0;i<10;i++)user.user_name[i]='\0';}//功能:循環(huán)執(zhí)行用戶輸入的命令,直到logout//"help","cd","dir","mkdir","creat","open","read","write","close","delete","logout","clear","format","quit","rd"voidcommand(void){charcmd[100];system("cls");do{pathset();gets(cmd);switch(analyse(cmd)){case0: help();break;case1:cd();break; case2: dir(); break; case3: mkdir(); break; case4: creat(); break; case5: open(); break; case6: read(); break;case7: write(); break; case8: close(); break; case9: del(); break; case10: logout(); break; case11: system("cls");break;case12:format();init();free_user();login();break;case13:quit();break;case14:rd();break;case15:errcmd();break;default:break;}}while(1);}//主函數(shù)intmain(void){login(); init();command();return0;}/*head.h*/#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#defineBLKSIZE512 //數(shù)據(jù)塊的大小#defineBLKNUM512 //數(shù)據(jù)塊的塊數(shù)#defineINODESIZE32 //i節(jié)點的大小#defineINODENUM32 //i節(jié)點的數(shù)目#defineFILENUM8 //打開文件表的數(shù)目//用戶(20B)typedefstruct{charuser_name[10]; //用戶名charpassword[10]; //密碼}User;//i節(jié)點(32B)typedefstruct{shortinum;//文件i節(jié)點號charfile_name[10];//文件名chartype;//文件類型charuser_name[10];//文件所有者shortiparent;//父目錄的i節(jié)點號shortlength;//文件長度shortaddress[2];//存放文件的地址 }Inode;//打開文件表(16B)typedefstruct{shortinum; //i節(jié)點號charfile_name[10];//文件名shortmode; //讀寫模式(1:read,2:write,//3:readandwrite)shortoffset;//偏移量}File_table;//申明函數(shù)voidlogin(void);voidinit(void);intanalyse(char*);voidsave_inode(int);int get_blknum(void);voidread_blk(int);voidwrite_blk(int);voidrelease_blk(int);voidpathset();voiddelet(intinnum);intcheck(inti);//用戶命令處理函數(shù)voidhelp(void);voidcd(void);voiddir(void);voidmkdir(void);voidcreat(void);voidopen(void);voidread(void);voidwrite(void);voidclose(void);voiddel(void);voidlogout(void);voidcommand(void);voidrd();voidquit();使用說明1.本程序首次運行(假設(shè)當(dāng)前硬盤目錄下還未建立user.txt和hd.dat文件)時會提示找不到u

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論