版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 操作系統(tǒng)課程設(shè)計(jì)</b></p><p> 一個(gè)多用戶多級(jí)目錄結(jié)構(gòu)文件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 一、設(shè)計(jì)思想說(shuō)明</b></p><p><b> 1 設(shè)計(jì)環(huán)境</b></p><p> 課程設(shè)計(jì)的環(huán)境是Linux 操作系統(tǒng)
2、。 設(shè)計(jì)時(shí)可利用Linux 提供的文件管理的功能調(diào)用,建立一個(gè)模擬的文件系統(tǒng)?;舅枷胧?,在Linux 系統(tǒng)中創(chuàng)建一個(gè)較大容量的文件,作為所設(shè)計(jì)的文件系統(tǒng)的“文件卷”,并利用Linux 系統(tǒng)的功能調(diào)用,編寫(xiě)各程序模塊。</p><p><b> 2、文件卷的組織</b></p><p> 以 1M 的存儲(chǔ)器空間作為文件空間,空間“分塊”,編號(hào)為 0#~(BLKMA
3、X-1)# ?!胺謮K”就是規(guī)定對(duì)文件卷的讀/寫(xiě)以塊為單位,每次讀/寫(xiě)的起點(diǎn)為塊大小的整倍數(shù)。分塊主要體現(xiàn)在文件卷的讀/寫(xiě)模塊上。</p><p> # define BSIZE 512 /* 512bytes/塊 */</p><p> # define BLKMAX 2048 /* 共2048 塊 */</p><p> 0#塊的作用: 0# 塊是專用塊(超
4、級(jí)塊)。前半部用于存放文件卷空間的位示圖(bitmap),位狀態(tài)='0'表示對(duì)應(yīng)塊空閑,狀態(tài)='1'表示已分配。后半部的最后32 個(gè)字節(jié)用于存放根目錄的目錄結(jié)構(gòu)。0#塊不參與文件空間的動(dòng)態(tài)分配。1#~(BLKMAX-1)#塊用于存放文件(普通文件和子目錄文件)的信息。</p><p><b> 二、系統(tǒng)結(jié)構(gòu)的說(shuō)明</b></p><p&g
5、t; 本文件管理系統(tǒng)分為五層,上層調(diào)用下層,下層為上層服務(wù)。以下為各層(由低到高)的簡(jiǎn)要說(shuō)明:</p><p> 1、塊管理層,通過(guò)TBlock類實(shí)現(xiàn)</p><p><b> 設(shè)下列主要函數(shù):</b></p><p> balloc()--塊分配函數(shù)</p><p> brelse()--塊釋放函數(shù)</
6、p><p> bread()—讀一塊函數(shù)</p><p> bwrite()—寫(xiě)一塊函數(shù)</p><p> 2、FCB管理層,通過(guò)TFcb類實(shí)現(xiàn)</p><p> 功能涉及到FCB結(jié)構(gòu)的操作,定義了一些與FCB操作相關(guān)的函數(shù)</p><p> 3、打開(kāi)文件管理層,通過(guò)TOFile類實(shí)現(xiàn)</p>&l
7、t;p> 功能為涉及ofile結(jié)構(gòu)的操作。</p><p> 4、命令解釋層,通過(guò)TEnter類和TOrder類實(shí)現(xiàn)</p><p> 功能為接受來(lái)自用戶的命令,并解釋、執(zhí)行用戶提出的文件訪問(wèn)操作。按系統(tǒng)的的功能要求,可以O(shè)pen(),Close(),Read(),Write();等函數(shù)。</p><p><b> 三、數(shù)據(jù)結(jié)構(gòu)的說(shuō)明<
8、/b></p><p> 用戶信息的存儲(chǔ)結(jié)構(gòu):</p><p> struct UserNode//注冊(cè)用戶信息</p><p><b> {</b></p><p> char d_flag;//標(biāo)識(shí)該用戶信息是否有效,超級(jí)用戶為用戶數(shù)目,-1表示無(wú)效</p><p> cha
9、r d_uid; /*用戶標(biāo)識(shí),為0時(shí)表示是超級(jí)*/</p><p> char d_gid; /*同組用戶標(biāo)識(shí)*/</p><p> char d_name[8];/*用戶名,但不超過(guò)八個(gè)字節(jié),超過(guò)八位自動(dòng)截取*/</p><p> char password[8];/*用戶密碼但不超過(guò)八位,超過(guò)八位自動(dòng)截取*/</p><
10、;p><b> };</b></p><p> 目錄文件結(jié)點(diǎn)信息存儲(chǔ)結(jié)構(gòu):</p><p> struct dir</p><p><b> {</b></p><p> unsigned short d_mode; //文件屬性及訪問(wèn)權(quán)限,<=0時(shí)為空結(jié)構(gòu)</p>
11、<p> char d_uid; //文件主標(biāo)識(shí)</p><p> char d_gid;//文件主同組用戶標(biāo)識(shí)</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結(jié)構(gòu)時(shí)為該目錄下文件個(gè)數(shù)</p><p> char d_name[8];//文件名</p><p>
12、int d_add[10];//存放文件信息的空間地址(塊號(hào))</p><p><b> };</b></p><p> Fcb在內(nèi)存中的結(jié)構(gòu):</p><p> struct SFcb</p><p><b> {</b></p><p> char f_c
13、ount;/*文件訪問(wèn)計(jì)數(shù)*/</p><p> char f_flag;/*標(biāo)志字*/</p><p> int f_blkno;/*存放本文件目錄結(jié)構(gòu)的塊號(hào)*/</p><p> int f_number;/*文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號(hào)*/</p><p> unsigned short f_mode; /*文件屬性*
14、/</p><p> /*以下各項(xiàng)信息在文件打開(kāi)時(shí)從struct dir獲取*/</p><p> char f_uid;</p><p> char f_gid;</p><p> int f_fsize;</p><p> char f_name[8];</p><p> in
15、t f_add[10];</p><p><b> };</b></p><p> 文件目錄存儲(chǔ)位置存儲(chǔ)結(jié)構(gòu):</p><p> struct Hfcb//用于Namei函數(shù),返回文件目錄結(jié)構(gòu)存儲(chǔ)位置</p><p><b> {</b></p><p> int
16、 blkno;//存放本文件目錄結(jié)構(gòu)的塊號(hào)</p><p> int offset;//文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號(hào)</p><p><b> };</b></p><p><b> 打開(kāi)文件結(jié)構(gòu):</b></p><p> struct HOFile</p><
17、;p><b> {</b></p><p> char o_flag;//標(biāo)志字</p><p> int o_count;//訪問(wèn)計(jì)數(shù)</p><p> struct SFcb* o_fcbp;//對(duì)就打開(kāi)文件FCB結(jié)構(gòu)指針</p><p> int o_offset;
18、//文件當(dāng)前讀/寫(xiě)指針</p><p><b> };</b></p><p> 內(nèi)存中的用戶結(jié)點(diǎn)結(jié)構(gòu):</p><p> struct TUser</p><p><b> {</b></p><p> char u_name[8];//用戶名,登錄時(shí)使用&
19、lt;/p><p> char u_uid;//用戶標(biāo)識(shí),文件創(chuàng)建時(shí)的文件主</p><p> char u_gid;//同組用戶標(biāo)識(shí)</p><p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標(biāo)識(shí)</p><p> int u_error;//執(zhí)行文件管理函數(shù)時(shí)返回的錯(cuò)誤代碼,創(chuàng)建文件時(shí)被用來(lái)存儲(chǔ)文件設(shè)
20、置</p><p> char*u_base;//讀/寫(xiě)文件時(shí)信息存儲(chǔ)區(qū)始址</p><p> int u_count;//讀/寫(xiě)文件時(shí)信息字節(jié)數(shù)</p><p> int u_offset;//讀/寫(xiě)文件的相對(duì)位移量</p><p> char u_obuf[8];//文件路徑名分量暫存區(qū)(查找文件時(shí)用)</p
21、><p> struct SFcb* u_pdir;//新文件父目錄FCB指針(文件創(chuàng)建時(shí)用)</p><p> struct HOFile *u_ofile[5];//本用戶打開(kāi)文件表</p><p><b> };</b></p><p><b> 四、算法流程圖</b></p>
22、;<p><b> 五、系統(tǒng)調(diào)用列表</b></p><p><b> 六、主要函數(shù)列表</b></p><p><b> 七、程序清單及注析</b></p><p> 以下為block.h的內(nèi)容:</p><p> #include<iostre
23、am></p><p> #include<stdio.h></p><p> #include<string></p><p> #include<stdlib.h></p><p> #include<bitset></p><p> #include
24、<iomanip></p><p> using namespace std;</p><p> #define BLOCK 512</p><p> #define BLOCKNUM 2048</p><p> #define DN 8</p><p> #define USERNUM 10
25、//最大用戶數(shù)</p><p> #define FILENUM 9//每個(gè)塊能存儲(chǔ)的文件目錄結(jié)構(gòu)數(shù)量</p><p> /*FCB標(biāo)志字(f_flag)的各種標(biāo)志定義為:*/</p><p> #define FLOCK 01/*FCB訪問(wèn)互斥標(biāo)志*/</p><p> #define FUPD 02/*本FCB代表的文件
26、已修改*/</p><p> #define FCHG 04/*本FCB結(jié)構(gòu)中某些信息已被修改*/</p><p> #define FCBFLAG 05 //本fcb結(jié)構(gòu)未被使用</p><p> #define FCBUSE07 //本fcb結(jié)構(gòu)已被使用</p><p> #define OFFLAG 06 //本HO
27、file結(jié)構(gòu)未被使用</p><p> #define OFUSE 03 //本HOfile結(jié)構(gòu)已被使用</p><p> //文件屬性及文件訪問(wèn)權(quán)限(即d_mode和f_mode)定義:</p><p> #define ROOT 111</p><p> #define IFROOT 011//子目錄中存儲(chǔ)父目錄的結(jié)構(gòu)&l
28、t;/p><p> #define IFMT 0070000//文件類型屏蔽字</p><p> #define IFDIR 0010000//子目錄文件</p><p> #define IFREG 0020000//普通文件</p><p> #define IREAD 0400//文件主”讀"權(quán)限</p&
29、gt;<p> #define IWRITE 0200//文件主“寫(xiě)”權(quán)限</p><p> #define IEXEC 0100//文件主“執(zhí)行”權(quán)限</p><p> #define GREAD 040//同組用戶“讀”權(quán)限</p><p> #define GWRITE 020//同組用戶“寫(xiě)”權(quán)限</p>
30、<p> #define GEXEC 010//同組用戶“執(zhí)行”權(quán)限</p><p> #define OREAD 04//其它用戶“讀”權(quán)限</p><p> #define OWRITE 02//其它用戶“寫(xiě)”權(quán)限</p><p> #define OEXEC 01//其它用戶“執(zhí)行”權(quán)限</p><p>
31、; #define NONODE 100</p><p> inline bool bit_on(unsigned char ui,int pos){return ui&(1<<pos);}//"1"返回true</p><p> inline void bit_setone(unsigned char& ui,int pos){ui|
32、=1<<pos;}</p><p> inline void bit_setzero(unsigned char& ui,int pos){ui&=~(1<<pos);}</p><p> struct USERINFO//注冊(cè)用戶信息</p><p><b> {</b></p>&
33、lt;p> char d_flag;//標(biāo)識(shí)該用戶信息是否有效,超級(jí)用戶為用戶數(shù)目,-1表示無(wú)效</p><p> char d_uid; /*用戶標(biāo)識(shí),為0時(shí)表示是超級(jí)*/</p><p> char d_gid; /*同組用戶標(biāo)識(shí)*/</p><p> char d_name[8];/*用戶名,但不超過(guò)八個(gè)字節(jié),超過(guò)八位自動(dòng)截取*
34、/</p><p> char password[8];/*用戶密碼但不超過(guò)八位,超過(guò)八位自動(dòng)截取*/</p><p><b> };</b></p><p> struct dir</p><p><b> {</b></p><p> unsigned shor
35、t d_mode; //文件屬性及訪問(wèn)權(quán)限,<=0時(shí)為空結(jié)構(gòu)</p><p> char d_uid; //文件主標(biāo)識(shí)</p><p> char d_gid;//文件主同組用戶標(biāo)識(shí)</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結(jié)構(gòu)時(shí)為該目錄下文件個(gè)數(shù)</p><p> cha
36、r d_name[8];//文件名</p><p> int d_add[10];//存放文件信息的空間地址(塊號(hào))</p><p><b> };</b></p><p> struct SFcb</p><p><b> {</b></p><p>
37、 char f_count;/*文件訪問(wèn)計(jì)數(shù)*/</p><p> char f_flag;/*標(biāo)志字*/</p><p> int f_blkno;/*存放本文件目錄結(jié)構(gòu)的塊號(hào)*/</p><p> int f_number;/*文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號(hào)*/</p><p> unsigned short f_mode
38、; /*文件屬性*/</p><p> /*以下各項(xiàng)信息在文件打開(kāi)時(shí)從struct dir獲取*/</p><p> char f_uid;</p><p> char f_gid;</p><p> int f_fsize;</p><p> char f_name[8];</p><
39、p> int f_add[10];</p><p><b> };</b></p><p> struct Hfcb//用于Namei函數(shù),返回文件目錄結(jié)構(gòu)存儲(chǔ)位置</p><p><b> {</b></p><p> int blkno;//存放本文件目錄結(jié)構(gòu)的塊號(hào)<
40、;/p><p> int offset;//文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號(hào)</p><p><b> };</b></p><p> #define FCBMAX 16</p><p> struct SFcb tfcb[FCBMAX]; //系統(tǒng)fcb[]結(jié)構(gòu)</p><p> s
41、truct HOFile</p><p><b> {</b></p><p> char o_flag;//標(biāo)志字</p><p> int o_count;//訪問(wèn)計(jì)數(shù)</p><p> struct SFcb* o_fcbp;//對(duì)就打開(kāi)文件FCB結(jié)構(gòu)指針</p>
42、<p> int o_offset;//文件當(dāng)前讀/寫(xiě)指針</p><p><b> };</b></p><p> #define FILENO 10</p><p> struct HOFile ofile[FILENO];//系統(tǒng)打開(kāi)文件表ofile</p><p> void In
43、itOFile()//初始化ofile數(shù)組</p><p><b> {</b></p><p> for(int i=0;i<FILENO;i++)</p><p> ofile[i].o_flag=OFFLAG;</p><p><b> }</b></p><
44、p> struct TUser</p><p><b> {</b></p><p> char u_name[8];//用戶名,登錄時(shí)使用</p><p> char u_uid;//用戶標(biāo)識(shí),文件創(chuàng)建時(shí)的文件主</p><p> char u_gid;//同組用戶標(biāo)識(shí)</p>
45、<p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標(biāo)識(shí)</p><p> int u_error;//執(zhí)行文件管理函數(shù)時(shí)返回的錯(cuò)誤代碼,創(chuàng)建文件時(shí)被用來(lái)存儲(chǔ)文件設(shè)置</p><p> char*u_base;//讀/寫(xiě)文件時(shí)信息存儲(chǔ)區(qū)始址</p><p> int u_count;//讀/寫(xiě)文件時(shí)信息字節(jié)數(shù)<
46、/p><p> int u_offset;//讀/寫(xiě)文件的相對(duì)位移量</p><p> char u_obuf[8];//文件路徑名分量暫存區(qū)(查找文件時(shí)用)</p><p> struct SFcb* u_pdir;//新文件父目錄FCB指針(文件創(chuàng)建時(shí)用)</p><p> struct HOFile *u_ofile[5]
47、;//本用戶打開(kāi)文件表</p><p><b> };</b></p><p> int fun=0;</p><p> #define USERNO 5</p><p> struct TUser user[USERNO];</p><p> void InitUser()//初始化用
48、戶數(shù)組</p><p><b> {</b></p><p> for(int uof=0;uof<USERNO;uof++)</p><p> for(int of=0;of<5;of++)</p><p> user[uof].u_ofile[of]=NULL;</p><p&
49、gt;<b> }</b></p><p> class TBlock</p><p><b> {</b></p><p><b> public:</b></p><p> TBlock();//</p><p> ~TBl
50、ock();</p><p> int Balloc();//塊分配函數(shù)</p><p> void Brelse(int bno);//塊釋放函數(shù)</p><p> bool Bread(int bno,char* tempbuf);//讀一塊函數(shù)</p><p> void CheckFirst();
51、//檢查是否是第一次</p><p> void CreateFile(USERINFO info);//創(chuàng)建文件(模擬文件系統(tǒng)的硬盤(pán)空間)</p><p> void CreateList(int bno,dir& tempdir);//創(chuàng)建子目錄</p><p> void FirstInit(USERINFO info);//第一
52、次進(jìn)入系統(tǒng)時(shí)的初始化</p><p> void Init();//正常初化</p><p> bool IsFirst();//返回first的值</p><p> bool BWrite(int bno,char* tempbuf);//寫(xiě)一塊函數(shù)</p><p> void SaveInfo();
53、//對(duì)讀入內(nèi)存的0#塊內(nèi)容,寫(xiě)入硬盤(pán)</p><p> void SetFirst();//將first置為true即,不是第一次啟動(dòng)</p><p> protected:</p><p> unsigned char bitmap[256];</p><p><b> FILE* pf;</b>
54、</p><p> bool first;</p><p> char* buf;</p><p> dir rootdir;</p><p><b> };</b></p><p> TBlock::TBlock()</p><p><b> {&l
55、t;/b></p><p> InitUser();//初始化用戶數(shù)組,以備用戶登陸時(shí)用</p><p><b> pf=NULL;</b></p><p> first=false;</p><p> if((buf=new char[512])==NULL)</p><p>&l
56、t;b> {</b></p><p> cout<<"內(nèi)存不足"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p> CheckFirst();//檢查是不是
57、用戶第一次啟動(dòng)系統(tǒng)</p><p> if(first==false)</p><p><b> {</b></p><p> Init();//如果不是第一次登陸,則進(jìn)入用戶登陸界面</p><p><b> }</b></p><p><b> }&l
58、t;/b></p><p> TBlock::~TBlock()</p><p><b> {</b></p><p> SaveInfo();</p><p> delete[]buf;</p><p> fclose(pf);</p><p><b
59、> }</b></p><p> int TBlock::Balloc()//塊分配函數(shù)</p><p><b> {</b></p><p> int bit,byte,i=0,count=1;</p><p> for(;i<2048;i++)//設(shè)置位示圖</p>&
60、lt;p><b> {</b></p><p><b> count++;</b></p><p> if(count>2048)</p><p><b> break;</b></p><p><b> bit=i%DN;</b>&
61、lt;/p><p> byte=(i-bit)/DN;</p><p> if(bit_on(bitmap[byte],bit)==true)</p><p><b> continue;</b></p><p><b> else</b></p><p><b&g
62、t; {</b></p><p> bit_setone(bitmap[byte],bit);</p><p> char* tempbuf=NULL;</p><p> if((tempbuf=new char[BLOCK])==NULL)</p><p><b> {</b></p>
63、<p> cout<<"內(nèi)存不足!"<<endl;</p><p> return -1;</p><p><b> }</b></p><p> BWrite(i,tempbuf);</p><p> delete[]tempbuf;</p>
64、;<p><b> return i;</b></p><p><b> }</b></p><p> if(i>=2048)</p><p><b> i=i%2048;</b></p><p><b> }</b><
65、/p><p> return -1;</p><p><b> }</b></p><p> void TBlock::Brelse(int bno)//釋放塊</p><p><b> {</b></p><p> int byte,bit;</p>&
66、lt;p> bit=bno%DN;</p><p> byte=(bno-bit)/DN;</p><p> bit_setzero(bitmap[byte],bit);</p><p> char* tempbuf=NULL;</p><p> tempbuf=new char[BLOCK];</p><
67、p> for(int i=0;i<BLOCK;i++)</p><p> tempbuf[i]='\0';</p><p> fseek(pf,bno*BLOCK,SEEK_SET);</p><p> fwrite(tempbuf,sizeof(char),BLOCK,pf);</p><p> del
68、ete[]tempbuf;</p><p><b> }</b></p><p> bool TBlock::Bread(int bno,char* tempbuf)//讀塊函數(shù)</p><p><b> {</b></p><p> //a=false;</p><p
69、> int byte,bit;</p><p> if(bno>=2048)</p><p> return false;</p><p> bit=bno%DN;</p><p> byte=(bno-bit)/DN;</p><p> if(bit_on(bitmap[byte],bit)=
70、=true)</p><p><b> {</b></p><p> fseek(pf,(long)(bno*BLOCK),SEEK_SET);</p><p> fread(tempbuf,sizeof(char),BLOCK,pf);</p><p> return true;</p><
71、p><b> }</b></p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p> bool TBlock::BWrite(int bno,char* tempbuf)//寫(xiě)
72、塊函數(shù)</p><p><b> {</b></p><p> if(bno>=2048||tempbuf==NULL)</p><p> return false;</p><p> int byte,bit;</p><p> bit=bno%DN;</p>&l
73、t;p> byte=(bno-bit)/DN;</p><p> if(bit_on(bitmap[byte],bit)==false)</p><p> return false;</p><p><b> else</b></p><p><b> {</b></p>
74、<p> fseek(pf,bno*BLOCK,SEEK_SET);</p><p> fwrite(tempbuf,sizeof(char),BLOCK,pf);</p><p> return true;</p><p><b> }</b></p><p><b> }</b
75、></p><p> void TBlock::CheckFirst()//檢查存在操作文件,即模擬磁盤(pán)空間的文件,以判斷是否是第一次啟動(dòng)系統(tǒng)</p><p><b> {</b></p><p> if((pf=fopen("storage","r"))==NULL)</p>
76、<p> TBlock::first=true;</p><p><b> else</b></p><p> fclose(pf);</p><p><b> }</b></p><p> void TBlock::CreateFile(USERINFO info)//創(chuàng)建模擬
77、磁盤(pán)的文件</p><p><b> {</b></p><p> if((pf=fopen("storage","w+"))==NULL)</p><p><b> {</b></p><p> cout<<"創(chuàng)建文件失敗&qu
78、ot;<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p> char* tempbuf;</p><p> if((tempbuf=new char[512])==NULL)</p><p&
79、gt;<b> {</b></p><p> cout<<"內(nèi)存不足"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> int i;
80、</b></p><p> for(i=0;i<BLOCK;i++)</p><p> tempbuf[i]='\0';</p><p> fseek(pf,0,SEEK_SET);</p><p> for(i=0;i<BLOCKNUM;i++)//創(chuàng)建文件</p>&
81、lt;p> fwrite(tempbuf,sizeof(char),BLOCK,pf);</p><p> delete[]tempbuf;</p><p><b> }</b></p><p> void TBlock::CreateList(int bno,dir& tempdir)//創(chuàng)建目錄</p>
82、<p><b> {</b></p><p> char* tchar;</p><p> dir* tdir=NULL;</p><p> if((tchar=new char[512])==NULL)</p><p><b> {</b></p><p&g
83、t; cout<<"內(nèi)存不足"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> int i=0;</b></p><p> for(i=0;i
84、<BLOCK;i++)</p><p> tchar[i]='\0';</p><p> tdir=(dir*)(tchar);</p><p> tdir->d_fsize=BLOCK-sizeof(dir);//根目錄結(jié)構(gòu)的塊內(nèi)存儲(chǔ)偏移地址</p><p> tdir->d_gid=tempdir
85、.d_gid;</p><p> tdir->d_uid=tempdir.d_uid;</p><p> tdir->d_mode=tempdir.d_mode;</p><p><b> int na;</b></p><p> for(na=0;na<8;na++)</p>&
86、lt;p> tdir->d_name[na]=tempdir.d_name[na];</p><p> for(i=0;i<10;i++)</p><p><b> {</b></p><p> tdir->d_add[i]=tempdir.d_add[i];</p><p><b&
87、gt; }</b></p><p> tdir->d_add[0]=0;</p><p> for(i=1;i<FILENUM;i++)</p><p><b> {</b></p><p> tdir=(dir*)(tchar+i*sizeof(dir));</p>&l
88、t;p> tdir->d_mode=NONODE;</p><p><b> }</b></p><p> BWrite(bno,tchar);</p><p> delete[]tchar;</p><p><b> }</b></p><p> v
89、oid TBlock::FirstInit(USERINFO info)//第一次初始化</p><p><b> {</b></p><p> CreateFile(info);//創(chuàng)建模擬磁盤(pán)文件</p><p> int i=0,byte,bit,j;</p><p> for(i=0;i<512;i
90、++)</p><p> buf[i]='\0';</p><p> for(i=0;i<2048;i++)</p><p><b> {</b></p><p><b> bit=i%DN;</b></p><p> byte=(i-bit)
91、/DN;</p><p> bit_setzero(bitmap[byte],bit);</p><p><b> }</b></p><p> bit_setone(bitmap[0],0);//分配0#塊</p><p> int tempbno=Balloc();</p><p>
92、 for(i=0;i<256;i++)//將bitmap寫(xiě)入buf</p><p><b> {</b></p><p> buf[i]=(char)bitmap[i];</p><p><b> }</b></p><p> USERINFO temp;</p>&
93、lt;p> info.d_flag=1;</p><p> info.d_uid=0;</p><p> char* tempchar;</p><p> tempchar=(char*)(&info);</p><p> for(j=0;j<sizeof(USERINFO);j++,i++)//將超級(jí)用戶信息寫(xiě)
94、入buf</p><p> buf[i]=tempchar[j];</p><p> temp.d_flag=-1;//初始化將來(lái)將用于存儲(chǔ)用戶信息的空間</p><p> tempchar=(char*)(&temp);</p><p> for(byte=2;byte<=USERNUM;byte++)//已寫(xiě)入超級(jí)用
95、戶,所以應(yīng)從第二個(gè)開(kāi)始寫(xiě)</p><p><b> {</b></p><p> for(j=0;j<sizeof(USERINFO);j++,i++)</p><p> buf[i]=tempchar[j];</p><p><b> }</b></p><p&g
96、t; dir tempdir;//初始化根目錄結(jié)點(diǎn)</p><p> tempdir.d_mode=IFROOT;</p><p> tempdir.d_fsize=1;</p><p> tempdir.d_uid=0;</p><p> for(byte=0;byte<8;byte++)</p><p&
97、gt; tempdir.d_add[byte]=-1;</p><p> tempdir.d_name[0]='r';</p><p> tempdir.d_name[1]='o';</p><p> tempdir.d_name[2]='o';</p><p> tempdir.d_
98、name[3]='t';</p><p> tempdir.d_name[4]='\0';</p><p> tempdir.d_name[5]='\0';</p><p> tempdir.d_name[6]='\0';</p><p> tempdir.d_name[
99、7]='\0';</p><p> tempdir.d_add[0]=tempbno;</p><p> tempchar=(char*)(&tempdir);</p><p> i=BLOCK-sizeof(dir);</p><p> for(byte=0;i<BLOCK;i++,byte++)//將
100、根目錄結(jié)構(gòu)寫(xiě)入buf</p><p> buf[i]=tempchar[byte];</p><p> BWrite(0,buf);</p><p> CreateList(tempdir.d_add[0],tempdir);//創(chuàng)建目錄中的..目錄</p><p> SaveInfo();//保存位示圖</p><
101、;p><b> }</b></p><p> void TBlock::Init()//用戶登陸時(shí)的系統(tǒng)初始化</p><p><b> {</b></p><p> if((pf=fopen("storage","r+"))==NULL)</p><
102、;p><b> {</b></p><p> cout<<"系統(tǒng)初始化失敗"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p> fseek(pf,
103、0,SEEK_SET);</p><p> fread(buf,sizeof(char),BLOCK,pf);</p><p><b> int i;</b></p><p> for(i=0;i<256;i++)</p><p> bitmap[i]=(unsigned char)buf[i];</
104、p><p><b> }</b></p><p> bool TBlock::IsFirst()</p><p><b> {</b></p><p> return first;</p><p><b> }</b></p><
105、;p> void TBlock::SaveInfo()//保存當(dāng)前數(shù)據(jù)</p><p><b> {</b></p><p> fseek(pf,0,SEEK_SET);</p><p> fread(buf,sizeof(char),BLOCK,pf);</p><p> for(int i=0;i&l
106、t;256;i++)</p><p> buf[i]=(char)bitmap[i];</p><p> BWrite(0,buf);</p><p><b> }</b></p><p> void TBlock::SetFirst()</p><p><b> {</
107、b></p><p> first=false;</p><p><b> }</b></p><p> 2、以下為fileprocess.h的內(nèi)容:</p><p> #include"block.h"</p><p> TBlock block;</p
108、><p> class TFcb</p><p><b> {</b></p><p><b> public:</b></p><p><b> TFcb();</b></p><p><b> ~TFcb();</b>&l
109、t;/p><p> int Balfcb();//分配空閑fcb,-1為分配失敗</p><p> void Brefcb(int bno);//釋放fcb</p><p> bool CD(char* dirname,TUser& user);//設(shè)置目錄</p><p> bool CD__(TUser&
110、amp; user);//返回上一層目錄</p><p> bool CheckUser(string tempuser){return true;}//確認(rèn)用戶名是否存在</p><p> bool CheckPword(string temppw){return true;}//確認(rèn)密碼是否正確</p><p> bool CheckUW
111、(char* tempuser,char* tempw,TUser &refuser);//用于登陸確認(rèn)</p><p> bool CreateDir(char* dirname,TUser& user);//創(chuàng)建目錄</p><p> void Directory(TUser& user);//用于dir命令,用于遍歷目錄</p><
112、;p> bool DelDir(char* dirname,TUser& user);//用于rd命令,刪除目錄</p><p> bool DelFile(char* filename,TUser& user);//用于del命令,刪除文件</p><p> void EnterUser();//錄入用戶信息</p><p>
113、 bool FCFile(char* filename,TUser& user);//創(chuàng)建新文件</p><p> Hfcb FindFree(TUser& user);//查找存儲(chǔ)文件結(jié)構(gòu)的空閑空間</p><p> bool IsFirst();</p><p> void JustWrRight(char* fnam
114、e,TUser& user);//判斷用戶是否有權(quán)限寫(xiě),如有權(quán)限則對(duì)文件進(jìn)行寫(xiě)入</p><p> Hfcb Namei(char* fdname,TUser& user);//查找文件或目錄結(jié)構(gòu)的存儲(chǔ)位置</p><p> bool OpenFile(char* fdname,TUser& user);//用于open命令,打開(kāi)文件</p>
115、<p> void ReadFile(char* fname,TUser& user);//用于read命令,讀文件</p><p> void SaveDirfcb(SFcb* tfcb);//將更改后的fcb存到硬盤(pán)中去</p><p> void SaveFileNode();//將創(chuàng)建好的文件或目錄結(jié)構(gòu)存到硬盤(pán)中</p
116、><p> void SetFile(int flag,TUser& user,char* fname);//用于set命令,設(shè)置文件屬性</p><p> void ShowUser();//用于user命令,顯示當(dāng)前已注冊(cè)用戶信息</p><p> void WFUser(USERINFO info);//向文件中寫(xiě)入用戶信息</p>
117、<p> bool Write(dir* td);//向文件中寫(xiě)入內(nèi)容</p><p> protected:</p><p> bool first;</p><p> char* buf;</p><p><b> };</b></p><p> TFcb:
118、:TFcb()</p><p><b> {</b></p><p> if((buf=new char[BLOCK])==NULL)</p><p><b> {</b></p><p> cout<<"RAM deficient!\n";</p>
119、;<p><b> exit(0);</b></p><p><b> }</b></p><p> first=block.IsFirst();</p><p> for(int i=0;i<FCBMAX;i++)//初化始FCB數(shù)組</p><p> tfcb[i]
120、.f_flag=FCBFLAG;</p><p><b> }</b></p><p> TFcb::~TFcb()</p><p><b> {</b></p><p> delete[]buf;</p><p><b> }</b><
121、/p><p> int TFcb::Balfcb()//從數(shù)組tfcb中分配空閑fcb</p><p><b> {</b></p><p><b> int i=0;</b></p><p> for(i=0;i<FCBMAX;i++)</p><p><b
122、> {</b></p><p> if(tfcb[i].f_flag==FCBFLAG)</p><p><b> return i;</b></p><p><b> else</b></p><p><b> continue;</b></
123、p><p><b> }</b></p><p> return -1;</p><p><b> }</b></p><p> void TFcb::Brefcb(int bno)//釋放已申請(qǐng)fcb</p><p><b> {</b><
124、/p><p> tfcb[bno].f_flag=FCBFLAG;</p><p><b> }</b></p><p> bool TFcb::CD(char* dirname,TUser& user)//設(shè)置文件目錄</p><p><b> {</b></p><
125、;p> Hfcb fd=Namei(dirname,user);//查找目錄文件存儲(chǔ)的位置,</p><p> if(fd.blkno==-1)//為-1時(shí)說(shuō)明,該目錄不存在</p><p><b> {</b></p><p> cout<<"Can not find the DIR!\n";&l
126、t;/p><p> return false;</p><p><b> }</b></p><p> char* tempbuf=NULL;</p><p> if((tempbuf=new char[BLOCK])==NULL)</p><p><b> {</b>
127、</p><p> cout<<"RAM deficient!\n";</p><p> return false;</p><p><b> }</b></p><p> block.Bread(fd.blkno,tempbuf);</p><p> d
128、ir* td=(dir*)(tempbuf+fd.offset);</p><p> if(td->d_mode==IFDIR)//如果該目錄存在則將user中當(dāng)前目錄指針,指向該目錄</p><p><b> {</b></p><p> user.u_cdir->f_fsize=td->d_fsize;</p&
129、gt;<p> user.u_cdir->f_gid=td->d_gid;</p><p> user.u_cdir->f_uid=td->d_uid;</p><p> user.u_cdir->f_mode=td->d_mode;</p><p><b> int na;</b>&l
130、t;/p><p> for(na=0;na<8;na++)</p><p> user.u_cdir->f_name[na]=td->d_name[na];</p><p> for(int i=0;i<10;i++)</p><p><b> {</b></p><p&g
131、t; user.u_cdir->f_add[i]=td->d_add[i];</p><p><b> }</b></p><p> user.u_cdir->f_blkno=fd.blkno;</p><p> user.u_cdir->f_number=fd.offset;</p><p&
132、gt; delete[]tempbuf;</p><p> return true;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<&
133、lt;"Can not find the DIR!\n";</p><p> delete[]tempbuf;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p>
134、; bool TFcb::CD__(TUser &user)//用于cd..命令,進(jìn)入上一層目錄</p><p><b> {</b></p><p> char* tempbuf=NULL;</p><p> if((tempbuf=new char[BLOCK])==NULL)</p><p><
135、;b> {</b></p><p> cout<<"RAM deficient!"<<endl;</p><p> return false;</p><p><b> }</b></p><p> int blk,offset;</p>
136、<p> block.Bread(user.u_cdir->f_add[0],tempbuf);//讀出存在子目錄中根目錄的信息</p><p> dir* td=(dir*)(tempbuf);</p><p> blk=td->d_add[0];</p><p> offset=td->d_fsize;</p>
137、<p> block.Bread(blk,tempbuf);//從真正存放根目錄的地方讀出跟目錄信息</p><p> td=(dir*)(tempbuf+offset);</p><p> if(td->d_mode==IFDIR||td->d_mode==IFROOT||td->d_mode==ROOT)//確保該目錄的存在</p>
138、<p><b> {</b></p><p> user.u_cdir->f_fsize=td->d_fsize;</p><p> user.u_cdir->f_gid=td->d_gid;</p><p> user.u_cdir->f_uid=td->d_uid;</p>
139、<p> user.u_cdir->f_mode=td->d_mode;</p><p><b> int na;</b></p><p> for(na=0;na<8;na++)</p><p> user.u_cdir->f_name[na]=td->d_name[na];</p>
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--多用戶多級(jí)目錄文件系統(tǒng)實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---多用戶多級(jí)目錄文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---多用戶多級(jí)目錄文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---多用戶多級(jí)目錄文件系統(tǒng)的實(shí)現(xiàn)
- 文件管理系統(tǒng)課程設(shè)計(jì)---多用戶多級(jí)目錄文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計(jì)--樹(shù)形目錄文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--為linux系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計(jì)---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--虛擬文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
評(píng)論
0/150
提交評(píng)論