操作系統(tǒng)課程設(shè)計(jì)---一個(gè)多用戶多級(jí)目錄結(jié)構(gòu)文件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩64頁(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)介

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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論