版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 操作系統(tǒng)課程設計</b></p><p> 一個多用戶多級目錄結構文件系統(tǒng)設計與實現(xiàn)</p><p><b> 一、設計思想說明</b></p><p><b> 1 設計環(huán)境</b></p><p> 課程設計的環(huán)境是Linux 操作系統(tǒng)
2、。 設計時可利用Linux 提供的文件管理的功能調用,建立一個模擬的文件系統(tǒng)?;舅枷胧?,在Linux 系統(tǒng)中創(chuàng)建一個較大容量的文件,作為所設計的文件系統(tǒng)的“文件卷”,并利用Linux 系統(tǒng)的功能調用,編寫各程序模塊。</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'表示對應塊空閑,狀態(tài)='1'表示已分配。后半部的最后32 個字節(jié)用于存放根目錄的目錄結構。0#塊不參與文件空間的動態(tài)分配。1#~(BLKMAX-1)#塊用于存放文件(普通文件和子目錄文件)的信息。</p><p><b> 二、系統(tǒng)結構的說明</b></p><p&g
5、t; 本文件管理系統(tǒng)分為五層,上層調用下層,下層為上層服務。以下為各層(由低到高)的簡要說明:</p><p> 1、塊管理層,通過TBlock類實現(xiàn)</p><p><b> 設下列主要函數(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結構的操作,定義了一些與FCB操作相關的函數(shù)</p><p> 3、打開文件管理層,通過TOFile類實現(xiàn)</p>&l
7、t;p> 功能為涉及ofile結構的操作。</p><p> 4、命令解釋層,通過TEnter類和TOrder類實現(xiàn)</p><p> 功能為接受來自用戶的命令,并解釋、執(zhí)行用戶提出的文件訪問操作。按系統(tǒng)的的功能要求,可以Open(),Close(),Read(),Write();等函數(shù)。</p><p><b> 三、數(shù)據(jù)結構的說明<
8、/b></p><p> 用戶信息的存儲結構:</p><p> struct UserNode//注冊用戶信息</p><p><b> {</b></p><p> char d_flag;//標識該用戶信息是否有效,超級用戶為用戶數(shù)目,-1表示無效</p><p> cha
9、r d_uid; /*用戶標識,為0時表示是超級*/</p><p> char d_gid; /*同組用戶標識*/</p><p> char d_name[8];/*用戶名,但不超過八個字節(jié),超過八位自動截取*/</p><p> char password[8];/*用戶密碼但不超過八位,超過八位自動截取*/</p><
10、;p><b> };</b></p><p> 目錄文件結點信息存儲結構:</p><p> struct dir</p><p><b> {</b></p><p> unsigned short d_mode; //文件屬性及訪問權限,<=0時為空結構</p>
11、<p> char d_uid; //文件主標識</p><p> char d_gid;//文件主同組用戶標識</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結構時為該目錄下文件個數(shù)</p><p> char d_name[8];//文件名</p><p>
12、int d_add[10];//存放文件信息的空間地址(塊號)</p><p><b> };</b></p><p> Fcb在內(nèi)存中的結構:</p><p> struct SFcb</p><p><b> {</b></p><p> char f_c
13、ount;/*文件訪問計數(shù)*/</p><p> char f_flag;/*標志字*/</p><p> int f_blkno;/*存放本文件目錄結構的塊號*/</p><p> int f_number;/*文件目錄結構所在塊內(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> 文件目錄存儲位置存儲結構:</p><p> struct Hfcb//用于Namei函數(shù),返回文件目錄結構存儲位置</p><p><b> {</b></p><p> int
16、 blkno;//存放本文件目錄結構的塊號</p><p> int offset;//文件目錄結構所在塊內(nèi)偏移序號</p><p><b> };</b></p><p><b> 打開文件結構:</b></p><p> struct HOFile</p><
17、;p><b> {</b></p><p> char o_flag;//標志字</p><p> int o_count;//訪問計數(shù)</p><p> struct SFcb* o_fcbp;//對就打開文件FCB結構指針</p><p> int o_offset;
18、//文件當前讀/寫指針</p><p><b> };</b></p><p> 內(nèi)存中的用戶結點結構:</p><p> struct TUser</p><p><b> {</b></p><p> char u_name[8];//用戶名,登錄時使用&
19、lt;/p><p> char u_uid;//用戶標識,文件創(chuàng)建時的文件主</p><p> char u_gid;//同組用戶標識</p><p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標識</p><p> int u_error;//執(zhí)行文件管理函數(shù)時返回的錯誤代碼,創(chuàng)建文件時被用來存儲文件設
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)調用列表</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//每個塊能存儲的文件目錄結構數(shù)量</p><p> /*FCB標志字(f_flag)的各種標志定義為:*/</p><p> #define FLOCK 01/*FCB訪問互斥標志*/</p><p> #define FUPD 02/*本FCB代表的文件
26、已修改*/</p><p> #define FCHG 04/*本FCB結構中某些信息已被修改*/</p><p> #define FCBFLAG 05 //本fcb結構未被使用</p><p> #define FCBUSE07 //本fcb結構已被使用</p><p> #define OFFLAG 06 //本HO
27、file結構未被使用</p><p> #define OFUSE 03 //本HOfile結構已被使用</p><p> //文件屬性及文件訪問權限(即d_mode和f_mode)定義:</p><p> #define ROOT 111</p><p> #define IFROOT 011//子目錄中存儲父目錄的結構&l
28、t;/p><p> #define IFMT 0070000//文件類型屏蔽字</p><p> #define IFDIR 0010000//子目錄文件</p><p> #define IFREG 0020000//普通文件</p><p> #define IREAD 0400//文件主”讀"權限</p&
29、gt;<p> #define IWRITE 0200//文件主“寫”權限</p><p> #define IEXEC 0100//文件主“執(zhí)行”權限</p><p> #define GREAD 040//同組用戶“讀”權限</p><p> #define GWRITE 020//同組用戶“寫”權限</p>
30、<p> #define GEXEC 010//同組用戶“執(zhí)行”權限</p><p> #define OREAD 04//其它用戶“讀”權限</p><p> #define OWRITE 02//其它用戶“寫”權限</p><p> #define OEXEC 01//其它用戶“執(zhí)行”權限</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;//標識該用戶信息是否有效,超級用戶為用戶數(shù)目,-1表示無效</p><p> char d_uid; /*用戶標識,為0時表示是超級*/</p><p> char d_gid; /*同組用戶標識*/</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; //文件屬性及訪問權限,<=0時為空結構</p><p> char d_uid; //文件主標識</p><p> char d_gid;//文件主同組用戶標識</p><p> int d_fsize;//文件大小(字節(jié)),作為目錄結構時為該目錄下文件個數(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;/*標志字*/</p><p> int f_blkno;/*存放本文件目錄結構的塊號*/</p><p> int f_number;/*文件目錄結構所在塊內(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ù),返回文件目錄結構存儲位置</p><p><b> {</b></p><p> int blkno;//存放本文件目錄結構的塊號<
40、;/p><p> int offset;//文件目錄結構所在塊內(nèi)偏移序號</p><p><b> };</b></p><p> #define FCBMAX 16</p><p> struct SFcb tfcb[FCBMAX]; //系統(tǒng)fcb[]結構</p><p> s
41、truct HOFile</p><p><b> {</b></p><p> char o_flag;//標志字</p><p> int o_count;//訪問計數(shù)</p><p> struct SFcb* o_fcbp;//對就打開文件FCB結構指針</p>
42、<p> int o_offset;//文件當前讀/寫指針</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;//用戶標識,文件創(chuàng)建時的文件主</p><p> char u_gid;//同組用戶標識</p>
45、<p> struct SFcb *u_cdir;//現(xiàn)行工作目錄標識</p><p> int u_error;//執(zhí)行文件管理函數(shù)時返回的錯誤代碼,創(chuàng)建文件時被用來存儲文件設置</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、次進入系統(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();//如果不是第一次登陸,則進入用戶登陸界面</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++)//設置位示圖</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);//根目錄結構的塊內(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、戶,所以應從第二個開始寫</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;//初始化根目錄結點</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、根目錄結構寫入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()//保存當前數(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);//設置目錄</p><p> bool CD__(TUser&
110、amp; user);//返回上一層目錄</p><p> bool CheckUser(string tempuser){return true;}//確認用戶名是否存在</p><p> bool CheckPword(string temppw){return true;}//確認密碼是否正確</p><p> bool CheckUW
111、(char* tempuser,char* tempw,TUser &refuser);//用于登陸確認</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);//查找存儲文件結構的空閑空間</p><p> bool IsFirst();</p><p> void JustWrRight(char* fnam
114、e,TUser& user);//判斷用戶是否有權限寫,如有權限則對文件進行寫入</p><p> Hfcb Namei(char* fdname,TUser& user);//查找文件或目錄結構的存儲位置</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)建好的文件或目錄結構存到硬盤中</p
116、><p> void SetFile(int flag,TUser& user,char* fname);//用于set命令,設置文件屬性</p><p> void ShowUser();//用于user命令,顯示當前已注冊用戶信息</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)//設置文件目錄</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中當前目錄指針,指向該目錄</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..命令,進入上一層目錄</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設計--多用戶多級目錄文件系統(tǒng)實現(xiàn)
- 操作系統(tǒng)課程設計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 文件管理系統(tǒng)課程設計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設計報告--多級文件系統(tǒng).doc
- 操作系統(tǒng)課程設計--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設計與實現(xiàn)課程設計
- 操作系統(tǒng)課程設計簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計--簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計--為linux系統(tǒng)設計一個簡單的二級文件系統(tǒng)
- 操作系統(tǒng)課程設計--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設計---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設計---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設計-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設計報告--虛擬文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計二級文件系統(tǒng)
評論
0/150
提交評論