操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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>  學(xué) 院 計(jì)算機(jī)學(xué)院 </p><p>  專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  班 級(jí) </p&

2、gt;<p>  姓 名 </p><p>  學(xué) 號(hào) </p><p><b>  2013年1月8日</b></p><p><b>  文件系統(tǒng)管理</b></p><p><b>  一、實(shí)驗(yàn)

3、目的</b></p><p>  模擬文件系統(tǒng)的實(shí)現(xiàn)的基本功能,了解文件系統(tǒng)的基本結(jié)構(gòu)和文件系統(tǒng)的管理方法看,加深了解文件系統(tǒng)的內(nèi)部功能的實(shí)現(xiàn)。通過高級(jí)語言編寫和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件系統(tǒng),模擬文件管理的工作過程,從而對(duì)各種文件操作系統(tǒng)命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過程有比較深入的了解。</p><p><b>  二、實(shí)驗(yàn)內(nèi)容和要求</b></p>&l

4、t;p>  編程模擬一個(gè)簡(jiǎn)單的文件系統(tǒng),實(shí)現(xiàn)文件系統(tǒng)的管理和控制功能。在用戶程序中通過使用文件系統(tǒng)提供的create,open,read,write,close,delete等文件命令,對(duì)文件進(jìn)行操作。</p><p><b>  以下報(bào)告主要包括:</b></p><p><b>  1.可行性分析</b></p><

5、p><b>  2.需求分析</b></p><p><b>  3.概要設(shè)計(jì)</b></p><p><b>  4.詳細(xì)設(shè)計(jì)</b></p><p><b>  5.測(cè)試</b></p><p><b>  6.總結(jié)</b>

6、</p><p><b>  三、可行性分析</b></p><p><b>  1、技術(shù)可行性</b></p><p>  對(duì)于圖形編程還不了解,但是經(jīng)過本學(xué)期的三次實(shí)驗(yàn)的練習(xí),可以設(shè)計(jì)好命令操作界面。利用大二期間學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)可以模擬出此課程設(shè)計(jì)的要求。</p><p><b>  2

7、、經(jīng)濟(jì)可行性</b></p><p>  課程設(shè)計(jì)作為本課程的練習(xí)及進(jìn)一步加深理解。與經(jīng)濟(jì)無關(guān),可以不考慮。(零花費(fèi),零收益)</p><p><b>  3.法律可行性</b></p><p>  自己編寫的程序,僅為練習(xí),不作其他用途,與外界沒什么聯(lián)系,可行。</p><p><b>  四、需

8、求分析</b></p><p>  編寫程序?qū)崿F(xiàn)文件系統(tǒng),主要有以下幾點(diǎn)要求:</p><p>  1、實(shí)現(xiàn)無窮級(jí)目錄管理及文件管理基本操作</p><p>  2、實(shí)現(xiàn)共享“別名”</p><p><b>  3、加快了文件檢索</b></p><p><b>  五、概要

9、設(shè)計(jì)</b></p><p>  為了克服單級(jí)目錄所存在的缺點(diǎn),可以為每一位用戶建立一個(gè)單獨(dú)的用戶文件目錄UFD(User File Directory)。這些文件目錄可以具有相似的結(jié)構(gòu),它由用戶所有文件的文件控制塊組成。此外,在系統(tǒng)中再建立一個(gè)主文件目錄MFD (Master File Directory);在主文件目錄中,每個(gè)用戶目錄文件都占有一個(gè)目錄項(xiàng),其目錄項(xiàng)中包括用戶名和指向該用戶目錄的指針

10、。</p><p>  本設(shè)計(jì)主要實(shí)現(xiàn)下面幾個(gè)數(shù)據(jù)結(jié)構(gòu):</p><p><b>  總體的流程圖如下:</b></p><p><b>  六、詳細(xì)設(shè)計(jì)</b></p><p><b>  主要數(shù)據(jù)結(jié)構(gòu):</b></p><p>  1.MFD(Mas

11、ter File Directory),主要用以存放用戶,可以增加存放密碼的字符數(shù)組,本設(shè)計(jì)沒有保密安全方面的憂慮,為了使用時(shí)操作更簡(jiǎn)單省去密碼。所以,MFD結(jié)構(gòu)僅包括用戶名和指向子目錄的一個(gè)指針,以及指向下一用戶的連接點(diǎn),為線性結(jié)構(gòu)。</p><p>  struct MFD</p><p><b>  {</b></p><p>  cha

12、r name[20]; //用戶名</p><p>  UFD *bst_pointer; //文件目錄指針</p><p>  MFD *link;</p><p><b>  };</b></p><p>  2. UFD(User File Directory),用于存放文件的數(shù)據(jù)結(jié)構(gòu)。由于本設(shè)計(jì)為了

13、加快檢索速度,使用了二叉排序樹的結(jié)構(gòu),所以UFD結(jié)構(gòu)中相應(yīng)加入了用于樹結(jié)構(gòu)的parent,leftchild,和rightchild記錄鏈接情況。</p><p>  當(dāng)本文件為普通文件時(shí),為下級(jí)記錄申請(qǐng)AFD(file),folder為空。同樣,當(dāng)本文件為文件夾時(shí),為它申請(qǐng)相應(yīng)的空間,AFD為空。以此來達(dá)到無窮級(jí)別目錄的存儲(chǔ)。</p><p>  struct UFD</p>

14、<p><b>  {</b></p><p>  UFD *parent;</p><p>  UFD *leftchild;</p><p>  UFD *rightchild;</p><p>  UFD *folder; //作為文件夾時(shí)指向下一層,文件時(shí)為空</p>&

15、lt;p>  UFD *pre_folder; //指向上一層目錄(文件夾時(shí)用到)</p><p>  AFD *file; //作文文件時(shí)文件的具體內(nèi)容</p><p>  char name[30]; //文件(夾)名字</p><p>  int length; //作為文件時(shí)文件的長度,默認(rèn)為0<

16、;/p><p>  char rw; //讀寫標(biāo)志r or w</p><p>  char share; //共享標(biāo)志y or n</p><p>  char file_folder; //指示此文件是文件或文件夾,f為文件,o為文件夾</p><p><b>  };</b>&

17、lt;/p><p>  3.AFD,存放文件的內(nèi)容的結(jié)構(gòu),比較簡(jiǎn)單,文件內(nèi)容用一個(gè)字符數(shù)組存儲(chǔ),為順序結(jié)構(gòu),最多可存放99個(gè)字符</p><p>  struct AFD</p><p><b>  {</b></p><p>  char afd_file[100];</p><p>  int r

18、ead; //讀指針</p><p>  int write; //寫指針</p><p><b>  };</b></p><p><b>  4.REC</b></p><p>  struct REC //UFD的線性鏈,用于記錄共享文件

19、和已打開文件</p><p><b>  {</b></p><p>  UFD *file;</p><p>  REC *link;</p><p><b>  };</b></p><p><b>  關(guān)鍵函數(shù)說明:</b></p>

20、<p>  void Log_in(); //登陸</p><p>  void Init_user(); //創(chuàng)建用戶</p><p>  void Check_user(); //查看用戶</p><p>  以上三個(gè)函數(shù)為開始時(shí)管理用戶創(chuàng)建和登陸的函數(shù)。開始時(shí)沒有

21、用戶,需要?jiǎng)?chuàng)建后才可登陸。創(chuàng)建用戶即自動(dòng)分配一個(gè)存放用戶文件的UFD,此時(shí)的UFD為空,需要后續(xù)的創(chuàng)建文件以及文件夾的分配。</p><p>  UFD *operations(UFD *fileBST); //文件夾的操作調(diào)用</p><p>  用戶登陸后即開始對(duì)該用戶文件UFD的操作,同時(shí),若在文件夾中創(chuàng)建一個(gè)文件夾,它同樣可以分配得到一個(gè)UFD,對(duì)用戶文件的操作可以重復(fù)調(diào)用

22、,以此來達(dá)到無窮級(jí)目錄的操作。在里層文件的操作和外層的是一樣的,但若要退回外層文件夾就需要逐層返回,不能立即跳到某一層某地址。操作完畢后返回改變后的文件存儲(chǔ)狀態(tài)。</p><p>  void fcreate(UFD *fileBST); //對(duì)文件夾的六個(gè)基本操作</p><p>  UFD *fdelete(UFD *fileBST);</p>

23、;<p>  void fopen(UFD *fileBST);</p><p>  void fclose(UFD *fileBST);</p><p>  void fread_write(UFD *fileBST,char f); //讀寫操作。按選擇f=5為讀6為寫</p><p>  以上五個(gè)函數(shù)為對(duì)文件的六個(gè)基本操作,其中讀

24、文件和寫文件部分代碼相同,所以由一個(gè)函數(shù)完成。在create五個(gè)函數(shù)中,分別對(duì)文件夾fileBST做了相應(yīng)的處理,由于刪除文件的函數(shù)可能會(huì)刪除到頭結(jié)點(diǎn),所以需要一個(gè)返回值。</p><p>  void insertBST(UFD *fileBST,UFD *newBST); //在fileBST中插入新的結(jié)點(diǎn)newBST</p><p>  UFD *searchBST(UFD *fi

25、leBST,char name); //在fileBST樹中查找名字為name的結(jié)</p><p>  //點(diǎn)并返回該結(jié)點(diǎn),文件不存在則返回空</p><p>  void BSTtraverse(UFD *fileBST); //遍歷二叉樹</p><p>  UFD *deleteBST(UFD *fileBST,char na

26、me[30]); //刪除name結(jié)點(diǎn),返回刪除后的結(jié)點(diǎn)</p><p>  由于該設(shè)計(jì)的存儲(chǔ)結(jié)構(gòu)用到了二叉排序樹,所以把相關(guān)的操作寫成函數(shù),供基本操作的函數(shù)調(diào)用。insert函數(shù)在fileBST中插入新的結(jié)點(diǎn)newBST;search函數(shù)在fileBST樹中查找名字為name的結(jié)點(diǎn)并返回該結(jié)點(diǎn),文件不存在則返回空;還有traverse和delete函數(shù)對(duì)二叉排序樹做了基本的操作。</p><

27、;p>  void print_path(UFD *fileBST); //輸出當(dāng)前路徑</p><p>  void print_open_file(); //輸出已打開的文件</p><p>  為了在文件系統(tǒng)中使用戶看出路徑及一些相關(guān)的狀態(tài),設(shè)置了輸出文件路徑的函數(shù),路徑由每個(gè)文件的結(jié)構(gòu)體中pre_f

28、older記錄上一層的文件夾名字,這樣逐層輸出即可達(dá)到目的。</p><p>  每執(zhí)行一次操作就輸出一次已打開的文件的具體情況,打開的文件應(yīng)及時(shí)關(guān)閉,否則刪除時(shí)會(huì)有刪除失敗提示。</p><p>  UFD *check_share(char name[30]); //在共享鏈中檢查是否有name文件,有則//返回該UFD,沒則NULL<

29、;/p><p>  void del_in_share(UFD *node); //在共享鏈中刪除node結(jié)點(diǎn)</p><p>  以上兩個(gè)函數(shù)為對(duì)共享文件的處理函數(shù),當(dāng)打開或讀寫文件時(shí)在本層文件中未找到相應(yīng)的文件時(shí),就用check_share函數(shù)在共享文件中查找,如果存在就返回該文件的UFD,不存在就返回NULL,而del_in_share函數(shù)是伴隨著刪除文件的函

30、數(shù)出現(xiàn)的,目的是為了刪除文件以后不會(huì)在共享鏈中再存在。</p><p><b>  具體代碼如下:</b></p><p>  filesysterm.h</p><p>  struct AFD</p><p><b>  {</b></p><p>  char afd_

31、file[100];</p><p>  int read; //讀指針</p><p>  int write; //寫指針</p><p><b>  };</b></p><p>  struct UFD</p><p><b>  {<

32、/b></p><p>  UFD *parent;</p><p>  UFD *leftchild;</p><p>  UFD *rightchild;</p><p>  UFD *folder; //作為文件夾時(shí)指向下一層,文件時(shí)為空</p><p>  UFD *pre_folder;

33、 //指向上一層目錄(文件夾時(shí)用到)</p><p>  AFD *file; //作文文件時(shí)文件的具體內(nèi)容</p><p>  char name[30]; //文件(夾)名字</p><p>  int length; //作為文件時(shí)文件的長度,默認(rèn)為0</p><p>  char rw

34、; //讀寫標(biāo)志r or w</p><p>  char share; //共享標(biāo)志y or n</p><p>  char file_folder; //指示此文件是文件或文件夾,f為文件,o為文件夾</p><p><b>  };</b></p><p>  struc

35、t MFD</p><p><b>  {</b></p><p>  char name[20]; //用戶名</p><p>  UFD *bst_pointer; //文件目錄指針</p><p>  MFD *link;</p><p><b>  };</b

36、></p><p>  struct REC //UFD的線性鏈,用于記錄共享文件和已打開文件</p><p><b>  {</b></p><p>  UFD *file;</p><p>  REC *link;</p><p><b>  };</b

37、></p><p>  void Log_in(); //登陸</p><p>  void Init_user(); //創(chuàng)建用戶</p><p>  void Check_user(); //查看用戶</p><p>  UFD *operati

38、ons(UFD *fileBST); //文件夾的操作調(diào)用,user不為空時(shí)為第一層</p><p>  void fcreate(UFD *fileBST); //對(duì)文件夾的六個(gè)基本操作</p><p>  UFD *fdelete(UFD *fileBST);</p><p>  void fopen(UFD *fileB

39、ST);</p><p>  void fclose(UFD *fileBST);</p><p>  void fread_write(UFD *fileBST,char f); //代碼有重復(fù),合并讀寫操作。按選擇s=5為讀6為寫</p><p>  void insertBST(UFD *fileBST,UFD *newBST); //新文件插

40、入到user文件樹中</p><p>  UFD *searchBST(UFD *fileBST,char name); //在fileBST樹中查找名字為name的結(jié)點(diǎn)并返回該結(jié)點(diǎn)</p><p>  //文件不存在則返回空</p><p>  void BSTtraverse(UFD *fileBST); //遍歷二叉樹<

41、/p><p>  UFD *deleteBST(UFD *fileBST,char name[30]); //刪除成功返回1,失敗返回0</p><p>  void print_path(UFD *fileBST); //輸出當(dāng)前路徑</p><p>  void print_open_file();

42、 //輸出已打開的文件</p><p>  UFD *check_share(char name[30]); //在共享鏈中檢查是否有name文件,有則返回UFD,沒則NULL</p><p>  void del_in_share(UFD *node); //在共享鏈中刪除node結(jié)點(diǎn)</p><p><b&g

43、t;  main.cpp</b></p><p>  #include <iostream></p><p>  #include<conio.h></p><p>  #include"filesystem.h"</p><p>  MFD *mfd_link=NULL;

44、 //用戶鏈表</p><p>  MFD *pre_user; //當(dāng)前操作用戶</p><p>  UFD *pre_opera_folder=NULL;//當(dāng)前操作文件夾</p><p>  int folder_depth=0; //記錄當(dāng)前文件深度(用于輔助p

45、re_folder的初始化)</p><p>  REC *share_file=NULL;</p><p>  REC *open_file=NULL;</p><p>  void print_path(UFD *fileBST) //輸出路徑</p><p><b>  {</b></p>

46、<p>  if(fileBST->pre_folder!=NULL)</p><p>  { print_path(fileBST->pre_folder);</p><p>  printf("/%s",fileBST->pre_folder->name);</p><p><b>  }&l

47、t;/b></p><p><b>  else</b></p><p>  printf("/%s",pre_user->name);</p><p><b>  }</b></p><p>  void print_open_file()</p>&

48、lt;p><b>  {</b></p><p>  REC *temp;</p><p><b>  int i=5;</b></p><p>  temp=open_file;</p><p>  while(temp!=NULL)</p><p><b>

49、;  {</b></p><p>  printf("%s\t%d\t\t",temp->file->name,temp->file->length);</p><p>  if(temp->file->rw=='r')printf("只讀\t");</p><p&g

50、t;  else printf("可讀寫\t");</p><p>  if(temp->file->share=='y')printf("是\t");</p><p>  else printf("否\t");</p><p>  for(i=0;i<5;i++)<

51、/p><p><b>  {</b></p><p>  if(temp->file->file->afd_file[i]!='\0')</p><p>  printf("%c",temp->file->file->afd_file[i]);</p><p

52、>  else break;</p><p><b>  }</b></p><p>  if(temp->file->file->afd_file[i]!='\0'&&i==5) printf("..");</p><p>  printf("\n"

53、;);</p><p>  temp=temp->link;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void BSTtraverse(UFD *fileBST) //遍歷二叉樹(前序遍歷)</p>&

54、lt;p><b>  {</b></p><p>  UFD *left,*right;</p><p>  printf("%s",fileBST->name);</p><p>  if(fileBST->file_folder=='o') //輸出..以區(qū)分文件夾</p&

55、gt;<p>  printf("..\t");</p><p><b>  else</b></p><p>  printf("\t");</p><p>  if(fileBST->leftchild!=NULL) //遞歸</p><p

56、><b>  {</b></p><p>  left=fileBST->leftchild;</p><p>  BSTtraverse(left);</p><p><b>  }</b></p><p>  if(fileBST->rightchild!=NULL)</

57、p><p><b>  {</b></p><p>  right=fileBST->rightchild;</p><p>  BSTtraverse(right);</p><p><b>  }</b></p><p><b>  }</b>&l

58、t;/p><p>  UFD *searchBST(UFD *fileBST,char name[30])//在fileBST樹中查找名字為name的結(jié)點(diǎn)并返回該結(jié)點(diǎn)</p><p>  { //文件不存在則返回空</p><p><b>  int flag;</b>

59、</p><p>  flag=strcmp(fileBST->name,name);</p><p>  if(flag==0)</p><p>  return fileBST; //查找成功</p><p>  else if(flag>0)</p><p>&

60、lt;b>  {</b></p><p>  if(fileBST->leftchild==NULL) return NULL; //查找失敗</p><p><b>  else</b></p><p>  searchBST(fileBST->leftchild,name); //遞

61、歸調(diào)用</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(fileBST->rightchild==NULL) return NULL;</p><

62、;p><b>  else</b></p><p>  searchBST(fileBST->rightchild,name);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void insertBST(UFD

63、 *fileBST,UFD *newBST) //將結(jié)點(diǎn)newBST插入原二叉樹fileBST中</p><p><b>  {</b></p><p><b>  int flag;</b></p><p>  flag=strcmp(fileBST->name,newBST->name

64、);</p><p>  if(flag>0)</p><p><b>  {</b></p><p>  if(fileBST->leftchild==NULL) //插入</p><p><b>  {</b></p><p> 

65、 fileBST->leftchild=newBST;</p><p>  newBST->parent=fileBST;</p><p><b>  }</b></p><p><b>  else</b></p><p>  insertBST(fileBST->leftchi

66、ld,newBST); //遞歸調(diào)用</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(fileBST->rightchild==NULL)

67、 //插入</p><p><b>  {</b></p><p>  fileBST->rightchild=newBST;</p><p>  newBST->parent=fileBST;</p><p><b>  }</b></p><p><

68、b>  else</b></p><p>  insertBST(fileBST->rightchild,newBST); //遞歸調(diào)用</p><p><b>  }</b></p><p>  /*flag=0 的情況已在創(chuàng)建時(shí)排除*/</p><p><b>  }</b

69、></p><p>  UFD *deleteBST(UFD *fileBST,char name[30])//刪除名字問name的文件結(jié)點(diǎn)</p><p><b>  {</b></p><p>  UFD *parent_file=NULL,*del_file=NULL;</p><p>  UFD *move

70、_file=NULL,*move_file_parent;</p><p>  del_file=searchBST(fileBST,name);</p><p>  if(del_file==NULL)</p><p><b>  {</b></p><p>  printf("沒有此文件,刪除失??!\n&q

71、uot;);</p><p><b>  getch();</b></p><p>  return fileBST; //查找失敗</p><p><b>  }</b></p><p>  if(del_file->file_folder=='o'&

72、&strcmp(del_file->folder->name,"NULL")!=0)</p><p>  { printf("注意,本系統(tǒng)未能實(shí)現(xiàn)級(jí)聯(lián)刪除,請(qǐng)先逐個(gè)刪除文件!");</p><p>  printf("文件夾非空,刪除失?。n");</p><p><b>

73、;  getch();</b></p><p>  return fileBST;</p><p><b>  }</b></p><p>  if(del_file->share=='y') //先在共享鏈中刪除</p><p>  del_in_share(de

74、l_file);</p><p>  parent_file=del_file->parent;</p><p>  if(del_file->leftchild==NULL&&del_file->rightchild==NULL) //被刪除結(jié)點(diǎn)為子葉結(jié)點(diǎn)</p><p><b>  {</b>&

75、lt;/p><p>  if(del_file==fileBST) //只有一個(gè)結(jié)點(diǎn)</p><p><b>  {</b></p><p>  strcpy(fileBST->name,"NULL");</p><p><b>  }</

76、b></p><p>  else if(parent_file->leftchild==del_file)</p><p><b>  {</b></p><p>  parent_file->leftchild=NULL;</p><p>  free(del_file);</p>&

77、lt;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  parent_file->rightchild=NULL;</p><p>  free(del_file);</p&g

78、t;<p><b>  }</b></p><p><b>  }</b></p><p>  else if(del_file->leftchild==NULL||del_file->rightchild==NULL) //被刪除結(jié)點(diǎn)沒有做孩子或右孩子</p><p><b&g

79、t;  {</b></p><p>  if(del_file->leftchild==NULL) //沒有左孩子</p><p><b>  {</b></p><p>  if(parent_file==NULL)//刪除的為根結(jié)點(diǎn)</p>

80、<p><b>  {</b></p><p>  fileBST=del_file->rightchild;</p><p>  del_file->rightchild->parent=NULL;</p><p><b>  }</b></p><p>  els

81、e if(parent_file->leftchild==del_file) //右孩子接上</p><p><b>  {</b></p><p>  parent_file->leftchild=del_file->rightchild;</p><p>  del_file->rightchild-&

82、gt;parent=parent_file;</p><p><b>  }</b></p><p>  else //右孩子接上</p><p><b>  {</b></p><p>  parent_file

83、->rightchild=del_file->rightchild;</p><p>  del_file->rightchild->parent=parent_file;</p><p><b>  }</b></p><p><b>  }</b></p><p>  e

84、lse //沒有右孩子</p><p><b>  {</b></p><p>  if(parent_file==NULL)//刪除的為根結(jié)點(diǎn)</p><p><b>  {</b></p>

85、;<p>  fileBST=del_file->leftchild;</p><p>  del_file->leftchild->parent=NULL;</p><p><b>  }</b></p><p>  else if(parent_file->leftchild==del_file)

86、 //左孩子接上</p><p><b>  {</b></p><p>  parent_file->leftchild=del_file->leftchild;</p><p>  del_file->leftchild->parent=parent_file;</p><p><

87、;b>  }</b></p><p>  else //左孩子接上</p><p><b>  {</b></p><p>  parent_file->rightchild=del_file->leftchild;</p&

88、gt;<p>  del_file->leftchild->parent=parent_file;</p><p><b>  }</b></p><p><b>  }</b></p><p>  free(del_file);</p><p><b>  }&

89、lt;/b></p><p>  else //左右孩子都有</p><p><b>  {</b></p><p>  move_file_parent=del_file->leftchild;</p>&l

90、t;p>  move_file=move_file_parent->rightchild;</p><p>  if(move_file==NULL) //被刪除結(jié)點(diǎn)的左孩子沒有右孩子</p><p><b>  {</b></p><p>  if(parent_file==NULL)

91、 //刪除的為根結(jié)點(diǎn)</p><p><b>  {</b></p><p>  fileBST=move_file_parent;</p><p>  fileBST->rightchild=del_file->rightchild;</p><p>  fileBST->pa

92、rent=NULL;</p><p><b>  }</b></p><p>  else if(parent_file->leftchild==del_file)</p><p>  parent_file->leftchild=move_file_parent;</p><p><b>  el

93、se</b></p><p>  parent_file->rightchild=move_file_parent;</p><p>  move_file_parent->parent=parent_file;</p><p>  move_file_parent->rightchild=del_file->rightchild

94、;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while(move_file->rightchild!=NULL) //尋找右邊最底下的結(jié)點(diǎn)&

95、lt;/p><p><b>  {</b></p><p>  move_file=move_file->rightchild;</p><p>  move_file_parent=move_file_parent->rightchild;</p><p><b>  }</b></

96、p><p>  move_file_parent->rightchild=NULL;</p><p>  move_file->leftchild=del_file->leftchild;</p><p>  move_file->rightchild=del_file->rightchild;</p><p>  

97、if(move_file->rightchild!=NULL)</p><p>  move_file->rightchild->parent=move_file; //右孩子的雙親也要改變</p><p>  move_file->parent=del_file->parent;</p><p>  if(fileBST

98、==del_file) //刪除的為根結(jié)點(diǎn)</p><p>  fileBST=move_file;</p><p>  free(del_file);</p><p><b>  }</b></p><p><b>  }</b></p><p>

99、;  printf("成功刪除文件%s\n",name);</p><p><b>  getch();</b></p><p>  return fileBST;</p><p><b>  }</b></p><p>  void del_in_share(UFD *node

100、)</p><p><b>  {</b></p><p>  REC *first,*second;</p><p>  first=share_file;</p><p>  second=share_file->link;</p><p>  if(second==NULL)</

101、p><p>  {share_file=NULL;free(first);}</p><p><b>  else</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  if(second->fi

102、le==node)</p><p>  {first->link=second->link;free(second);}</p><p><b>  else</b></p><p><b>  {</b></p><p>  first=first->link;</p>

103、;<p>  second=second->link;</p><p><b>  }</b></p><p>  }while(second!=NULL);</p><p><b>  }</b></p><p>  void fcreate(UFD *fileBST)

104、 //在fileBST的同一層創(chuàng)建文件</p><p><b>  {</b></p><p><b>  char s;</b></p><p>  char name[30];</p><p>  int flag=0;</p><p>  UFD *newfile,*

105、temp=NULL;</p><p>  REC *stemp;</p><p>  system("cls");</p><p>  printf("----------------------------------------------------------------\n");</p><p&g

106、t;  printf("------------------- 文 件 系 統(tǒng)/創(chuàng) 建 文 件---------------------\n");</p><p>  printf("----------------------------------------------------------------\n\n");</p><p><

107、b>  do</b></p><p><b>  {</b></p><p>  printf(" 1. 創(chuàng)建文件 \n");</p><p>  printf(" 2. 創(chuàng)建文件夾 \n");</p>

108、;<p>  printf(" 3. 取消 \n");</p><p>  printf("請(qǐng)選擇:\n");</p><p>  scanf("%c",&s);</p><p>  fflush(stdin);</p>&

109、lt;p>  if(s=='3')return;</p><p>  if(s!='1'&&s!='2')</p><p>  printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");</p><p>  }while(s!='1'&&s!='2

110、');</p><p>  if(strcmp(fileBST->name,"NULL")==0) //節(jié)點(diǎn)已有(未賦值)用于本層文件夾的第一個(gè)文件的特殊情況</p><p>  newfile=fileBST;</p><p><b>  else{</b></p><p>  n

111、ewfile=(UFD*)malloc(sizeof(UFD)); //創(chuàng)建樹節(jié)點(diǎn)</p><p>  newfile->leftchild=NULL;</p><p>  newfile->rightchild=NULL;</p><p><b>  }</b></p><p>  prin

112、tf("請(qǐng)輸入文件(夾)名:");</p><p>  scanf("%s",name);</p><p>  fflush(stdin);</p><p>  //搜索二叉樹,文件重名就創(chuàng)建失敗</p><p>  temp=searchBST(fileBST,name);</p>&l

113、t;p>  if(temp!=NULL)</p><p><b>  {</b></p><p>  printf("已存在該文件(夾),創(chuàng)建失敗!\n");</p><p>  strcpy(newfile->name,"NULL");</p><p><b&g

114、t;  return;</b></p><p><b>  }</b></p><p>  strcpy(newfile->name,name);</p><p>  if(folder_depth==1)</p><p>  newfile->pre_folder=NULL;</p>

115、<p><b>  else</b></p><p>  newfile->pre_folder=pre_opera_folder;//指向正在操作文件夾</p><p>  while(1) //讀寫否,共享否</p><p><b>  {</b><

116、;/p><p>  printf("只讀r還是可讀寫w:");</p><p>  scanf("%c",&(newfile->rw));</p><p>  fflush(stdin);</p><p>  printf("是否共享y/n:");</p>&

117、lt;p>  scanf("%c",&(newfile->share));</p><p>  fflush(stdin);</p><p>  if((newfile->rw=='r'||newfile->rw=='w')&&(newfile->share=='y'|

118、|newfile->share=='n'))</p><p><b>  break;</b></p><p>  printf("輸入有誤,請(qǐng)重新輸入!\n");</p><p><b>  }</b></p><p>  //***********以下為

119、文件和文件夾初始化中不同的地方******************</p><p>  if(s=='1')</p><p><b>  {</b></p><p>  newfile->file_folder='f';</p><p>  newfile->folder=NU

120、LL;</p><p>  newfile->file=(AFD*)malloc(sizeof(AFD));</p><p>  printf("請(qǐng)輸入文件的內(nèi)容(<100):");</p><p>  scanf("%s",newfile->file->afd_file);</p>&l

121、t;p>  fflush(stdin);</p><p>  newfile->length=strlen(newfile->file->afd_file);</p><p><b>  }</b></p><p>  else //文

122、件夾的初始化</p><p><b>  {</b></p><p>  newfile->file_folder='o';</p><p>  newfile->file=NULL;</p><p>  newfile->length=0;</p><p>  

123、newfile->folder=(UFD*)malloc(sizeof(UFD)); //連上一個(gè)空文件節(jié)點(diǎn)</p><p>  newfile->folder->pre_folder=newfile;</p><p>  newfile->folder->leftchild=NULL;</p><p>  strcpy(newfi

124、le->folder->name,"NULL");</p><p>  newfile->folder->rightchild=NULL;</p><p><b>  }</b></p><p>  //*************************************************

125、***************</p><p>  if(fileBST!=newfile)</p><p>  insertBST(fileBST,newfile); //初始化完成后插入到二叉樹中</p><p><b>  else</b></p><p>  newfile->parent=NULL;//第

126、一個(gè)結(jié)點(diǎn)略去插入,其雙親結(jié)點(diǎn)為空</p><p>  if(newfile->share=='y') //接入共享鏈</p><p><b>  {</b></p><p>  stemp=((REC*)malloc(sizeof(REC)));</p><p>

127、  stemp->file=newfile;</p><p>  stemp->link=share_file;</p><p>  share_file=stemp;</p><p><b>  }</b></p><p><b>  }</b></p><p>

128、;  UFD *fdelete(UFD *fileBST) //在fileBST的同一層刪除文件</p><p><b>  {</b></p><p>  char name[30];</p><p>  REC *temp;</p><p>  printf("請(qǐng)輸入要?jiǎng)h除的文件:");

129、</p><p>  scanf("%s",name);</p><p>  fflush(stdin);</p><p>  temp=open_file; //檢查文件是否打開,打開則刪除失敗</p><p>  while(temp!=NULL)</p><p>

130、;<b>  {</b></p><p>  if(strcmp(temp->file->name,name)==0)</p><p>  { printf("文件打開中,請(qǐng)關(guān)閉后再刪除!");</p><p><b>  getch();</b></p><p>

131、;  return fileBST;</p><p><b>  }</b></p><p>  else temp=temp->link;</p><p><b>  }</b></p><p>  fileBST=deleteBST(fileBST,name);</p>&l

132、t;p>  return fileBST;</p><p><b>  }</b></p><p>  void fopen(UFD *fileBST)</p><p><b>  {</b></p><p>  char name[30];</p><p>  UFD

133、 *temp=NULL,*temp1=NULL;</p><p>  printf("請(qǐng)輸入要打開的文件的名字:");</p><p>  scanf("%s",name);</p><p>  fflush(stdin);</p><p>  temp=searchBST(fileBST,name);

134、</p><p>  if(temp==NULL)</p><p><b>  {</b></p><p>  printf("文件不存在!\n");</p><p>  temp=check_share(name);</p><p>  if(temp==NULL)</

135、p><p>  { printf("文件不存在!\n");</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //*********

136、**********找到文件,以下為打開部分**********************</p><p>  if(temp->file_folder=='o') //打開文件夾</p><p><b>  {</b></p><p>  folder_depth++;</p>&l

137、t;p>  temp1=pre_opera_folder; //保護(hù)正在操作文件</p><p>  pre_opera_folder=temp;</p><p>  temp->folder=operations(temp->folder);</p><p>  pre_opera_folder=temp1; //

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論