版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 操作系統(tǒng)課程設(shè)計</b></p><p> 一個多用戶多級目錄結(jié)構(gòu)文件系統(tǒng)設(shè)計與實現(xiàn)</p><p><b> 一、設(shè)計思想說明</b></p><p><b> 1 設(shè)計環(huán)境</b></p><p> 課程設(shè)計的環(huán)境是Linux 操作系統(tǒng)
2、。 設(shè)計時可利用Linux 提供的文件管理的功能調(diào)用,建立一個模擬的文件系統(tǒng)。基本思想是,在Linux 系統(tǒng)中創(chuàng)建一個較大容量的文件,作為所設(shè)計的文件系統(tǒng)的“文件卷”,并利用Linux 系統(tǒng)的功能調(diào)用,編寫各程序模塊。</p><p><b> 2、文件卷的組織</b></p><p> 以 1M 的存儲器空間作為文件空間,空間“分塊”,編號為 0#~(BLKMA
3、X-1)# ?!胺謮K”就是規(guī)定對文件卷的讀/寫以塊為單位,每次讀/寫的起點為塊大小的整倍數(shù)。分塊主要體現(xiàn)在文件卷的讀/寫模塊上。</p><p> # define BSIZE 512 /* 512bytes/塊 */</p><p> # define BLKMAX 2048 /* 共2048 塊 */</p><p> 0#塊的作用: 0# 塊是專用塊(超
4、級塊)。前半部用于存放文件卷空間的位示圖(bitmap),位狀態(tài)='0'表示對應(yīng)塊空閑,狀態(tài)='1'表示已分配。后半部的最后32 個字節(jié)用于存放根目錄的目錄結(jié)構(gòu)。0#塊不參與文件空間的動態(tài)分配。1#~(BLKMAX-1)#塊用于存放文件(普通文件和子目錄文件)的信息。</p><p><b> 二、系統(tǒng)結(jié)構(gòu)的說明</b></p><p&g
5、t; 本文件管理系統(tǒng)分為五層,上層調(diào)用下層,下層為上層服務(wù)。以下為各層(由低到高)的簡要說明:</p><p> 1、塊管理層,通過TBlock類實現(xiàn)</p><p><b> 設(shè)下列主要函數(shù):</b></p><p> balloc()--塊分配函數(shù)</p><p> brelse()--塊釋放函數(shù)</
6、p><p> bread()—讀一塊函數(shù)</p><p> bwrite()—寫一塊函數(shù)</p><p> 2、FCB管理層,通過TFcb類實現(xiàn)</p><p> 功能涉及到FCB結(jié)構(gòu)的操作,定義了一些與FCB操作相關(guān)的函數(shù)</p><p> 3、打開文件管理層,通過TOFile類實現(xiàn)</p>&l
7、t;p> 功能為涉及ofile結(jié)構(gòu)的操作。</p><p> 4、命令解釋層,通過TEnter類和TOrder類實現(xiàn)</p><p> 功能為接受來自用戶的命令,并解釋、執(zhí)行用戶提出的文件訪問操作。按系統(tǒng)的的功能要求,可以O(shè)pen(),Close(),Read(),Write();等函數(shù)。</p><p><b> 三、數(shù)據(jù)結(jié)構(gòu)的說明<
8、/b></p><p> 用戶信息的存儲結(jié)構(gòu):</p><p> struct UserNode//注冊用戶信息</p><p><b> {</b></p><p> char d_flag;//標(biāo)識該用戶信息是否有效,超級用戶為用戶數(shù)目,-1表示無效</p><p> cha
9、r d_uid; /*用戶標(biāo)識,為0時表示是超級*/</p><p> char d_gid; /*同組用戶標(biāo)識*/</p><p> char d_name[8];/*用戶名,但不超過八個字節(jié),超過八位自動截取*/</p><p> char password[8];/*用戶密碼但不超過八位,超過八位自動截取*/</p><
10、;p><b> };</b></p><p> 目錄文件結(jié)點信息存儲結(jié)構(gòu):</p><p> struct dir</p><p><b> {</b></p><p> unsigned short d_mode; //文件屬性及訪問權(quán)限,<=0時為空結(jié)構(gòu)</p>
11、<p> char d_uid; //文件主標(biāo)識</p><p> char d_gid;//文件主同組用戶標(biāo)識</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結(jié)構(gòu)時為該目錄下文件個數(shù)</p><p> char d_name[8];//文件名</p><p>
12、int d_add[10];//存放文件信息的空間地址(塊號)</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;/*文件訪問計數(shù)*/</p><p> char f_flag;/*標(biāo)志字*/</p><p> int f_blkno;/*存放本文件目錄結(jié)構(gòu)的塊號*/</p><p> int f_number;/*文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號*/</p><p> unsigned short f_mode; /*文件屬性*
14、/</p><p> /*以下各項信息在文件打開時從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> 文件目錄存儲位置存儲結(jié)構(gòu):</p><p> struct Hfcb//用于Namei函數(shù),返回文件目錄結(jié)構(gòu)存儲位置</p><p><b> {</b></p><p> int
16、 blkno;//存放本文件目錄結(jié)構(gòu)的塊號</p><p> int offset;//文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號</p><p><b> };</b></p><p><b> 打開文件結(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;//訪問計數(shù)</p><p> struct SFcb* o_fcbp;//對就打開文件FCB結(jié)構(gòu)指針</p><p> int o_offset;
18、//文件當(dāng)前讀/寫指針</p><p><b> };</b></p><p> 內(nèi)存中的用戶結(jié)點結(jié)構(gòu):</p><p> struct TUser</p><p><b> {</b></p><p> char u_name[8];//用戶名,登錄時使用&
19、lt;/p><p> char u_uid;//用戶標(biāo)識,文件創(chuàng)建時的文件主</p><p> char u_gid;//同組用戶標(biāo)識</p><p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標(biāo)識</p><p> int u_error;//執(zhí)行文件管理函數(shù)時返回的錯誤代碼,創(chuàng)建文件時被用來存儲文件設(shè)
20、置</p><p> char*u_base;//讀/寫文件時信息存儲區(qū)始址</p><p> int u_count;//讀/寫文件時信息字節(jié)數(shù)</p><p> int u_offset;//讀/寫文件的相對位移量</p><p> char u_obuf[8];//文件路徑名分量暫存區(qū)(查找文件時用)</p
21、><p> struct SFcb* u_pdir;//新文件父目錄FCB指針(文件創(chuàng)建時用)</p><p> struct HOFile *u_ofile[5];//本用戶打開文件表</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//每個塊能存儲的文件目錄結(jié)構(gòu)數(shù)量</p><p> /*FCB標(biāo)志字(f_flag)的各種標(biāo)志定義為:*/</p><p> #define FLOCK 01/*FCB訪問互斥標(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> //文件屬性及文件訪問權(quán)限(即d_mode和f_mode)定義:</p><p> #define ROOT 111</p><p> #define IFROOT 011//子目錄中存儲父目錄的結(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//文件主“寫”權(quán)限</p><p> #define IEXEC 0100//文件主“執(zhí)行”權(quán)限</p><p> #define GREAD 040//同組用戶“讀”權(quán)限</p><p> #define GWRITE 020//同組用戶“寫”權(quán)限</p>
30、<p> #define GEXEC 010//同組用戶“執(zhí)行”權(quán)限</p><p> #define OREAD 04//其它用戶“讀”權(quán)限</p><p> #define OWRITE 02//其它用戶“寫”權(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//注冊用戶信息</p><p><b> {</b></p>&
33、lt;p> char d_flag;//標(biāo)識該用戶信息是否有效,超級用戶為用戶數(shù)目,-1表示無效</p><p> char d_uid; /*用戶標(biāo)識,為0時表示是超級*/</p><p> char d_gid; /*同組用戶標(biāo)識*/</p><p> char d_name[8];/*用戶名,但不超過八個字節(jié),超過八位自動截取*
34、/</p><p> char password[8];/*用戶密碼但不超過八位,超過八位自動截取*/</p><p><b> };</b></p><p> struct dir</p><p><b> {</b></p><p> unsigned shor
35、t d_mode; //文件屬性及訪問權(quán)限,<=0時為空結(jié)構(gòu)</p><p> char d_uid; //文件主標(biāo)識</p><p> char d_gid;//文件主同組用戶標(biāo)識</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結(jié)構(gòu)時為該目錄下文件個數(shù)</p><p> cha
36、r d_name[8];//文件名</p><p> int d_add[10];//存放文件信息的空間地址(塊號)</p><p><b> };</b></p><p> struct SFcb</p><p><b> {</b></p><p>
37、 char f_count;/*文件訪問計數(shù)*/</p><p> char f_flag;/*標(biāo)志字*/</p><p> int f_blkno;/*存放本文件目錄結(jié)構(gòu)的塊號*/</p><p> int f_number;/*文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號*/</p><p> unsigned short f_mode
38、; /*文件屬性*/</p><p> /*以下各項信息在文件打開時從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)存儲位置</p><p><b> {</b></p><p> int blkno;//存放本文件目錄結(jié)構(gòu)的塊號<
40、;/p><p> int offset;//文件目錄結(jié)構(gòu)所在塊內(nèi)偏移序號</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;//訪問計數(shù)</p><p> struct SFcb* o_fcbp;//對就打開文件FCB結(jié)構(gòu)指針</p>
42、<p> int o_offset;//文件當(dāng)前讀/寫指針</p><p><b> };</b></p><p> #define FILENO 10</p><p> struct HOFile ofile[FILENO];//系統(tǒng)打開文件表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];//用戶名,登錄時使用</p><p> char u_uid;//用戶標(biāo)識,文件創(chuàng)建時的文件主</p><p> char u_gid;//同組用戶標(biāo)識</p>
45、<p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標(biāo)識</p><p> int u_error;//執(zhí)行文件管理函數(shù)時返回的錯誤代碼,創(chuàng)建文件時被用來存儲文件設(shè)置</p><p> char*u_base;//讀/寫文件時信息存儲區(qū)始址</p><p> int u_count;//讀/寫文件時信息字節(jié)數(shù)<
46、/p><p> int u_offset;//讀/寫文件的相對位移量</p><p> char u_obuf[8];//文件路徑名分量暫存區(qū)(查找文件時用)</p><p> struct SFcb* u_pdir;//新文件父目錄FCB指針(文件創(chuàng)建時用)</p><p> struct HOFile *u_ofile[5]
47、;//本用戶打開文件表</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><p> void CreateList(int bno,dir& tempdir);//創(chuàng)建子目錄</p><p> void FirstInit(USERINFO info);//第一
52、次進(jìn)入系統(tǒng)時的初始化</p><p> void Init();//正常初化</p><p> bool IsFirst();//返回first的值</p><p> bool BWrite(int bno,char* tempbuf);//寫一塊函數(shù)</p><p> void SaveInfo();
53、//對讀入內(nèi)存的0#塊內(nèi)容,寫入硬盤</p><p> void SetFirst();//將first置為true即,不是第一次啟動</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ù)組,以備用戶登陸時用</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、用戶第一次啟動系統(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)//寫
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()//檢查存在操作文件,即模擬磁盤空間的文件,以判斷是否是第一次啟動系統(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><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)存儲偏移地址</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><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寫入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++)//將超級用戶信息寫
94、入buf</p><p> buf[i]=tempchar[j];</p><p> temp.d_flag=-1;//初始化將來將用于存儲用戶信息的空間</p><p> tempchar=(char*)(&temp);</p><p> for(byte=2;byte<=USERNUM;byte++)//已寫入超級用
95、戶,所以應(yīng)從第二個開始寫</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é)點</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)寫入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()//用戶登陸時的系統(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);//查找存儲文件結(jié)構(gòu)的空閑空間</p><p> bool IsFirst();</p><p> void JustWrRight(char* fnam
114、e,TUser& user);//判斷用戶是否有權(quán)限寫,如有權(quán)限則對文件進(jìn)行寫入</p><p> Hfcb Namei(char* fdname,TUser& user);//查找文件或目錄結(jié)構(gòu)的存儲位置</p><p> bool OpenFile(char* fdname,TUser& user);//用于open命令,打開文件</p>
115、<p> void ReadFile(char* fname,TUser& user);//用于read命令,讀文件</p><p> void SaveDirfcb(SFcb* tfcb);//將更改后的fcb存到硬盤中去</p><p> void SaveFileNode();//將創(chuàng)建好的文件或目錄結(jié)構(gòu)存到硬盤中</p
116、><p> void SetFile(int flag,TUser& user,char* fname);//用于set命令,設(shè)置文件屬性</p><p> void ShowUser();//用于user命令,顯示當(dāng)前已注冊用戶信息</p><p> void WFUser(USERINFO info);//向文件中寫入用戶信息</p>
117、<p> bool Write(dir* td);//向文件中寫入內(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)//釋放已申請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);//查找目錄文件存儲的位置,</p><p> if(fd.blkno==-1)//為-1時說明,該目錄不存在</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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--多用戶多級目錄文件系統(tǒng)實現(xiàn)
- 操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 文件管理系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計與實現(xiàn)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--為linux系統(tǒng)設(shè)計一個簡單的二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--虛擬文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計二級文件系統(tǒng)
評論
0/150
提交評論