




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、評定等級 操作系統(tǒng)課程設(shè)計文件系統(tǒng)管理學(xué) 院 計算機學(xué)院 專 業(yè) 計算機科學(xué)與技術(shù) 班 級 姓 名 學(xué) 號 2013年1月8日廣東工業(yè)大學(xué)計算機學(xué)院制文件系統(tǒng)管理一、實驗?zāi)康哪M文件系統(tǒng)的實現(xiàn)的基本功能,了解文件系統(tǒng)的基本結(jié)構(gòu)和文件系統(tǒng)的管理方法看,加深了解文件系統(tǒng)的內(nèi)部功能的實現(xiàn)。通過高級語言編寫和實現(xiàn)一個簡單的文件系統(tǒng),模擬文件管理的工作過程,從而對各種文件操作系統(tǒng)命令的實質(zhì)內(nèi)容和執(zhí)行過程有比較深入的了解。二、實驗內(nèi)容和要求編程模擬一個簡單的文件系統(tǒng),實現(xiàn)文件系統(tǒng)的管理和控制功能。在用戶程序中通過使用文件系統(tǒng)提供的create,open,read,write,close,delete等文件
2、命令,對文件進行操作。以下報告主要包括:1.可行性分析2.需求分析3.概要設(shè)計4.詳細設(shè)計5.測試6.總結(jié)三、可行性分析1、技術(shù)可行性對于圖形編程還不了解,但是經(jīng)過本學(xué)期的三次實驗的練習(xí),可以設(shè)計好命令操作界面。利用大二期間學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)可以模擬出此課程設(shè)計的要求。2、經(jīng)濟可行性課程設(shè)計作為本課程的練習(xí)及進一步加深理解。與經(jīng)濟無關(guān),可以不考慮。(零花費,零收益)3.法律可行性自己編寫的程序,僅為練習(xí),不作其他用途,與外界沒什么聯(lián)系,可行。四、需求分析編寫程序?qū)崿F(xiàn)文件系統(tǒng),主要有以下幾點要求:1、實現(xiàn)無窮級目錄管理及文件管理基本操作2、實現(xiàn)共享“別名”3、加快了文件檢索五、概要設(shè)計為了克服單級目
3、錄所存在的缺點,可以為每一位用戶建立一個單獨的用戶文件目錄UFD(User File Directory)。這些文件目錄可以具有相似的結(jié)構(gòu),它由用戶所有文件的文件控制塊組成。此外,在系統(tǒng)中再建立一個主文件目錄MFD (Master File Directory);在主文件目錄中,每個用戶目錄文件都占有一個目錄項,其目錄項中包括用戶名和指向該用戶目錄的指針。本設(shè)計主要實現(xiàn)下面幾個數(shù)據(jù)結(jié)構(gòu):M D F用戶名文件目錄指針用戶名文件目錄指針 U F D文件名保護碼文件長度文件名···A F D打開文件名打開保護碼讀寫指針總體的流程圖如下:六、詳細設(shè)計主要數(shù)據(jù)結(jié)構(gòu)
4、:1.MFD(Master File Directory),主要用以存放用戶,可以增加存放密碼的字符數(shù)組,本設(shè)計沒有保密安全方面的憂慮,為了使用時操作更簡單省去密碼。所以,MFD結(jié)構(gòu)僅包括用戶名和指向子目錄的一個指針,以及指向下一用戶的連接點,為線性結(jié)構(gòu)。struct MFD char name20; /用戶名 UFD *bst_pointer; /文件目錄指針 MFD *link;2. UFD(User File Directory),用于存放文件的數(shù)據(jù)結(jié)構(gòu)。由于本設(shè)計為了加快檢索速度,使用了二叉排序樹的結(jié)構(gòu),所以UFD結(jié)構(gòu)中相應(yīng)加入了用于樹結(jié)構(gòu)的parent,leftchild,和righ
5、tchild記錄鏈接情況。當本文件為普通文件時,為下級記錄申請AFD(file),folder為空。同樣,當本文件為文件夾時,為它申請相應(yīng)的空間,AFD為空。以此來達到無窮級別目錄的存儲。struct UFD UFD *parent; UFD *leftchild; UFD *rightchild; UFD *folder; /作為文件夾時指向下一層,文件時為空 UFD *pre_folder; /指向上一層目錄(文件夾時用到) AFD *file; /作文文件時文件的具體內(nèi)容 char name30; /文件(夾)名字 int length; /作為文件時文件的長度,默認為0 char rw
6、; /讀寫標志r or w char share; /共享標志y or n char file_folder; /指示此文件是文件或文件夾,f為文件,o為文件夾;3.AFD,存放文件的內(nèi)容的結(jié)構(gòu),比較簡單,文件內(nèi)容用一個字符數(shù)組存儲,為順序結(jié)構(gòu),最多可存放99個字符struct AFD char afd_file100; int read; /讀指針 int write; /寫指針;4.RECstruct REC /UFD的線性鏈,用于記錄共享文件和已打開文件 UFD *file; REC *link;關(guān)鍵函數(shù)說明:void Log_in(); /登陸void Init_user(); /創(chuàng)建
7、用戶void Check_user(); /查看用戶以上三個函數(shù)為開始時管理用戶創(chuàng)建和登陸的函數(shù)。開始時沒有用戶,需要創(chuàng)建后才可登陸。創(chuàng)建用戶即自動分配一個存放用戶文件的UFD,此時的UFD為空,需要后續(xù)的創(chuàng)建文件以及文件夾的分配。UFD *operations(UFD *fileBST); /文件夾的操作調(diào)用用戶登陸后即開始對該用戶文件UFD的操作,同時,若在文件夾中創(chuàng)建一個文件夾,它同樣可以分配得到一個UFD,對用戶文件的操作可以重復(fù)調(diào)用,以此來達到無窮級目錄的操作。在里層文件的操作和外層的是一樣的,但若要退回外層文件夾就需要逐層返回,不能立即跳到某一層某地址。操作完畢后返回改變后的文件存
8、儲狀態(tài)。void fcreate(UFD *fileBST); /對文件夾的六個基本操作UFD *fdelete(UFD *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f); /讀寫操作。按選擇f=5為讀6為寫以上五個函數(shù)為對文件的六個基本操作,其中讀文件和寫文件部分代碼相同,所以由一個函數(shù)完成。在create五個函數(shù)中,分別對文件夾fileBST做了相應(yīng)的處理,由于刪除文件的函數(shù)可能會刪除到頭結(jié)點,所以需要一個返回值。void insertBST(
9、UFD *fileBST,UFD *newBST); /在fileBST中插入新的結(jié)點newBSTUFD *searchBST(UFD *fileBST,char name); /在fileBST樹中查找名字為name的結(jié) /點并返回該結(jié)點,文件不存在則返回空void BSTtraverse(UFD *fileBST); /遍歷二叉樹UFD *deleteBST(UFD *fileBST,char name30); /刪除name結(jié)點,返回刪除后的結(jié)點由于該設(shè)計的存儲結(jié)構(gòu)用到了二叉排序樹,所以把相關(guān)的操作寫成函數(shù),供基本操作的函數(shù)調(diào)用。insert函數(shù)在fileBST中插入新的結(jié)點newBST
10、;search函數(shù)在fileBST樹中查找名字為name的結(jié)點并返回該結(jié)點,文件不存在則返回空;還有traverse和delete函數(shù)對二叉排序樹做了基本的操作。void print_path(UFD *fileBST); /輸出當前路徑void print_open_file(); /輸出已打開的文件為了在文件系統(tǒng)中使用戶看出路徑及一些相關(guān)的狀態(tài),設(shè)置了輸出文件路徑的函數(shù),路徑由每個文件的結(jié)構(gòu)體中pre_folder記錄上一層的文件夾名字,這樣逐層輸出即可達到目的。每執(zhí)行一次操作就輸出一次已打開的文件的具體情況,打開的文件應(yīng)及時關(guān)閉,否則刪除時會有刪除失敗提示。UFD *check_shar
11、e(char name30); /在共享鏈中檢查是否有name文件,有則/返回該UFD,沒則NULLvoid del_in_share(UFD *node); /在共享鏈中刪除node結(jié)點以上兩個函數(shù)為對共享文件的處理函數(shù),當打開或讀寫文件時在本層文件中未找到相應(yīng)的文件時,就用check_share函數(shù)在共享文件中查找,如果存在就返回該文件的UFD,不存在就返回NULL,而del_in_share函數(shù)是伴隨著刪除文件的函數(shù)出現(xiàn)的,目的是為了刪除文件以后不會在共享鏈中再存在。具體代碼如下:filesysterm.hstruct AFD char afd_file100; int read; /讀
12、指針 int write; /寫指針;struct UFD UFD *parent; UFD *leftchild; UFD *rightchild; UFD *folder; /作為文件夾時指向下一層,文件時為空UFD *pre_folder; /指向上一層目錄(文件夾時用到) AFD *file; /作文文件時文件的具體內(nèi)容 char name30; /文件(夾)名字 int length; /作為文件時文件的長度,默認為0 char rw; /讀寫標志r or w char share; /共享標志y or n char file_folder; /指示此文件是文件或文件夾,f為文件,o
13、為文件夾;struct MFD char name20; /用戶名 UFD *bst_pointer; /文件目錄指針 MFD *link;struct REC /UFD的線性鏈,用于記錄共享文件和已打開文件 UFD *file; REC *link;void Log_in(); /登陸void Init_user(); /創(chuàng)建用戶void Check_user(); /查看用戶UFD *operations(UFD *fileBST); /文件夾的操作調(diào)用,user不為空時為第一層void fcreate(UFD *fileBST); /對文件夾的六個基本操作UFD *fdelete(UFD
14、 *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f); /代碼有重復(fù),合并讀寫操作。按選擇s=5為讀6為寫void insertBST(UFD *fileBST,UFD *newBST); /新文件插入到user文件樹中UFD *searchBST(UFD *fileBST,char name); /在fileBST樹中查找名字為name的結(jié)點并返回該結(jié)點 /文件不存在則返回空void BSTtraverse(UFD *fileBST); /遍歷二叉
15、樹UFD *deleteBST(UFD *fileBST,char name30); /刪除成功返回1,失敗返回0void print_path(UFD *fileBST); /輸出當前路徑void print_open_file(); /輸出已打開的文件UFD *check_share(char name30); /在共享鏈中檢查是否有name文件,有則返回UFD,沒則NULLvoid del_in_share(UFD *node); /在共享鏈中刪除node結(jié)點main.cpp#include <iostream>#include<conio.h>#include&
16、quot;filesystem.h"MFD *mfd_link=NULL; /用戶鏈表MFD *pre_user; /當前操作用戶UFD *pre_opera_folder=NULL;/當前操作文件夾int folder_depth=0; /記錄當前文件深度(用于輔助pre_folder的初始化)REC *share_file=NULL;REC *open_file=NULL;void print_path(UFD *fileBST) /輸出路徑 if(fileBST->pre_folder!=NULL) print_path(fileBST->pre_folder);
17、printf("/%s",fileBST->pre_folder->name); else printf("/%s",pre_user->name);void print_open_file() REC *temp; int i=5; temp=open_file; while(temp!=NULL) printf("%st%dtt",temp->file->name,temp->file->length); if(temp->file->rw='r')printf
18、("只讀t"); else printf("可讀寫t"); if(temp->file->share='y')printf("是t"); else printf("否t"); for(i=0;i<5;i+) if(temp->file->file->afd_filei!='0') printf("%c",temp->file->file->afd_filei); else break; if(temp->
19、file->file->afd_filei!='0'&&i=5) printf("."); printf("n"); temp=temp->link; void BSTtraverse(UFD *fileBST) /遍歷二叉樹(前序遍歷) UFD *left,*right; printf("%s",fileBST->name); if(fileBST->file_folder='o') /輸出.以區(qū)分文件夾 printf(".t"); e
20、lse printf("t"); if(fileBST->leftchild!=NULL) /遞歸 left=fileBST->leftchild; BSTtraverse(left); if(fileBST->rightchild!=NULL) right=fileBST->rightchild; BSTtraverse(right); UFD *searchBST(UFD *fileBST,char name30)/在fileBST樹中查找名字為name的結(jié)點并返回該結(jié)點 /文件不存在則返回空 int flag; flag=strcmp(file
21、BST->name,name); if(flag=0) return fileBST; /查找成功 else if(flag>0) if(fileBST->leftchild=NULL) return NULL; /查找失敗 else searchBST(fileBST->leftchild,name); /遞歸調(diào)用 else if(fileBST->rightchild=NULL) return NULL; else searchBST(fileBST->rightchild,name); void insertBST(UFD *fileBST,UFD *
22、newBST) /將結(jié)點newBST插入原二叉樹fileBST中 int flag; flag=strcmp(fileBST->name,newBST->name); if(flag>0) if(fileBST->leftchild=NULL) /插入 fileBST->leftchild=newBST; newBST->parent=fileBST; else insertBST(fileBST->leftchild,newBST); /遞歸調(diào)用 else if(fileBST->rightchild=NULL) /插入 fileBST->
23、;rightchild=newBST; newBST->parent=fileBST; else insertBST(fileBST->rightchild,newBST); /遞歸調(diào)用 /*flag=0 的情況已在創(chuàng)建時排除*/UFD *deleteBST(UFD *fileBST,char name30)/刪除名字問name的文件結(jié)點 UFD *parent_file=NULL,*del_file=NULL; UFD *move_file=NULL,*move_file_parent; del_file=searchBST(fileBST,name); if(del_file=
24、NULL) printf("沒有此文件,刪除失?。");getch(); return fileBST; /查找失敗 if(del_file->file_folder='o'&&strcmp(del_file->folder->name,"NULL")!=0) printf("注意,本系統(tǒng)未能實現(xiàn)級聯(lián)刪除,請先逐個刪除文件!"); printf("文件夾非空,刪除失??!n");getch(); return fileBST; if(del_file->sha
25、re='y') /先在共享鏈中刪除 del_in_share(del_file); parent_file=del_file->parent; if(del_file->leftchild=NULL&&del_file->rightchild=NULL) /被刪除結(jié)點為子葉結(jié)點 if(del_file=fileBST) /只有一個結(jié)點 strcpy(fileBST->name,"NULL"); else if(parent_file->leftchild=del_file) parent_file->lef
26、tchild=NULL;free(del_file); elseparent_file->rightchild=NULL;free(del_file); else if(del_file->leftchild=NULL|del_file->rightchild=NULL) /被刪除結(jié)點沒有做孩子或右孩子 if(del_file->leftchild=NULL) /沒有左孩子 if(parent_file=NULL)/刪除的為根結(jié)點fileBST=del_file->rightchild;del_file->rightchild->parent=NULL
27、; else if(parent_file->leftchild=del_file) /右孩子接上 parent_file->leftchild=del_file->rightchild; del_file->rightchild->parent=parent_file; else /右孩子接上 parent_file->rightchild=del_file->rightchild; del_file->rightchild->parent=parent_file; else /沒有右孩子 if(parent_file=NULL)/刪除的
28、為根結(jié)點fileBST=del_file->leftchild;del_file->leftchild->parent=NULL; else if(parent_file->leftchild=del_file) /左孩子接上 parent_file->leftchild=del_file->leftchild; del_file->leftchild->parent=parent_file; else /左孩子接上 parent_file->rightchild=del_file->leftchild; del_file->l
29、eftchild->parent=parent_file; free(del_file); else /左右孩子都有 move_file_parent=del_file->leftchild; move_file=move_file_parent->rightchild; if(move_file=NULL) /被刪除結(jié)點的左孩子沒有右孩子 if(parent_file=NULL) /刪除的為根結(jié)點 fileBST=move_file_parent; fileBST->rightchild=del_file->rightchild; fileBST->par
30、ent=NULL; else if(parent_file->leftchild=del_file) parent_file->leftchild=move_file_parent; else parent_file->rightchild=move_file_parent; move_file_parent->parent=parent_file; move_file_parent->rightchild=del_file->rightchild; else while(move_file->rightchild!=NULL) /尋找右邊最底下的結(jié)點
31、 move_file=move_file->rightchild; move_file_parent=move_file_parent->rightchild; move_file_parent->rightchild=NULL; move_file->leftchild=del_file->leftchild; move_file->rightchild=del_file->rightchild; if(move_file->rightchild!=NULL) move_file->rightchild->parent=move_f
32、ile; /右孩子的雙親也要改變 move_file->parent=del_file->parent; if(fileBST=del_file) /刪除的為根結(jié)點 fileBST=move_file; free(del_file); printf("成功刪除文件%sn",name); getch(); return fileBST;void del_in_share(UFD *node) REC *first,*second; first=share_file; second=share_file->link; if(second=NULL) share
33、_file=NULL;free(first); else do if(second->file=node) first->link=second->link;free(second); else first=first->link; second=second->link; while(second!=NULL);void fcreate(UFD *fileBST) /在fileBST的同一層創(chuàng)建文件 char s;char name30;int flag=0; UFD *newfile,*temp=NULL; REC *stemp;system("cl
34、s"); printf("-n"); printf("- 文 件 系 統(tǒng)/創(chuàng) 建 文 件-n"); printf("-nn"); do printf(" 1. 創(chuàng)建文件 n"); printf(" 2. 創(chuàng)建文件夾 n"); printf(" 3. 取消 n"); printf("請選擇:n"); scanf("%c",&s); fflush(stdin); if(s='3')return; if(s!
35、='1'&&s!='2') printf("輸入錯誤,請重新輸入!n"); while(s!='1'&&s!='2');if(strcmp(fileBST->name,"NULL")=0) /節(jié)點已有(未賦值)用于本層文件夾的第一個文件的特殊情況 newfile=fileBST;elsenewfile=(UFD*)malloc(sizeof(UFD); /創(chuàng)建樹節(jié)點newfile->leftchild=NULL;newfile->rightc
36、hild=NULL; printf("請輸入文件(夾)名:"); scanf("%s",name); fflush(stdin); /搜索二叉樹,文件重名就創(chuàng)建失敗 temp=searchBST(fileBST,name); if(temp!=NULL) printf("已存在該文件(夾),創(chuàng)建失??!n"); strcpy(newfile->name,"NULL"); return; strcpy(newfile->name,name);if(folder_depth=1) newfile->pr
37、e_folder=NULL;elsenewfile->pre_folder=pre_opera_folder;/指向正在操作文件夾 while(1) /讀寫否,共享否 printf("只讀r還是可讀寫w:"); scanf("%c",&(newfile->rw); fflush(stdin); printf("是否共享y/n:"); scanf("%c",&(newfile->share); fflush(stdin); if(newfile->rw='r'|
38、newfile->rw='w')&&(newfile->share='y'|newfile->share='n') break; printf("輸入有誤,請重新輸入!n"); /*以下為文件和文件夾初始化中不同的地方* if(s='1') newfile->file_folder='f' newfile->folder=NULL; newfile->file=(AFD*)malloc(sizeof(AFD); printf("請輸入
39、文件的內(nèi)容(<100):"); scanf("%s",newfile->file->afd_file); fflush(stdin); newfile->length=strlen(newfile->file->afd_file); else /文件夾的初始化 newfile->file_folder='o' newfile->file=NULL; newfile->length=0; newfile->folder=(UFD*)malloc(sizeof(UFD); /連上一個空文件節(jié)點
40、newfile->folder->pre_folder=newfile; newfile->folder->leftchild=NULL; strcpy(newfile->folder->name,"NULL"); newfile->folder->rightchild=NULL; /*if(fileBST!=newfile)insertBST(fileBST,newfile); /初始化完成后插入到二叉樹中 else newfile->parent=NULL;/第一個結(jié)點略去插入,其雙親結(jié)點為空if(newfile-&
41、gt;share='y') /接入共享鏈 stemp=(REC*)malloc(sizeof(REC); stemp->file=newfile; stemp->link=share_file; share_file=stemp; UFD *fdelete(UFD *fileBST) /在fileBST的同一層刪除文件 char name30;REC *temp; printf("請輸入要刪除的文件:"); scanf("%s",name); fflush(stdin);temp=open_file; /檢查文件是否打開,打開
42、則刪除失敗while(temp!=NULL) if(strcmp(temp->file->name,name)=0) printf("文件打開中,請關(guān)閉后再刪除!"); getch(); return fileBST; else temp=temp->link; fileBST=deleteBST(fileBST,name); return fileBST;void fopen(UFD *fileBST) char name30; UFD *temp=NULL,*temp1=NULL; printf("請輸入要打開的文件的名字:");
43、scanf("%s",name); fflush(stdin); temp=searchBST(fileBST,name); if(temp=NULL) printf("文件不存在!n"); temp=check_share(name); if(temp=NULL) printf("文件不存在!n"); return; /*找到文件,以下為打開部分* if(temp->file_folder='o') /打開文件夾 folder_depth+; temp1=pre_opera_folder; /保護正在操作文件
44、pre_opera_folder=temp; temp->folder=operations(temp->folder); pre_opera_folder=temp1; /寫回 folder_depth-; else /打開文件 REC *newopen; newopen=(REC*)malloc(sizeof(REC);/接入打開鏈 newopen->file=temp; newopen->link=open_file; open_file=newopen; printf("已成功打開問%s!n",temp->name); getch(); void fclose() char name30; REC *first=NULL,*second=NULL; printf("請輸入要關(guān)閉的文件:"); scanf("%s",name); fflush(stdin); first=open_file; if(first=NULL)printf("沒有打開的文件n");getch();return; else second=first-&g
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)用工勞動合同
- 2025年婁底考貨運從業(yè)資格證
- 2025年隴南貨運從業(yè)資格仿真考題
- 2025年揭陽貨運從業(yè)資格證考試內(nèi)容
- 2023年全國乙卷高考真題生物試卷解析
- 高壓水流清洗機產(chǎn)業(yè)分析報告
- 煙草、鹽加工機械市場分析及競爭策略分析報告
- 浸漬、涂布或包覆處理紡織物競爭策略分析報告
- 《天然藥物化學(xué)成分提取與分離》課程標準
- 上海市裝修設(shè)計合同范本
- 交房清水樣板間施工方案
- 【施工組織設(shè)計】內(nèi)容完整性和編制水平
- 跨部門工作聯(lián)絡(luò)單
- 配電箱配管施工方案
- DataOps實踐指南(1.0)-中文版-2023.07
- Vue.js前端開發(fā)實戰(zhàn)(第2版)全套完整教學(xué)課件
- 2023風力發(fā)電機組延壽評估技術(shù)規(guī)范
- 鞋業(yè)-品質(zhì)培訓(xùn)
- 小學(xué)思政課《愛國主義教育》
- 瓜豆原理【模型專題】(含答案解析)
- 單價、數(shù)量、總價-教學(xué)課件【A3演示文稿設(shè)計與制作】
評論
0/150
提交評論