操作系統(tǒng)實(shí)驗(yàn)報(bào)告-文件管理系統(tǒng)-源程序_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-文件管理系統(tǒng)-源程序_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-文件管理系統(tǒng)-源程序_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-文件管理系統(tǒng)-源程序_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-文件管理系統(tǒng)-源程序_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

操作系統(tǒng)實(shí)驗(yàn)報(bào)告操作系統(tǒng)實(shí)驗(yàn)報(bào)告題目: 文件管理系統(tǒng)班級(jí):目錄一、 實(shí)踐內(nèi)容 31.1實(shí)驗(yàn)內(nèi)容 32.實(shí)驗(yàn)原理 43、實(shí)驗(yàn)要求 4二、 實(shí)驗(yàn)的目的及意義 4三、 詳細(xì)設(shè)計(jì) 53.1功能設(shè)計(jì) 53.2結(jié)構(gòu)設(shè)計(jì) 63.3核心算法 113.4數(shù)據(jù)結(jié)構(gòu) 11四、調(diào)試分析 134.1運(yùn)行環(huán)境 134.2調(diào)試分析 13五、缺點(diǎn)及改進(jìn) 135.1實(shí)驗(yàn)缺點(diǎn) 135.2實(shí)驗(yàn)改進(jìn) 13六、實(shí)驗(yàn)總結(jié) 13七、參考文獻(xiàn) 14八、附錄 148.1個(gè)人心得 148.2源程序 15實(shí)踐內(nèi)容1.1實(shí)驗(yàn)內(nèi)容通過(guò)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)設(shè)計(jì),加深對(duì)文件系統(tǒng)的內(nèi)部功能以及內(nèi)部實(shí)現(xiàn)的理解。要求模擬采用二級(jí)目錄結(jié)構(gòu)的磁盤(pán)文件系統(tǒng)的文件操作能實(shí)現(xiàn)以下幾條命令,用輸入命令來(lái)模擬用戶程序中調(diào)用的文件操作:Login用戶登錄用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對(duì)密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。format格式化初始化超級(jí)塊,初始化主目錄,初始化管理員admin目錄,初始化用戶目錄,初始化用戶passwd文件。create創(chuàng)建文本文件查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請(qǐng)硬盤(pán)空間,申請(qǐng)失敗則結(jié)束。將文件內(nèi)容寫(xiě)入硬盤(pán)空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)塊。cdir創(chuàng)建文件夾查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請(qǐng)硬盤(pán)空間,申請(qǐng)失敗則結(jié)束。將文件夾內(nèi)容寫(xiě)入硬盤(pán)空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)塊,寫(xiě)入模擬硬盤(pán)。readedit讀取和追加文本文件Read查找當(dāng)前目錄下是否該文件,沒(méi)有則退出,否則調(diào)用access()權(quán)限判斷,有權(quán)限則判斷是不是文件,不是則退出,是文件則讀取文件并顯示。Edit調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個(gè)硬盤(pán)分配空間則申請(qǐng)分配空間,失敗則退出,申請(qǐng)成功則保存文件。access(文件名)權(quán)限判斷,先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的硬盤(pán)空間找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見(jiàn)級(jí)別。如果是該用戶創(chuàng)建的則有讀寫(xiě)權(quán)限如果當(dāng)前用戶是管理員組的也具有讀寫(xiě)權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。cd進(jìn)入子目錄或上級(jí)目錄,查找當(dāng)前目錄是否有該子目錄,沒(méi)有則退出,調(diào)用access()判斷當(dāng)前用戶是否有權(quán)限,無(wú)則退出,有則讀取該子目錄的目錄,將當(dāng)前目錄指向該目錄。attr(文件名)查看文件或者文件夾的屬性,先查找當(dāng)前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰(shuí)創(chuàng)建,屬于什么組,占用的空間和目錄。將其全部顯示出來(lái)。Del刪除文件或目錄。查找當(dāng)前目錄是否有該文件名,沒(méi)有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無(wú)法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無(wú)法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修改當(dāng)前文件夾目錄和硬盤(pán)空間結(jié)構(gòu),修改超級(jí)塊,寫(xiě)入模擬硬盤(pán)。Dir列文件目錄(列出文件名、物理地址、保護(hù)碼和文件長(zhǎng)度)2.實(shí)驗(yàn)原理文件系統(tǒng)管理中用到的數(shù)據(jù)結(jié)構(gòu)有:(1)首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動(dòng)文件等。主目錄和子目錄都以文件的形式存放于磁盤(pán),這樣便于查找和修改。(2)用戶創(chuàng)建的文件,可以編號(hào)存儲(chǔ)于磁盤(pán)上。如:file0,file1,file2…并以編號(hào)作為物理地址,在目錄中進(jìn)行登記。3、實(shí)驗(yàn)要求(1)設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打開(kāi)5個(gè)文件。(2)程序采用二級(jí)文件目錄(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開(kāi)文件設(shè)置了運(yùn)行文件目錄(AFD)。(3)為了便于實(shí)現(xiàn),對(duì)文件的讀寫(xiě)作了簡(jiǎn)化,在執(zhí)行讀寫(xiě)命令時(shí),只需改讀寫(xiě)指針,并不進(jìn)行實(shí)際的讀寫(xiě)操作。(4)文件保護(hù)簡(jiǎn)單使用了三位保護(hù)碼:允許讀寫(xiě)執(zhí)行、對(duì)應(yīng)位為1,對(duì)應(yīng)位為0,則表示不允許讀寫(xiě)、執(zhí)行。實(shí)驗(yàn)的目的及意義課程設(shè)計(jì)目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。通過(guò)模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識(shí),加深對(duì)教材中的重要算法的理解。同時(shí)通過(guò)編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識(shí)的能力。詳細(xì)設(shè)計(jì)3.1功能設(shè)計(jì)Help 顯示命令幫助dir 顯示當(dāng)前目錄下的文件和文件夾logout 注銷exit 退出系統(tǒng)create[文件名] 創(chuàng)建文本文件cdir[目錄名] 創(chuàng)建文件夾read[文件名] 讀取一個(gè)文件最多可同時(shí)讀取五個(gè)close[文件名] 關(guān)閉一個(gè)文件edit[文件名] 編輯一個(gè)文件cd[目錄名] 進(jìn)子目錄或者上級(jí)目錄attr[文件名] 顯示該文件的屬性del[文件名] 刪除文件rename[文件名] 重命名3.2結(jié)構(gòu)設(shè)計(jì)1)總設(shè)計(jì)結(jié)構(gòu)圖 2)目錄結(jié)構(gòu)示意圖3)流程圖 編輯功能流程圖 創(chuàng)建文件流程圖刪除文件功能流程圖 3.3核心算法boolFormat(void); //格式化boolinstall(void); //裝載虛擬硬盤(pán)的數(shù)據(jù)voidlogin(void); /用戶登陸voidshowMenu(void);//顯示功能菜單boolonAction(void);//用戶選擇功能并執(zhí)行voidshowDir();//顯示當(dāng)前文件夾里面文件的信息voidlogout();//注銷voidcreateFile(stringstr);//創(chuàng)建文件voidcreateDir(stringstr);//創(chuàng)建文件夾boolread(stringstr);//讀取文件voideditFile(stringstr);//編輯文件intvisit(stringstr);//打開(kāi)一個(gè)文件夾voidattrib(stringstr);//顯示文件屬性voidDelete(stringstr);//刪除一個(gè)文件intrename(stringstr);//重命名一個(gè)文件3.4數(shù)據(jù)結(jié)構(gòu)/*常變量*/constunsignedintBLOCK_SIZE=512; //塊長(zhǎng)constunsignedintDATA_BLOCK_NUM=512; //數(shù)據(jù)塊數(shù)量constunsignedintDINODE_START=4*BLOCK_SIZE; //inode起始位置constunsignedintDINODE_SIZE=512; //inode大小constunsignedintDINODE_NUM=32; //inode數(shù)量constunsignedintDATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //數(shù)據(jù)區(qū)的開(kāi)始地址constunsignedintACCOUNT_NUM=10; //用戶數(shù)量/*inode結(jié)構(gòu)體*/structinode{ unsignedshortdi_tag; /*inode標(biāo)識(shí)*/ unsignedshortdi_number; /*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件,如一個(gè)目錄至少包含兩個(gè)文件:"."和".."*/ unsignedshortdi_mode; /*存取模式:0為目錄,1為文件*/ unsignedshortdi_userID; /*當(dāng)前inode所屬用戶0為根目錄ID,一次下去是管理員目錄、用戶目錄*/ unsignedshortdi_access; /*訪問(wèn)權(quán)限0為不允許普通用戶訪問(wèn)(公共目錄),1為允許普通用戶訪問(wèn)*/ unsignedshortdi_size; /*文件大小,目錄沒(méi)有大小,值為0*/ unsignedshortdi_ctime;/*創(chuàng)建時(shí)間*/ unsignedshortdi_mtime;/*最后一次修改時(shí)間*/ unsignedshortdi_block[DATA_BLOCK_NUM];/*數(shù)據(jù)塊塊地址編號(hào)*/};/**超級(jí)塊***/structsuper_block{ unsignedshorts_inodes_count;/*文件系統(tǒng)中inode的總數(shù)*/ unsignedshorts_blocks_count;/*數(shù)據(jù)塊總數(shù)*/ unsignedshorts_r_blocks_count;/*保留塊總數(shù)*/ unsignedshorts_free_blocks_count;//空閑塊總數(shù) unsignedshorts_free_inodes_count;/*空閑的inode總數(shù)*/ unsignedshorts_log_block_size;/*block的大小*/};/**賬戶信息**/structuser{ unsignedshortuser_id; //用戶ID unsignedshortuser_access; //權(quán)限 stringusername; //用戶名 stringpassword; //密碼};/**文件/目錄結(jié)構(gòu)**/structdirectory{ stringname; /*目錄名*/ unsignedshortd_ino; /*目錄號(hào)*/};四、調(diào)試分析4.1運(yùn)行環(huán)境 編譯平臺(tái):MicrosoftVisualStudio2010 運(yùn)行平臺(tái):win7/xp4.2調(diào)試分析五、缺點(diǎn)及改進(jìn)5.1實(shí)驗(yàn)缺點(diǎn) 由于對(duì)Linux的文件系統(tǒng)理解不夠深刻,導(dǎo)致程序在一些原理上的迷糊不清,而時(shí)間較短,因此采取了簡(jiǎn)化或者放開(kāi)的方法。在寫(xiě)程序的開(kāi)始,也沒(méi)有做詳細(xì)的規(guī)劃,而且是四個(gè)人分工協(xié)作,因此在程序的結(jié)構(gòu)上有些混亂。在后期做了一些調(diào)整,但是整體還是有缺陷的。另外,程序只是很簡(jiǎn)單的模擬了Linux的文件管理系統(tǒng),只有一些非常簡(jiǎn)單的功能,而且功能考慮的也不盡全面、嚴(yán)謹(jǐn),難免會(huì)出現(xiàn)一些Bug,另外,我們整體在寫(xiě)的時(shí)候是用的C++的寫(xiě)法,但是在編寫(xiě)的時(shí)候,又混用了c的一些方法,所以,整個(gè)程序更加混亂,給閱讀理解帶來(lái)非常大的困難。5.2實(shí)驗(yàn)改進(jìn) 首先,我們先要把一些原理知識(shí)搞清楚,其次,做一個(gè)統(tǒng)一的項(xiàng)目規(guī)劃,做好一些定義的聲明,結(jié)構(gòu)再清晰一些。更深層次的模擬Linux文件管理系統(tǒng),將一些函數(shù)的考慮更加嚴(yán)謹(jǐn)、全面,多次調(diào)試,減少一些bug。盡量用規(guī)范的C++語(yǔ)言才編寫(xiě),注清函數(shù)功能,便于相互分享調(diào)用閱讀。六、實(shí)驗(yàn)總結(jié) 本實(shí)驗(yàn)是模擬Linux文件管理系統(tǒng),而我們平時(shí)很少接觸到Linux系統(tǒng),只是在書(shū)上學(xué)了一些理論的皮毛,紙上得來(lái)總覺(jué)淺,因此在開(kāi)始做的時(shí)候,感覺(jué)無(wú)從下手,只能去網(wǎng)上去查找一些相關(guān)知識(shí),以及看老師給的例子,并且和其他組就行討論,這個(gè)時(shí)間花了一天半的時(shí)間,但是成果不是很好,很多地方都不明白。但是時(shí)間緊迫,我們就邊做邊理解、討論,這樣造成一個(gè)非常大的困難,不知道從哪里下手,只能模仿著做,加深理解。在兩天的倉(cāng)促的時(shí)間里面,我們做出了一個(gè)簡(jiǎn)單可行的模擬文件系統(tǒng),雖然問(wèn)題不少,但是在時(shí)間的允許下,我們還是不錯(cuò)的。 在編程中,我們遇到了很多以前沒(méi)有遇到的問(wèn)題和知識(shí),在通過(guò)相互討論,上網(wǎng)查詢等方法后,我們解決了大部分的問(wèn)題,對(duì)C++語(yǔ)言的理解也加深了很多,對(duì)一個(gè)項(xiàng)目的需求也理解很多,一個(gè)合理的規(guī)劃會(huì)提高不少效率。七、參考文獻(xiàn)《C++程序設(shè)計(jì)》 清華大學(xué)出版社 譚浩強(qiáng)《算法與數(shù)據(jù)結(jié)構(gòu)(第二版)》 高等教育出版社 張乃孝《操作系統(tǒng)教程(第四遍)》 高等教育出版社 孫鐘秀 8.2源程序#include<iostream>#include<string>#include<stdio.h>usingnamespacestd;/*常變量*/constunsignedintBLOCK_SIZE=512; //塊長(zhǎng)constunsignedintDATA_BLOCK_NUM=512; //數(shù)據(jù)塊數(shù)量constunsignedintDINODE_START=4*BLOCK_SIZE; //inode起始位置constunsignedintDINODE_SIZE=512; //inode大小constunsignedintDINODE_NUM=512; //inode數(shù)量constunsignedintDATA_START=(2+DINODE_NUM)*BLOCK_SIZE; //數(shù)據(jù)區(qū)的開(kāi)始地址constunsignedintACCOUNT_NUM=10; //用戶數(shù)量constunsignedintDIRECTORY_NUM=12; //每個(gè)目錄最多允許擁有的子目錄和文件constunsignedshortFILE_NAME_LENGTH=20; //最大文件名長(zhǎng)度/**************************inode結(jié)構(gòu)體**************************//*inode結(jié)構(gòu)體*/structinode{ unsignedshortdi_tag; /*inode標(biāo)識(shí)*/unsignedshortdi_number; /*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件,如一個(gè)目錄至少包含兩個(gè)文件:"."和".."*/ unsignedshortdi_mode; /*存取模式:0為目錄,1為文件*/ unsignedshortdi_userID; /*當(dāng)前inode所屬用戶0為根目錄ID,一次下去是管理員目錄、用戶目錄*/ unsignedshortdi_access; /*訪問(wèn)權(quán)限0為不允許普通用戶訪問(wèn)(公共目錄),1為允許普通用戶訪問(wèn)*/ unsignedshortdi_size; /*文件大小,目錄沒(méi)有大小,值為0*/ unsignedshortdi_ctime;/*創(chuàng)建時(shí)間*/ unsignedshortdi_mtime;/*最后一次修改時(shí)間*/ unsignedshortdi_block;/*數(shù)據(jù)塊塊地址編號(hào)*/};/*———————————————————————— 超級(jí)塊結(jié)構(gòu)————————————————————————*/structsuper_block{ unsignedshorts_inodes_count;/*文件系統(tǒng)中inode的總數(shù)*/ unsignedshorts_free_inodes_count;/*空閑的inode總數(shù)*/ unsignedshorts_blocks_count;/*塊總數(shù)*/ unsignedshorts_r_blocks_count;/*保留塊總數(shù)*/ unsignedshorts_free_blocks_count;//空閑塊總數(shù) unsignedshorts_log_block_size;/*block的大小*/// unsignedshorts_free_blocks_group[GROUPNUM];//新增一個(gè)數(shù)組來(lái)記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù)// unsignedshorts_first_data_block;/*第一個(gè)數(shù)據(jù)block*/ // unsignedshorts_blocks_per_group;/*每blockgroup的block數(shù)量*/// unsignedshorts_inodes_per_group;/*每blockgroup的inode數(shù)量*/ };/*———————————————————————— 賬戶信息————————————————————————*/structuser{ unsignedshortuser_id; //用戶ID unsignedshortuser_access; //權(quán)限1為管理員0為平民 stringusername; //用戶名 stringpassword; //密碼};/*———————————————————————— 文件、目錄項(xiàng)結(jié)構(gòu)————————————————————————*/structdirectory{ stringname; /*目錄、文件名*/ stringcontent;/*文件數(shù)據(jù),目錄則沒(méi)有數(shù)據(jù)*/ unsignedshortd_ino; /*目錄、文件號(hào)*/};/*變量*/unsignedshortdi_bitmap[DINODE_NUM]; //硬盤(pán)inode節(jié)點(diǎn)位圖1表示已使用0表示未使用unsignedshort bk_bitmap[DATA_BLOCK_NUM]; //數(shù)據(jù)塊block位圖structsuper_blocksuperBlock; //超級(jí)塊structuseraccount[ACCOUNT_NUM]; //共創(chuàng)建ACCOUNT_NUM個(gè)賬戶FILE*f_stream; //文件指針structinode*cur_inode; //inode當(dāng)前目錄指針structinode*inode_temp; //inode臨時(shí)指針 constchardiskName[30]="ext2forlinux.disk"; //模擬硬盤(pán)的文件名structdirectorydir_buf[DIRECTORY_NUM]; //目錄數(shù)組,每個(gè)目錄最多允許有12個(gè)項(xiàng)(子目錄或者文件)stringcur_Path;//cmd的頭表示所在哪個(gè)文件夾//inti_lock=0;//inode位圖鎖可能會(huì)多線程//intb_lock=0;//block位圖鎖structuser*cur_user; //當(dāng)前用戶structdirectorycur_dir[DIRECTORY_NUM];//當(dāng)前目錄/**********************函數(shù)聲明********************/boolFormat(void); //此函數(shù)用于格式化boolinstall(void); //此函數(shù)用于裝載虛擬硬盤(pán)的數(shù)據(jù)intFindFile(stringfilename);//次函數(shù)用于查找當(dāng)前文件夾是否有該文件 boolaccess(structinode*pinode);//權(quán)限判斷intmain(){ voidlogin(void); //此函數(shù)用于用戶登陸 voidshowMenu(void);//此函數(shù)用于顯示功能菜單 boolonAction(void);//此函數(shù)用于用戶選擇功能并執(zhí)行 charformat_bool; /**************初始化************/ cout<<"系統(tǒng)已啟動(dòng),是否初始化所有數(shù)據(jù)?\tY/N"<<endl; while(true){ cin>>format_bool; if(format_bool=='y'||format_bool=='Y'){ if(!Format())return0; break; } elseif(format_bool=='n'||format_bool=='N'){ cout<<"不初始化不能開(kāi)始!"<<endl; continue; } else{ cout<<"請(qǐng)輸入Y或者N"<<endl; continue; } } cout<<"初始化成功!"<<endl; /********轉(zhuǎn)載虛擬硬盤(pán)數(shù)據(jù)***********/ if(!install()){ cout<<"加載失敗,無(wú)效的硬盤(pán)格式"<<endl; //main(); return0; } elsecout<<"加載disk成功!"<<endl; cur_Path=cur_dir[1].name+"\\root"; /*******登陸**********/ login(); /**顯示菜單**/ showMenu(); /**顯示當(dāng)前路徑**/ cout<<cur_Path; while(onAction()); return0;}/*此函數(shù)用于格式化*/boolFormat(){ //創(chuàng)建文件 f_stream=fopen(diskName,"wb+"); if(f_stream==NULL){ cout<<"創(chuàng)建文件失敗"<<endl; returnfalse; } //初始化超級(jí)塊 superBlock.s_inodes_count=DINODE_NUM;/*文件系統(tǒng)中inode的總數(shù)*/ superBlock.s_free_inodes_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;/*空閑的inode總數(shù)初始化時(shí),主目錄和賬戶信息各占一塊,10個(gè)用戶10塊*/ superBlock.s_blocks_count=DATA_BLOCK_NUM;/*塊總數(shù)*/ superBlock.s_free_blocks_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;//空閑塊總數(shù)主目錄/10個(gè)用戶/賬戶信息共占用12個(gè) superBlock.s_log_block_size=BLOCK_SIZE;/*block的大小*/ //超級(jí)塊放第1個(gè)物理塊,第0個(gè)為引導(dǎo) fseek(f_stream,BLOCK_SIZE,SEEK_SET); fwrite(&superBlock,BLOCK_SIZE,1,f_stream);// fprintf(f_stream,"thisissuperblock");//測(cè)試 //初始化dinode位圖block位圖 for(inti=0;i<DATA_BLOCK_NUM;i++){ if(i<2+ACCOUNT_NUM)bk_bitmap[i]=1; elsebk_bitmap[i]=0; } //初始化block位圖 for(inti=0;i<DINODE_NUM;i++){ if(i<2+ACCOUNT_NUM)di_bitmap[i]=1; elsedi_bitmap[i]=0; } //位示圖存放與第2.3塊 fseek(f_stream,BLOCK_SIZE*2,SEEK_SET); fwrite(&di_bitmap,BLOCK_SIZE,1,f_stream);// fprintf(f_stream,"thisissuperblock");//測(cè)試 fseek(f_stream,BLOCK_SIZE*3,SEEK_SET); fwrite(&bk_bitmap,BLOCK_SIZE,1,f_stream);// fprintf(f_stream,"thisissuperblock");//測(cè)試 //初始化inode表 structinode*node_temp; node_temp=newinode; if(!node_temp) { printf("node_temp內(nèi)存分配失敗!"); returnfalse; } //主目錄的inode node_temp->di_tag=0;//i節(jié)點(diǎn)標(biāo)志 node_temp->di_number=2+ACCOUNT_NUM;//關(guān)聯(lián)12個(gè)文件夾 node_temp->di_mode=0;//0為目錄 node_temp->di_userID=0;//用戶id第一個(gè)用戶 node_temp->di_access=0;//0為公共可以訪問(wèn) node_temp->di_size=0;//目錄無(wú)size node_temp->di_ctime=0;/*創(chuàng)建時(shí)間*/ node_temp->di_mtime=0;/*修改時(shí)間*/ node_temp->di_block=0; fseek(f_stream,DINODE_START,SEEK_SET); fwrite(node_temp,sizeof(structinode),1,f_stream); //賬戶信息的inode node_temp->di_tag=1; node_temp->di_number=0;//無(wú)文件關(guān)聯(lián),此項(xiàng)等于0表明是賬戶信息,可用作區(qū)別于文件、目錄的標(biāo)識(shí) node_temp->di_mode=0;//0為目錄 node_temp->di_userID=0;//用戶id第一個(gè)用戶 node_temp->di_access=0;//0為公共可以訪問(wèn) node_temp->di_size=0;//無(wú)size node_temp->di_ctime=0;/*創(chuàng)建時(shí)間*/ node_temp->di_mtime=0;/*修改時(shí)間*/ node_temp->di_block=1; /**賬戶信息存在數(shù)據(jù)塊的第1塊**/ fseek(f_stream,DINODE_START+BLOCK_SIZE,SEEK_SET); fwrite(node_temp,sizeof(structinode),1,f_stream); //管理員和9個(gè)普通用戶的inode for(inti=1;i<=ACCOUNT_NUM;i++){ node_temp->di_tag=i+1;//inode標(biāo)志 node_temp->di_number=2;//關(guān)聯(lián)2個(gè)文件夾 node_temp->di_access=1;//1為用戶私有 node_temp->di_mode=0;//0為目錄 node_temp->di_userID=i;//用戶id第一個(gè)用戶 node_temp->di_size=0;//目錄無(wú)size node_temp->di_ctime=0;/*創(chuàng)建時(shí)間*/ node_temp->di_mtime=0;/*修改時(shí)間*/ node_temp->di_block=i+1;//所占物理塊號(hào).從管理員到user9占用的位置為2~11. fseek(f_stream,DINODE_START+BLOCK_SIZE*(i+1),SEEK_SET); fwrite(node_temp,sizeof(structinode),1,f_stream); } /*******初始化主目錄**********/ dir_buf[0].name="."; dir_buf[0].d_ino=0; dir_buf[1].name=".."; dir_buf[1].d_ino=0; dir_buf[2].name="admin"; dir_buf[2].d_ino=2;//管理員的inode號(hào)為2 //user1~user9的目錄項(xiàng) for(inti=0;i<ACCOUNT_NUM-1;i++){ dir_buf[i+3].name="user"+i; dir_buf[i+3].d_ino=i+3; } fseek(f_stream,DATA_START,SEEK_SET); fwrite(dir_buf,BLOCK_SIZE,1,f_stream); /**初始化賬戶信息**/ structuseraccount_temp[ACCOUNT_NUM]; //管理員賬戶 account_temp[0].username="admin"; account_temp[0].password="admin"; account_temp[0].user_access=1;//1為管理員 account_temp[0].user_id=2;//管理員目錄的塊號(hào) //user1~user9 for(inti=1;i<ACCOUNT_NUM;i++){ account_temp[i].username="user"+i; account_temp[i].password="user"+i; account_temp[i].user_access=0; account_temp[i].user_id=i+2;//user[i]的物理塊號(hào) } fseek(f_stream,DATA_START+BLOCK_SIZE,SEEK_SET); fwrite(account_temp,BLOCK_SIZE,1,f_stream); /**初始化admin目錄以及user1~user9**/ //清空dir_buf for(inti=0;i<DIRECTORY_NUM;i++){ dir_buf[i].d_ino=0; dir_buf[i].name="\0"; } for(inti=0;i<ACCOUNT_NUM;i++){ dir_buf[0].d_ino=2; dir_buf[0].name="."; dir_buf[1].d_ino=0; dir_buf[1].name=".."; fseek(f_stream,DATA_START+BLOCK_SIZE*(i+2),SEEK_SET);//管理員在第二塊物理空間 } returntrue;}/*此函數(shù)用于裝載虛擬硬盤(pán)的數(shù)據(jù)*/boolinstall(void){ /**函數(shù)聲明**/ inode*getInode(unsignedint);//獲取指定inode號(hào)的inode單元 boolgetDataBlock(unsignedint);//獲取指定數(shù)據(jù)塊號(hào)下的目錄或文件 inti; cout<<"installing..."<<endl; f_stream=fopen(diskName,"rb+");//只讀方式打開(kāi)硬盤(pán)模擬文件 if(f_stream==NULL) { cout<<"文件打開(kāi)失敗"<<endl; return0; } //讀超級(jí)塊 fseek(f_stream,BLOCK_SIZE,SEEK_SET); fread(&superBlock,sizeof(structsuper_block),1,f_stream); ////// cout<<"加載超級(jí)塊:"<<superBlock.s_blocks_count<<endl; inode_temp=newinode; if(!inode_temp) { cout<<"cur_inode內(nèi)存分配失敗!"<<endl; return0; } cur_inode=newinode; if(!cur_inode) { cout<<"cur_inode內(nèi)存分配失敗!"<<endl; return0; } //讀取inode位示圖 fseek(f_stream,BLOCK_SIZE*2,SEEK_SET); fread(di_bitmap,BLOCK_SIZE,1,f_stream); cout<<"加載inode位示圖:"<<di_bitmap[0]<<endl; //讀取block位示圖 fseek(f_stream,BLOCK_SIZE*3,SEEK_SET); fread(bk_bitmap,BLOCK_SIZE,1,f_stream); cout<<"加載block位示圖:"<<bk_bitmap[0]<<endl; //讀取賬戶信息的inode inode_temp=getInode(1); if(inode_temp==NULL) { cout<<"加載賬戶信息失敗!"<<endl; returnfalse; } //changeinode();//交換指針后cur_inode指向當(dāng)前目錄的inode //讀取賬戶信息 cout<<"賬戶信息塊號(hào):"<<inode_temp->di_block<<endl; fseek(f_stream,DATA_START+BLOCK_SIZE*inode_temp->di_block,SEEK_SET); fread(account,BLOCK_SIZE,1,f_stream); cout<<"加載賬戶信息:"<<account[0].username<<'\t'<<account[0].password<<endl; for(i=0;i<ACCOUNT_NUM;i++) { if(account[i].user_id!=0) { cout<<account[i].username<<account[i].password; } } cur_inode=getInode(0);//讀取主目錄的inode當(dāng)前inode指向主目錄的inode if(cur_inode->di_mode!=0) { cout<<"讀取主目錄失敗,請(qǐng)重新格式化!"<<endl; } else { //將主目錄讀入cur_dir數(shù)組 getDataBlock(cur_inode->di_block); } returntrue;}/*此函數(shù)用于用戶登陸*/voidlogin(){ }/*此函數(shù)用于顯示功能菜單*/voidshowMenu(void){ cout<<"help\t\t顯示命令幫助\n"; cout<<"create[文件名]\t創(chuàng)建文本文件\n"; cout<<"cdir[目錄名]\t創(chuàng)建文件夾\n"; cout<<"read[文件名]\t讀取一個(gè)文件\n"; cout<<"edit[文件名]\t編輯一個(gè)文件\n"; cout<<"cd[目錄名]\t進(jìn)入子目錄或者上級(jí)目錄\n"; cout<<"attr[文件名]\t顯示該文件的屬性\n"; cout<<"del[文件名]\t刪除文件\n"; cout<<"dir\t\t顯示當(dāng)前目錄下的文件和文件夾\n"; cout<<"rename[文件名]\t重命名\n"; cout<<"logout\t\t注銷\n"; cout<<"exit\t\t退出系統(tǒng)\n";}/**此函數(shù)用于用戶選擇功能并執(zhí)行**/boolonAction(){ voidshowMenu(); voidshowDir(); voidlogout(); voidcreateFile(stringstr);//創(chuàng)建一個(gè)文件 voidcreateDir(stringstr); voideditFile(stringstr); voidvisit(stringstr); voidattrib(stringstr); voidDelete(stringstr);//刪除一個(gè)文件 voidrename(stringstr); boolread(stringfilename);//此函數(shù)用于讀取一個(gè)文件 inode*getInode(unsignedint); fflush(stdin); while(true){ fflush(stdin); charstr[20];//用戶輸入的命令 charname[20];//文件或者目錄名 stringnamestr; cin>>str; // cout<<"str="<<str<<endl; // cout<<"測(cè)試:"<<str.find_first_of("create",0)<<'\t'<<str.find_first_of("",0)<<'\t'<<endl; if(strcmp(str,"exit")==0){ fclose(f_stream); returnfalse; } elseif(strcmp(str,"dir")==0){ showDir();//顯示當(dāng)前文件夾下的所有文件和文件夾 } elseif(strcmp(str,"help")==0){ showMenu(); //顯示功能菜單 } elseif(strcmp(str,"logout")==0){ logout();//注銷 } elseif(strcmp(str,"create")==0){ cin>>namestr; createFile(namestr); } elseif(strcmp(str,"cdir")==0){ cin>>namestr; createDir(namestr);//創(chuàng)建文件夾 } elseif(strcmp(str,"read")==0){ cin>>name; read(name);//讀文件 } elseif(strcmp(str,"edit")==0){ cin>>name; editFile(name);//編輯文件 } elseif(strcmp(str,"cd")==0){ cin>>name; visit(name);//目錄訪問(wèn) } elseif(strcmp(str,"attr")==0){ cin>>name; attrib(name);//顯示該文件的屬性 } elseif(strcmp(str,"del")==0){ cin>>name; Delete(name);//刪除文件 } elseif(strcmp(str,"rename")==0){ cin>>name; rename(name);//重命名 } /**測(cè)試**/ elseif(strcmp(str,"getInode")==0){ inti; cin>>i; getInode(i);//查看inode } /*****/ elsecout<<str<<"不是內(nèi)部命令!"<<endl; }}/**此函數(shù)用于顯示當(dāng)前目錄下所有文件和文件夾信息**/voidshowDir(void){ cout<<"thisisshowDir"<<endl;}/**此函數(shù)用于注銷用戶**/voidlogout(void){ cout<<"thisislogout"<<endl;}/**此函數(shù)用于創(chuàng)建文件夾**/voidcloseFile(stringstr){ cout<<"thisiscloseFile"<<endl;}/**此函數(shù)用于編輯文件**/voideditFile(stringstr){ cout<<"thisiseditFile"<<endl;}/**訪問(wèn)目錄**/voidvisit(stringstr){ cout<<"thisisvisit"<<endl;}/**顯示文件屬性**/voidattrib(stringstr){ cout<<"thisisattrib"<<endl;}/**文件或者目錄重命名**/voidrename(stringstr){ cout<<"thisisrename"<<endl;}/**此函數(shù)判斷對(duì)要訪問(wèn)的文件夾是否有訪問(wèn)權(quán)限**/boolaccess(structinode*pinode)//調(diào)用的時(shí)候要把當(dāng)前文件的inode指針傳送過(guò)來(lái)這里0表示普通用戶1表示管理員{ if(pinode->di_userID==cur_user->user_id)returntrue;//該文件是當(dāng)前用戶擁有 if(cur_user->user_access==1)returntrue;//該用戶為管理員 returnfalse;}/**此函數(shù)用于讀取相應(yīng)inode號(hào)下面的inode塊**/structinode*getInode(unsignedintn){ inode*temp; temp=newinode; fseek(f_stream,DINODE_START+BLOCK_SIZE*n,SEEK_SET); fread(temp,sizeof(structinode),1,f_stream);// cout<<"inode:\n"<<"di_tag:"<<temp->di_tag<<"\tdi_number:"<<temp->di_number<<"\tdi_mode:"<<temp->di_mode<<"\tdi_userID:"<<temp->di_userID<<"\ndi_block:"<<temp->di_block<<endl; returntemp; }/**此函數(shù)將指定編號(hào)下的數(shù)據(jù)塊的目錄或者文件讀入cur_dir**/boolgetDataBlock(unsignedintn){ //directory*temp; //temp=newdirectory; fseek(f_stream,DATA_START+BLOCK_SIZE*n,SEEK_SET); fread(cur_dir,sizeof(structdirectory)*cur_inode->di_number,1,f_stream);// cout<<"getDataBlock函數(shù):"<<cur_dir[0].name<<'\t'<<cur_dir[0].d_ino<<endl; returntrue;}/**此函數(shù)用于判斷當(dāng)前文件夾有沒(méi)有查找的文件沒(méi)有返回-1有返回該文件的inod號(hào)**/intFindFile(stringfilename){ inti; if(filename.length()>FILE_NAME_LENGTH){ cout<<"您輸入的文件名長(zhǎng)度大于14,文件查找失敗!"<<endl;return-1;}if(filename==".") { cout<<"自身文件夾不允許操作!"<<endl; return-1;} if(".."==filename) { cout<<"父目錄不允許操作!"<<endl; return-1;}for(i=0;i<cur_inode->di_number;i++){ if(dir_buf[i].name==filename) { cout<<"當(dāng)前文件存在!"<<endl; returndir_buf[i].d_ino; }} cout<<"未找到此文件"<<endl; return-1;}/**此函數(shù)由于讀取一個(gè)文件,將文件內(nèi)容輸出**/boolread(stringfilename){ structinode*temp; if(FindFile(filename)==-1) { returnfalse; } temp=getInode(FindFile(filename)); if(!access(temp)) { cout<<"您沒(méi)有此文件的訪問(wèn)權(quán)限"<<endl; returnfalse; } if(temp->di_mode!=1) { cout<<filename<<"不是一個(gè)文件"<<endl; returnfalse; } char*buf; buf=(char*)malloc(BLOCK_SIZE*(temp->di_size/BLOCK_SIZE+1)); fseek(f_stream,DATA_START+BLOCK_SIZE*temp->di_block,SEEK_SET); fread(buf,BLOCK_SIZE*(temp->di_size/BLOCK_SIZE+1),1,f_stream); returntrue;}voidcreateFile(stringstr){ inti,j,m,file_access;if(str.length()>FILE_NAME_LENGTH){ cout<<"您輸入的文件名長(zhǎng)度大于20,文件創(chuàng)建失??!";return;}if(FindFile(str)!=-1){ cout<<"您輸入的文件名已存在,文件名不能重復(fù),創(chuàng)建失??!"<<endl; return;}if(superBlock.s_free_inodes_count==0||superBlock.s_free_blocks_count==0){ cout<<"當(dāng)前存儲(chǔ)空間已滿!請(qǐng)刪除一些文件后再存儲(chǔ)。"<<endl; return;}cout<<"請(qǐng)輸入文件的訪問(wèn)權(quán)限。1表示共享文件,0表示私有文件:"<<endl;cin>>file_access;fflush(stdin);for(j=0;j<DINODE_NUM;j++){ if(di_bitmap[j]==0) { di_bitmap[j]=1; break; }}for(m=0;m<DATA_BLOCK_NUM;m++){ if(bk_bitmap[m]==0) { bk_bitmap[m]=1; break; } }char*buf;intk=0,tag=0;buf=(char*)malloc(BLOCK_SIZE*sizeof(char));cout<<"請(qǐng)輸入文件的內(nèi)容,以“###”結(jié)束!"<<endl;for(i=0;i<BLOCK_SIZE;i++){ buf[i]=getchar();if(tag==0)k=0;if(buf[i]=='#') { tag=1; k++; if(k==3) break; } else { k=0; tag=0;}}buf[i-2]='\0';cout<<"文件長(zhǎng)度為:"<<strlen(buf);structinode*node_temp; node_temp=newinode; if(!node_temp) { cout<<"node_temp內(nèi)存分配失敗!文件創(chuàng)建不成功!"<<endl; return; }node_temp->di_tag=j;node_temp->di_number=1; /*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件,如一個(gè)目錄至少包含兩個(gè)文件:"."和".."*/node_temp->di_mode=1; /*存取模式:0為目錄,1為文件*/node_temp->di_userID=cur_user->user_id; /*當(dāng)前inode所屬用戶0為根目錄ID,一次下去是管理員目錄、用戶目錄*/node_temp->di_access=file_access; /*訪問(wèn)權(quán)限0為不允許普通用戶訪問(wèn)(公共目錄),1為允許普通用戶訪問(wèn)*/node_temp->di_size=strlen(buf); /*文件大小,目錄沒(méi)有大小,值為0*/node_temp->di_ctime;/*創(chuàng)建時(shí)間*/node_temp->di_mtime;/*最后一次修改時(shí)間*/node_temp->di_block=m;/*數(shù)據(jù)塊塊地址編號(hào)*/ fseek(f_stream,DINODE_START+j*BLOCK_SIZE,SEEK_SET);fwrite(node_temp,BLOCK_SIZE,1,f_stream);//將新建文件inode寫(xiě)入磁盤(pán)fseek(f_stream,DATA_START+m*BLOCK_SIZE,SEEK_SET);fwrite(buf,BLOCK_SIZE,1,f_stream);//將新建文件的內(nèi)容寫(xiě)入磁盤(pán)dir_buf[cur_inode->di_number].d_ino=j;//修改當(dāng)前目錄的結(jié)構(gòu)dir_buf[cur_inode->di_number].name=str; fseek(f_stream,DATA_START+BLOCK_SIZE*cur_inode->di_block,SEEK_SET);//將當(dāng)前目錄信息寫(xiě)入文件的block區(qū)fwrite(dir_buf,BLOCK_SIZE,1,f_stream);cur_inode->di_number++;//當(dāng)前目錄關(guān)聯(lián)文件數(shù)++superBlock.s_free_inodes_count--;//超級(jí)塊中空閑的inode數(shù)目減一superBlock.s_free_blocks_count--;//超級(jí)塊中空閑的block數(shù)目減一fseek(f_stream,BLOCK_SIZE,SEEK_SET);//修改超級(jí)塊fwrite(&superBlock,BLOCK_SIZE,1,f_stream);fseek(f_stream,2*BLOCK_SIZE,SEEK_SET);//fwrite(di_bitmap,BLOCK_SIZE,1,f_stream);fwrite(bk_bitmap,BLOCK_SIZE,1,f_stream);cout<<"文件已成功添加"<<endl;free(buf);return;}voidDelete(stringstr){ inti,j,m; intnumb;//numb用來(lái)存儲(chǔ)需要?jiǎng)h除的文件inode號(hào)charC;if(str.length()>FILE_NAME_LENGTH)//判斷輸入的文件名是否超過(guò)長(zhǎng)度{ cout<<"您輸入的文件名長(zhǎng)度大于20,操作失?。?;return;}numb=FindFile(str);//判斷是否存在該文件或文件夾if(numb==-1){ cout<<"該文件或文件夾不存在!"<<endl; return;}if(!access(getInode(numb)))//判斷是否有權(quán)限刪除文件 { cout<<"您沒(méi)有權(quán)限刪除該文件或文件夾!"<<endl; return; }structinode*node_temp;//node_temp指向需要?jiǎng)h除文件inode結(jié)構(gòu)體node_temp=getInode(numb);if(node_temp->di_mode==1)//如果是文件的話就直接刪除{ di_bitmap[numb]=0;//將文件inode釋放,即將相應(yīng)位示圖位置置為0bk_bitmap[node_temp->di_block]=0;//將文件block釋放,即將相應(yīng)位示圖位置置為0cur_inode->di_number--;//當(dāng)前文件夾關(guān)聯(lián)文件減一for(i=0;i<node_temp->di_number;i++)//改變當(dāng)前文件夾的關(guān)聯(lián)文件 { if(dir_buf[i].name==str) break; } for(j=i;j<node_temp->di_number-1;j++){ dir_buf[j]=dir_buf[j+1];}fseek(f_stream,DATA_START+BLOCK_SIZE*cur_inode->di_block,SEEK_SET);//將當(dāng)前目錄信息寫(xiě)入文件的block區(qū)fwrite(dir_buf,BLOCK_SIZE,1,f_stream);fseek(f_stream,2*BLOCK_SIZE,SEEK_SET);//修改位示圖fwrite(di_bitmap,BLOCK_SIZE,1,f_stream);fseek(f_stream,3*BLOCK_SIZE,SEEK_SET);fwrite(bk_bitmap,BLOCK_SIZE,1,f_stream);superBlock.s_free_inodes_count--;//超級(jí)塊中空閑的inode數(shù)目加一superBlock.s_free_blocks_count--;//超級(jí)塊中空閑的block數(shù)目加一fseek(f_stream,BLOCK_SIZE,SEEK_SET);//修改超級(jí)塊fwrite(&superBlock,BLOCK_SIZE,1,f_stream); }elseif(node_temp->di_mode==0)//是文件夾的話則判斷該文件夾中是否有文件{ if(node_temp->di_number>2)//如果有文件則不能刪除 { cout<<"當(dāng)前文件夾內(nèi)包含文件,不允許被刪除!"<<endl; return; }cout<<"是否真的要?jiǎng)h除該文件夾?(Y/N)";//若沒(méi)有文件則判斷是否要?jiǎng)h除該文件夾cin>>C;if(C=='N'||C=='n')return;elseif(C=='Y'||C=='y'){ di_bitmap[numb]=0;bk_bitmap[node_temp->di_block]=0;cur_inode->di_number--; for(i=0;i<node_temp->di_number;i++) { if(dir_buf[i].name==str) break; } for(j=i;j<node_temp->di_number-1;j++){ dir_buf[j]=dir_buf[j+1];}fseek(f_stream,DATA_START+BLOCK_SIZE*cur_inode->di_block,SEEK_SET);//將當(dāng)前目錄信息寫(xiě)入文件的block區(qū)fwrite(dir_buf,BLOCK_SIZE,1,f_stream);fseek(f_stream,2*BLOCK_SIZE,SEEK_SET);//修改位示圖fw

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論