2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論