操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩12頁(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><b>  -模擬文件系統(tǒng)</b></p><p><b>  一.實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  用高級(jí)語(yǔ)言編寫和調(diào)試一個(gè)簡(jiǎn)單的文件系統(tǒng)。模擬文件管理的工作過程。加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)。</p>

2、<p><b>  二.基本要求</b></p><p>  在任意一個(gè)OS下,建立一個(gè)大文件,把它假象成一張盤,在其中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模擬UNIX文件系統(tǒng) 。 </p><p>  可以實(shí)現(xiàn)下列幾條命令</p><p>  DIR 列文件目錄</p><p>  CREATE 創(chuàng)建文

3、件</p><p>  MD 創(chuàng)建目錄</p><p>  DELF 刪除文件</p><p>  DELD 刪除目錄</p><p>  CD 改變當(dāng)前目錄</p><p>  SAVEF 保存文件</p><p> 

4、 SAVED 保存目錄</p><p>  HELP 獲得命令的幫助</p><p>  EXIT 退出系統(tǒng)</p><p><b>  三.設(shè)計(jì)思想說(shuō)明</b></p><p><b>  1.設(shè)計(jì)環(huán)境</b></p><p> 

5、 課程設(shè)計(jì)的環(huán)境是windows xp sp2操作系統(tǒng)。在windows系統(tǒng)中創(chuàng)建一個(gè)較大容量的文件,作為所設(shè)計(jì)文件系統(tǒng)的假想的“文件卷”,從而編寫各程序模塊。</p><p><b>  2.開發(fā)環(huán)境</b></p><p>  課程設(shè)計(jì)所使用的開發(fā)環(huán)境是VC++ 6.0</p><p><b>  3.基本思想</b>

6、</p><p>  以 1M 的存儲(chǔ)器空間作為文件空間,空間“分塊”。超級(jí)塊,在最前面,共占3.2k個(gè)字節(jié)。其中0.2K個(gè)字節(jié)存放目錄節(jié)點(diǎn)的位示圖,1K個(gè)字節(jié)存放文件節(jié)點(diǎn)的位示圖,2k字節(jié)存放盤塊節(jié)點(diǎn)的位示圖。用位狀態(tài)='0'表示空閑,狀態(tài)='1'表示已分配。后半部用于存放目錄接點(diǎn)和文件接點(diǎn)。超級(jí)塊不參與文件空間的動(dòng)態(tài)分配。其他塊用于存貯目錄接點(diǎn)和文件接點(diǎn)的信息。</p&g

7、t;<p><b>  四.需求分析</b></p><p>  該模擬文件系統(tǒng)包括目錄文件(簡(jiǎn)稱目錄)、普通文件(簡(jiǎn)稱文件),并實(shí)現(xiàn)下面一些基本功能:</p><p>  1.改變目錄:CD 〈目錄名〉,工作目錄轉(zhuǎn)到指定的目錄下。</p><p>  2.創(chuàng)建文件:CREATE 〈文件名〉,創(chuàng)建一個(gè)指定名字的新文件,即在目錄中增

8、加一項(xiàng),不考慮文件的內(nèi)容。</p><p>  3.刪除文件:DELF 〈文件名〉,刪除指定的文件。</p><p>  4.顯示目錄:DIR [〈目錄名〉],顯示目錄下全部文件和第一級(jí)子目錄,如果沒有指定路徑名,則顯示當(dāng)前目錄下的內(nèi)容。</p><p>  5.創(chuàng)建目錄:MD 〈目錄名〉,再指定路徑下創(chuàng)建指定的目錄,或者在沒有指定路徑時(shí),在當(dāng)前目錄下創(chuàng)建子目錄。&

9、lt;/p><p>  6.刪除目錄:DELD〈目錄名〉,刪除指定的目錄。</p><p>  7. 保存文件SAVEF 〈目錄名〉 保存指定文件</p><p>  8. 保存目錄 SAVED〈文件名〉,保存指定目錄</p><p>  9. 獲得命令幫助 HELP </p><p>  10. 退出文件系統(tǒng)

10、EXIT</p><p><b>  要考慮的特殊情況:</b></p><p>  1.各個(gè)命令對(duì)全路徑和相對(duì)路徑的支持</p><p>  <1>.目錄不存在時(shí),給出錯(cuò)誤信息</p><p>  <2>.不能用cd 進(jìn)入文件</p><p>  <3>.相對(duì)

11、路徑的解析</p><p>  <4>.路徑中的空格剔除</p><p>  2.新建目錄或文件時(shí)的問題</p><p><b>  <1>重名問題; </b></p><p>  <2>目錄或文件的名字長(zhǎng)度限制;</p><p>  <3>目錄或文

12、件的名字中包含不合法字符(注意空格)</p><p>  3.刪除目錄或文件時(shí)的問題</p><p>  <1>刪除不存在的文件或目錄,給出錯(cuò)誤提示</p><p>  <2>刪除目錄時(shí)目錄不為空; 如果該目錄為空,則可刪除,否則給出是否做刪除,刪除操作將該目錄下的全部文件和子目錄都刪除</p><p>  <3

13、>進(jìn)入到某個(gè)目錄下,卻要?jiǎng)h除本目錄或者上級(jí)目錄</p><p>  4.保存目錄和文件時(shí)的問題</p><p>  <1>保存不存在的文件和目錄,給出錯(cuò)誤的提示</p><p>  <2>保存目錄時(shí),應(yīng)當(dāng)保存其下的的子目錄和文件</p><p><b>  五.系統(tǒng)設(shè)計(jì)</b></p&

14、gt;<p><b>  流程圖</b></p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p>  <1>目錄文件結(jié)點(diǎn)信息存儲(chǔ)結(jié)構(gòu):</p><p>  struct dir_node //目錄節(jié)點(diǎn)

15、 </p><p><b>  {</b></p><p>  SYSTEMTIME ctime; //創(chuàng)建時(shí)間</p><p>  char dir_name[32]; //目錄名 </p><p

16、>  int child_dir[8]; //子目錄索引 </p><p>  int dir_count; //當(dāng)前子目錄數(shù) </p><p>  int child_file[16];

17、 //子文件索引 </p><p>  int file_count; //當(dāng)前子文件數(shù)</p><p>  int parent; //父目錄索引</p><p><b>  }</b></p>

18、<p>  <2>文件目錄存儲(chǔ)位置存儲(chǔ)結(jié)構(gòu):</p><p>  struct file_node //文件節(jié)點(diǎn)</p><p><b>  {</b></p><p>  SYSTEMTIME ctime; //創(chuàng)建時(shí)間

19、</p><p>  char file_name[32]; //文件名 </p><p>  int block[4]; //該文件占有的磁盤塊索引</p><p>  int block_count;

20、 //該文件當(dāng)前占有的磁盤塊數(shù)</p><p>  int file_length; //文件長(zhǎng)度 </p><p>  int parent; //父目錄索引</p><p><b>  } ;</b>&

21、lt;/p><p>  <3>文件、目錄、盤塊的占用的標(biāo)志位</p><p>  int dir_flag[DIR_NUM]; //各目錄節(jié)點(diǎn)占用標(biāo)志,0表示空閑,1表示被占用</p><p>  int file_flag[FILE_NUM]; //各文件節(jié)點(diǎn)的占用標(biāo)志</p>

22、<p>  int block_flag[BLOCK_NUM]; //磁盤塊的占用標(biāo)志 </p><p>  <4>常駐內(nèi)存的標(biāo)志文件(目錄)修改的標(biāo)志位和標(biāo)志文件(目錄)修改標(biāo)志位的標(biāo)志位</p><p>  int dir_change_flag[DIR_NUM]; //用于標(biāo)志目錄節(jié)

23、點(diǎn)的修改 </p><p>  int file_change_flag[FILE_NUM]; //用于標(biāo)志文件節(jié)點(diǎn)的修改 </p><p>  int dirflag_flag[DIR_NUM]; //用于標(biāo)志dir_flag

24、[DIR_NUM]的修改</p><p>  int fileflag_flag[FILE_NUM]; //用于標(biāo)志file_flag[FILE_NUM]的修改</p><p>  int blockflag_flag[BLOCK_NUM]; //用于標(biāo)志block_flag[BLOCK_NUM]的修改 </p>

25、;<p>  <5>記錄當(dāng)前路徑和當(dāng)前目錄的全局變量</p><p>  int curr; //當(dāng)前目錄索引 </p><p>  dir_node *curr_dir; //當(dāng)前目錄節(jié)點(diǎn)指針

26、 </p><p>  char curr_path[512]; //當(dāng)前路徑 </p><p><b>  主要模塊說(shuō)明</b></p><p><b>  <1>創(chuàng)建文件</b></p><p>  int get_file

27、(int parent,char *file_name) //創(chuàng)建文件節(jié)點(diǎn),成功則返回文件的索引號(hào),失敗返回-1</p><p><b>  {</b></p><p>  int index;</p><p>  if(search(parent,file_name,1,index)!=-1) //搜索在父目錄下是否有同名文件存在,有則創(chuàng)建

28、失敗</p><p><b>  {</b></p><p>  printf("File name repeated!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  for(int i=0

29、;i<FILE_NUM;i++) //搜索空閑的文件節(jié)點(diǎn) </p><p>  if(file_flag[i]==0)</p><p><b>  {</b></p><p>  strcpy(file[i].file_name,file_name);</p><p&

30、gt;  file[i].block_count=0;</p><p>  if(get_block(i)==-1) //給新創(chuàng)建的文件申請(qǐng)磁盤塊,如果失敗,創(chuàng)建文件將失敗 </p><p>  { </p><p>  printf("Disk volumn

31、error!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  file_flag[i]=1;</p><p>  fileflag_flag[i]++; //登記并給文件節(jié)點(diǎn)初始化</p><p>  fi

32、le_change_flag[i]++;</p><p>  file[i].file_length=0;</p><p>  file[i].parent=parent;</p><p>  GetLocalTime(&file[i].ctime); //獲得當(dāng)前時(shí)間</p><p>  return i; <

33、;/p><p><b>  }</b></p><p>  return -1;</p><p><b>  }</b></p><p>  int create_file(int parent,char *file_name) //在指定的目錄下創(chuàng)建文件,如果創(chuàng)建成功則返回 </p>

34、<p>  { //文件的索引號(hào),否則返回-1</p><p>  if(dir[parent].file_count==16) //如果父目錄已滿,則創(chuàng)建失敗</p><p><b>  {</b></p><p>  printf

35、("Parent directory is full!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  int pos=get_file(parent,file_name); //開始創(chuàng)建文件</p><p&g

36、t;  if(pos==-1)</p><p><b>  {</b></p><p>  printf("Create file error!\n");</p><p>  return -1;</p><p><b>  }</b></p><p> 

37、 dir_node *p=&dir[parent]; //修改父目錄的控制信息</p><p>  int top=p->file_count; </p><p>  p->child_file[top]=pos;</p><p>  p->file_count++;</p>

38、<p>  dir_change_flag[parent]++;</p><p>  return pos;</p><p><b>  }</b></p><p>  int create(char *name) //創(chuàng)建文件的主調(diào)函數(shù),前提是已經(jīng)取得要?jiǎng)?chuàng)建文件的索引</p><p>

39、  { //成功返回文件的索引號(hào),否則返回-1</p><p>  int parent,p=0;</p><p>  parent=get_parent(name,p);</p><p>  if(parent==-1) //找不到父目錄,輸入錯(cuò)誤,創(chuàng)

40、建失敗</p><p><b>  {</b></p><p>  printf("Path name error!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  return create

41、_file(parent,name+p); //開始創(chuàng)建文件</p><p><b>  }</b></p><p><b>  <2>創(chuàng)建目錄</b></p><p>  int create_dir(int parent,char *dir_name) //在指定的目錄下創(chuàng)建目

42、錄,如果成功則返回目錄 </p><p>  { //的索引號(hào),否則返回-1</p><p>  if(dir[parent].dir_count==8) //如果父目錄已滿,則創(chuàng)建失敗</p><p><b>

43、;  {</b></p><p>  printf("Parent directory is full!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  int pos=get_dir(parent,dir_name);

44、 //開始創(chuàng)建目錄</p><p>  if(pos==-1)</p><p><b>  {</b></p><p>  printf("Create directory error!\n");</p><p>  return -1;</p><p>&

45、lt;b>  }</b></p><p>  dir_node *p=&dir[parent]; //修改父目錄的控制信息</p><p>  int top=p->dir_count; </p><p>  p->child_dir[top]=pos;</p><

46、p>  p->dir_count++;</p><p>  dir_change_flag[parent]++;</p><p>  return pos;</p><p><b>  }</b></p><p>  int md(char *name) //創(chuàng)建目

47、錄的主調(diào)函數(shù),它的參數(shù)只有用戶輸入</p><p>  { //如果創(chuàng)建成功,則返回目錄的索引號(hào),否則</p><p>  int parent,p=0; //返回-1</p><p>  parent=get_parent(na

48、me,p);</p><p>  if(parent==-1) //父目錄找不到,輸入有誤,創(chuàng)建失敗</p><p><b>  {</b></p><p>  printf("Path name error!\n");</p><p>  re

49、turn -1;</p><p><b>  }</b></p><p>  return create_dir(parent,name+p); //開始創(chuàng)建目錄</p><p><b>  }</b></p><p><b>  <3>刪除文件<

50、;/b></p><p>  void del_file(int pos) //刪除文件,調(diào)用該函數(shù)的前提是已經(jīng)取得要?jiǎng)h除文件的索引號(hào) </p><p>  { </p><p>  return_block(pos

51、); //釋放磁盤塊</p><p>  file_flag[pos]=0; </p><p>  fileflag_flag[pos]++;</p><p>  file_change_flag[pos]=0;</p><p><b>  }</b></p&

52、gt;<p>  int del_file(int parent,char *file_name) //在指定的目錄下刪除文件,刪除成功則返回文件的 </p><p>  { //索引號(hào),否則返回-1</p><p>  int del_pos,in

53、dex;</p><p>  if((del_pos=search(parent,file_name,1,index))==-1)//搜索該文件是否存在,不存在則刪除失敗</p><p><b>  {</b></p><p>  printf("The file to delete not exist!\n");</

54、p><p>  return -1;</p><p><b>  }</b></p><p>  del_file(del_pos); //開始刪除文件</p><p>  dir_node *p=&dir[parent]; //修改

55、父目錄的控制信息</p><p>  if(p->file_count>=2)</p><p><b>  {</b></p><p>  int top=p->file_count-1; </p><p>  p->child_file[index]=p->child_f

56、ile[top];</p><p><b>  }</b></p><p>  p->file_count--;</p><p>  dir_change_flag[parent]++;</p><p>  return del_pos;</p><p><b>  }</b

57、></p><p>  int delfile(char *name) //刪除文件的主調(diào)函數(shù),前提是知道了刪除文件的名字</p><p><b>  {</b></p><p>  int parent,p=0;</p><p>  parent=get_parent(name,p);<

58、/p><p>  if(parent==-1)</p><p><b>  {</b></p><p>  printf("Path name error!\n");</p><p>  return -1;</p><p><b>  }</b></p

59、><p>  return del_file(parent,name+p);</p><p><b>  }</b></p><p><b>  <4>刪除目錄</b></p><p>  void del_dir(int pos) //刪除指定

60、的目錄節(jié)點(diǎn),該目錄已經(jīng)為空 </p><p><b>  {</b></p><p>  dir_flag[pos]=0; </p><p>  dirflag_flag[pos]++;</p><p>  dir_change_flag[pos]=0;</p>&

61、lt;p><b>  }</b></p><p>  void del(int pos) //刪除一個(gè)指定目錄及它下面的所有文件及所有目錄 </p><p><b>  {</b></p><p>  for(int i=0;i&

62、lt;dir[pos].file_count;i++) //刪除當(dāng)前目錄下的所有文件</p><p>  del_file(dir[pos].child_file[i]);</p><p>  for(i=0;i<dir[pos].dir_count;i++) //刪除子目錄</p><p>  del(dir[pos

63、].child_dir[i]);</p><p>  del_dir(pos); //刪除當(dāng)前目錄</p><p><b>  }</b></p><p>  void del_dir(int parent,int del_pos,int index) //在一個(gè)指定的目錄下刪除

64、一個(gè)目錄及它下面的 </p><p>  { //所有 文件及所有目錄</p><p>  del(del_pos); //開始刪除目錄</p><p>  if(dir[pa

65、rent].dir_count>=2) //修改父目錄的控制信息</p><p><b>  {</b></p><p>  int top=dir[parent].dir_count-1;</p><p>  dir[parent].child_dir[index]=dir[parent].child

66、_dir[top];</p><p><b>  }</b></p><p>  dir[parent].dir_count--;</p><p>  dir_change_flag[parent]++;</p><p><b>  }</b></p><p><b&g

67、t;  <5>保存文件</b></p><p>  void savefile(int file_id) //顯式保存文件的核心函數(shù)</p><p><b>  {</b></p><p>  if(fileflag_flag[file_id]%2!=0)

68、 //如果創(chuàng)建或刪除,需要寫回磁盤{</p><p>  write_bit(file_id,1);</p><p>  fileflag_flag[file_id]=0;</p><p><b>  }</b></p><p>  if(file_change_flag[fil

69、e_id]>0) //如果控制信息被修改,需要寫回磁盤</p><p>  {write_inode(file_id,1);</p><p>  file_change_flag[file_id]=0;</p><p>  for(int i=0;i<file[file_id].block_count;i++)&l

70、t;/p><p><b>  {</b></p><p>  int temp=file[file_id].block[i];</p><p>  if(blockflag_flag[temp]%2!=0) //如果磁盤塊被釋放或被占用,需要寫回磁盤{</p><p>  write_bit(t

71、emp,2);</p><p>  blockflag_flag[temp]=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int save_fi

72、le(int parent,char *file_name) //顯式保存文件</p><p><b>  {</b></p><p>  int pos,index;</p><p>  if((pos=search(parent,file_name,1,index))==-1)</p><p>&l

73、t;b>  {</b></p><p>  printf("The file not exist in current directory!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  savedir(parent)

74、; //保存父目錄</p><p>  savefile(pos);</p><p>  return pos;</p><p><b>  }</b></p><p>  int savefile(char *name) //保存文

75、件的主調(diào)函數(shù),前提知道了要保存的文件名 </p><p><b>  {</b></p><p>  int parent,p=0;</p><p>  parent=get_parent(name,p);</p><p>  if(parent==-1)</p>

76、<p><b>  {</b></p><p>  printf("Path name error!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  return save_file(parent,na

77、me+p);</p><p><b>  }</b></p><p><b>  <6>保存目錄</b></p><p>  void save_dir(int dir_id) //保存空目錄函數(shù)</p><p><b>  {

78、</b></p><p>  if(dirflag_flag[dir_id]%2!=0) //如果刪除或創(chuàng)建,需要寫回磁盤{</p><p>  write_bit(dir_id,0);</p><p>  dirflag_flag[dir_id]=0;</p><p>&l

79、t;b>  }</b></p><p>  if(dir_change_flag[dir_id]>0) //如果控制信息被修改,需要寫回磁盤{</p><p>  write_inode(dir_id,0);</p><p>  dir_change_flag[dir_id]=0;</p>&

80、lt;p><b>  }</b></p><p><b>  }</b></p><p>  void savedir(int dir_id) //保存一個(gè)目錄,及它的所有父目錄,用了遞歸</p><p><b>  {</b></p><

81、p>  if(dir_id==-1)</p><p><b>  return;</b></p><p>  save_dir(dir_id);</p><p>  savedir(dir[dir_id].parent);</p><p><b>  }</b></p><

82、p>  void save(int dir_id) //保存一個(gè)目錄及它下面的所有目錄及文件</p><p>  { //用了遞歸</p><p>  for(int i=0;i<dir[dir_id].dir_count;i++)<

83、;/p><p>  save(dir[dir_id].child_dir[i]);</p><p>  for(i=0;i<dir[dir_id].file_count;i++)</p><p>  savefile(dir[dir_id].child_file[i]);</p><p>  save_dir(dir_id);</p&

84、gt;<p><b>  }</b></p><p>  int save_dir(int parent,char *dir_name) //顯式保存目錄</p><p><b>  {</b></p><p>  int pos,index;</p><p> 

85、 if((pos=search(parent,dir_name,0,index))==-1)</p><p><b>  {</b></p><p>  printf("The file not exist in current directory!\n");</p><p>  return -1;</p>

86、<p><b>  }</b></p><p>  savedir(parent); //保存父目錄</p><p>  save(pos); //保存自身及下面的所有文件及目錄</p><p>  write

87、_bit(pos,0);</p><p>  return pos;</p><p><b>  }</b></p><p>  int saved(char *name) //保存目錄的主調(diào)函數(shù),前提是知道了保存目錄的名字</p><p><b>  {</b><

88、/p><p>  int parent,p=0;</p><p>  parent=get_parent(name,p);</p><p>  if(parent==-1)</p><p><b>  {</b></p><p>  printf("Path name error!\n&qu

89、ot;);</p><p>  return -1;</p><p><b>  }</b></p><p>  return save_dir(parent,name+p);</p><p><b>  }</b></p><p><b>  <7>改

90、變目錄</b></p><p>  void paste(int dir_id) //用于設(shè)置當(dāng)前路徑</p><p><b>  {</b></p><p>  if(dir_id==0)</p><p><b>  return;</

91、b></p><p>  paste(dir[dir_id].parent);</p><p>  strcat(curr_path,dir[dir_id].dir_name);</p><p>  strcat(curr_path,"/");</p><p><b>  }</b></p

92、><p>  int change_dir(char *name) //改變工作目錄,成功則返回該目</p><p>  { //錄的索引號(hào),否則返回-1</p><p>  int parent,p=0,pos,index;

93、</p><p>  if(strcmp(name,"/")==0)</p><p><b>  pos=0;</b></p><p>  else if(strcmp(name,"..")==0)</p><p>  pos=curr_dir->parent;</p&

94、gt;<p><b>  else</b></p><p><b>  {</b></p><p>  parent=get_parent(name,p);</p><p>  if(parent==-1)</p><p>  {printf("Path name e

95、rror!\n");</p><p>  return -1;</p><p><b>  }</b></p><p>  pos=search(parent,name+p,0,index);</p><p><b>  }</b></p><p>  if(

96、pos==-1) //如果該目錄不存在,則失敗</p><p><b>  {</b></p><p>  printf("The dictory not exist!\n");</p><p>  return -1;</p><p&

97、gt;<b>  }</b></p><p>  curr_path[3]='\0';</p><p>  paste(pos);</p><p>  curr=pos; //改變當(dāng)前目錄及路徑</p><p>  curr_dir

98、=&dir[curr]; </p><p>  return curr; </p><p><b>  }</b></p><p>  <8>顯示當(dāng)前目錄下的文件和子目錄

99、信息</p><p>  void show_dir(int dir_id) //以下幾個(gè)函數(shù)用于顯示當(dāng)前目錄下面的目錄和文件,</p><p>  { //跟上面不同的是,它不能顯示目錄及文件之間的關(guān)系,</p><p>  printf("%s",dir[dir

100、_id].dir_name); //但它可以顯示一些細(xì)節(jié),如創(chuàng)建時(shí)間,文件</p><p>  for(int i=strlen(dir[dir_id].dir_name);i<20;i++)</p><p>  printf(" ");</p><p>  printf("<DIR>");</

101、p><p>  for(i=25;i<30;i++)</p><p>  printf(" ");</p><p>  printf("%d-%.2d-%.2d%.2d:%.2d:%.2d\n",dir[dir_id].ctime.wYear,dir[dir_id].ctime.wMonth,dir[dir_id].ctim

102、e.wDay,dir[dir_id].ctime.wHour,dir[dir_id].ctime.wMinute,dir[dir_id].ctime.wSecond);</p><p><b>  }</b></p><p>  void show_file(int file_id) //顯示一個(gè)文件</p>&l

103、t;p>  {printf("%s",file[file_id].file_name);</p><p>  for(int i=strlen(file[file_id].file_name);i<20;i++)</p><p>  printf(" ");</p><p>  printf("<F

104、ILE>");</p><p>  for(i=26;i<30;i++)</p><p>  printf(" ");</p><p>  printf("%d-%.2d-%.2d%.2d:%.2d:%.2d",file[file_id].ctime.wYear,file[file_id].ctime.w

105、Month,file[file_id].ctime.wDay,file[file_id].ctime.wHour,file[file_id].ctime.wMinute,file[file_id].ctime.wSecond);</p><p>  for(i=0;i<8;i++)</p><p>  printf(" ");</p><p&g

106、t;  int length=file[file_id].file_length;</p><p>  printf("len: %d bytes\n",length);</p><p><b>  }</b></p><p>  void show(int dir_id) //顯示

107、目錄及文件的核心函數(shù),用了遞歸思想 </p><p>  {for(int i=0;i<dir[dir_id].file_count;i++)</p><p>  show_file(dir[dir_id].child_file[i]);</p><p>  for(i=0;i<dir[dir_id].di

108、r_count;i++)</p><p>  show_dir(dir[dir_id].child_dir[i]);</p><p><b>  }</b></p><p>  void list() //顯示文件及目錄的主調(diào)函數(shù)</p><p&g

109、t;<b>  { </b></p><p>  show(curr); //該函數(shù)的參數(shù)表示根目錄的索引</p><p>  printf("\n%d files.\n",curr_dir->file_count); //統(tǒng)計(jì)文件數(shù)</p><p&g

110、t;  printf("\n%d dirs.\n",curr_dir->dir_count); //統(tǒng)計(jì)目錄數(shù)</p><p><b>  }</b></p><p>  <8>獲得系統(tǒng)的命令的幫助</p><p>  void help() //打印命令及

111、解釋</p><p><b>  {</b></p><p>  printf("Commands: Explanation:\n\n");</p><p>  printf(" exit -Exit!\n");</p>

112、;<p>  printf(" dir -Show files and directories!\n");</p><p>  printf(" create -Create a new file!\n");</p><p>  printf(&quo

113、t; md -Create a new directory!\n");</p><p>  printf(" delf -Delete a file!\n");</p><p>  printf(" deld -De

114、lete a directory!\n");</p><p>  printf(" cd -Change the current directory!\n");</p><p>  printf(" help -Print commands!\n")

115、;</p><p>  printf(" savef -Save a file!\n");</p><p>  printf(" saved -Save a directory!\n");</p><p><b>  }</b&

116、gt;</p><p>  六.運(yùn)行結(jié)果及運(yùn)行情況</p><p>  七.實(shí)驗(yàn)總結(jié)和自我評(píng)價(jià)</p><p>  本系統(tǒng)基本上實(shí)現(xiàn)文件系統(tǒng)的部分命令。如cd、dir、create、md、delf、deld等。而且通過采用樹型數(shù)據(jù)結(jié)構(gòu),可以最多顯示64級(jí)目錄,建立512個(gè)文件節(jié)點(diǎn)。但仍存在很大不足:</p><p>  (1)沒有按照面向?qū)ο?/p>

117、思想設(shè)計(jì)程序結(jié)構(gòu),仍以函數(shù)為主,而不是對(duì)象為主;</p><p>  (2)使用太多全局變量,浪費(fèi)太多有用空間,而且存在安全隱患;</p><p>  (3)系統(tǒng)函數(shù)多,并且沒有完全按照匈牙利命名法命名函數(shù)名和變量名,程序的可讀性比較差,使得整個(gè)程序顯得清晰度不夠。</p><p>  (4)文件系統(tǒng)的測(cè)試用例還不夠多,大量測(cè)試時(shí)還存在幾個(gè)bug,特別是刪除的文件和

118、目錄時(shí)有時(shí)候難以將控制信息和標(biāo)志信息寫入硬盤。</p><p>  總的來(lái)說(shuō),這次的操作系統(tǒng)課程設(shè)計(jì)的工作量比較大,我投入了很多的時(shí)間和精力,通過和同學(xué)交流,獲得了很多的幫助和設(shè)計(jì)靈感,最終完成了系統(tǒng)的設(shè)計(jì)。不過這些付出都是值得的,因?yàn)槲沂斋@了更多。首先,在開發(fā)系統(tǒng)的過程中,我對(duì)操作系統(tǒng)的功能實(shí)現(xiàn),特別是文件管理這一塊的內(nèi)容有了較深的理解,這個(gè)理解程度是看書所無(wú)法達(dá)到的。另外,這次開發(fā)要使用到文件存取的操作來(lái)實(shí)現(xiàn)

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論