版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- linux文件系統(tǒng)管理-
- 操作系統(tǒng)課程設(shè)計(jì)--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計(jì)---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)----二級(jí)文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--二級(jí)文件系統(tǒng)設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--二級(jí)文件系統(tǒng)(java)
- 操作系統(tǒng)課程設(shè)計(jì)--文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)linux二級(jí)文件系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論