




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目錄 一. 課程設計目的及要求2 二. 相關知識2 三. 題目分析3 四. 概要設計4 五. 代碼及流程5 六. 運行結果20 七. 設計心得 錯誤!未定義書簽。 八. 參考文獻23 亠課程設計目的及要求 深入了解文件管理系統,初步掌握文件管理系統的實現方法。 用高級語言編寫和調試一個簡單的文件系統,模擬文件管理的工作過程。從而對各 種文件操作命令的實質內容和執行過程有比較深入的了解。 編寫一程序,模擬一個簡單的文件管理系統。樹型結構,目錄下可以是目錄,也可以是 文件。 在此文件管理系統,可實現的操作有: 13 改變目錄:格式 顯示目錄:格式 創建目錄:格式 刪除目錄:格式 新建文件:格式 刪
2、除文件:格式 退出文件系統: cd 目錄名 dir 目錄名 md 目錄名 rd 目錄名 edit 文件名 del 文件名 exit 二相關知識 1文件結構體 struct FileNode char filenameFILENAME_LEN; 文件名 /目錄名 int isdir;/目錄文件識別標志 int i_nlink;文件的鏈接數 int adr;/文件的地址 struct FileNode *pare nt, *child;指向父親的指針和指向左孩子的指針 struct FileNode *sibli ng_prev, *sibli ng_next; 指向前一個兄弟的指針和指向 后一個
3、兄弟的指針.一一 ; 整個文件系統采用二叉樹型存儲結構,初始化文件樹如下: 圖2-1初始目錄樹 2所使用函數及其功能 int Mai n(); / 主函數 void Init();初始化文件樹 int ParseComma nd();/接受輸入的命令并把其分解成操作名和路徑文件名 void ExecuteCommand();/執行命令,分別執行 cd, edit,md,del, rd, dir,exit 命令 in t cdComd(); /改變目錄功能處理 int editComd();/處理edit命令,即創建文件,只要創建表示文件的節點即可,內容及大 小不考慮 int mdComd();
4、 / 創建目錄 int delComd();處理del命令,即刪除指定文件,不存在是給出錯誤信息 int dirComd();/處理dir命令,顯示目錄 in t rdComd(); / 刪除目錄 int Fin dFile name(char Para2);/查找文件名 struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/ 創建結點 int GetI nput(char* buffer,u nsig ned int buffer_le n); 獲取輸入 3. 所使用的變量 struct FileNode
5、*cp, *tp, *root;/ *cp, *tp, *root 是根目錄節點 char pathINPUT_LEN-COMMAND_LEN; 記錄當前走過的路徑 char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;/para1數組存儲輸 入的命令,para2數組存儲輸入的文件名 char file nameFILENAME_LEN,tmp; un sig ned int i,j; 三題目分析 1.文件系統采用二叉樹型存儲結構,結點結構如下: struct FileNode char filenameFILENAME_LEN; 文件名 / 目錄名
6、 int isdir;/目錄、文件的識別標志(0為文件,1為目錄) int i_nli nk;文件的鏈接數 /int adr;/ 文件的地址 struct FileNode *pare nt, *child;指向父親的指針和指向左孩子的指針 struct FileNode *sibling_prev,*sibling_next;指向前一個兄弟的指針和指向 后一個兄弟的指針.一一 ; 2目錄名和文件名支持全路徑名和相對路徑名,路徑名各分量間用“/”隔開 3. 功能具體描述: 改變目錄:改變當前工作目錄,目錄不存在時給出出錯信息 顯示目錄:顯示指定目錄下或當前目錄下所有文件和一級目錄(選做:帶 /
7、s參數的dir 命令,顯示所有子目錄) 創建目錄:在指定路徑或當前路徑下創建指定目錄。重名時給出錯信息。 刪除目錄:刪除指定目錄下所有文件和子目錄。要刪目錄不空時,要給出提示是否要刪 除。 創建文件:創建指定名字的文件,只要創建表示文件的節點即可,內容及大小不考慮。 刪除文件:刪除指定文件,不存在時給出出錯信息。 退出文件系統:exit 4、總體流程: 初始化文件目錄; 輸出提示符,等待接受命令,分析鍵入的命令; 對合法的命令,執行相應的處理程序,否則輸出錯誤信息,繼續等待新命令,直到鍵入 EXIT退出為止。 四.概要設計 1 .在內存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實現一個簡單的
8、單用戶文 件系統。 2 .文件存儲空間的分配采用顯式鏈接分配。為了實現創建和刪除文件必須要有一棵初 始的文件樹存在,以便在文件樹的根節點下實現創建和刪除文件。 3.數據結構與樹結構。數據結構是計算機存儲、組織數據的方式。數據結構是指相 互之間存在一種或多種特定關系的數據元素的集合。 樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支 關系組織起來的結構,很象自然界中的樹那樣。樹中每個分叉點稱為結點,起始結點稱 為樹根,任意兩個結點間的連接關系稱為樹枝,結點下面不再有分枝稱為樹葉。結點的 前趨結點稱為該結點的雙親,結點的后趨結點稱為該結點的孩子,同一結點的孩子 之間互稱
9、兄弟。 4 .文件目錄結構采用多級目錄結構。為了簡單起見,可以使用文件結構體,結構體內 容包括:文件名,文件目錄識別標示,文件鏈接數,以及他的左孩子右孩子左兄弟右兄 弟指 5. 要有分解函數對輸入的命令進行分解。以識別那部分是哪部分是命令,哪部分是路 徑和文件名。 6.最后要有執行函數。來執行輸入的創建文件命令。 五代碼及流程 圖5-1主函數流程圖 2)edit()創建文件函數流程圖 圖5-3刪除函數流程圖 4) ParseCommand(分解命令函數流程圖 圖5-4分解命令函數流程圖 5)改變目錄函數rdComd() 第衛Mr 圖5-5改變目錄函數流程圖 源代碼: #in elude #i
10、nclude #in elude #in elude #in elude #defi ne FILENAME_LEN 21 #defi ne INPUT_LEN 81 #defi ne COMMAND_LEN 11 using n amespace std; void Init();初始化文件樹 int ParseComma nd();接受輸入的命令并把其分解成操作名和路徑文件名 void ExecuteCommand(); 執行命令 int cdComd(); 處理 cd 命令 int editComd(); 處理 edit 命令 int delComd(); 處理 del 命令 int d
11、irComd(); 處理 dir 命令 int mdComd(); 處理 md 命令 int rdComd(); 處理 rd 命令 int FindPath(char *ph);尋找參數 ph所指向的路徑 int FindFilename(char Para2);從參數Para2中找到要建立或刪除的文件、目錄名,并把指針只想其 父親結點 struct FileNode* CreateFileNode(char file name,i nt isdir,i nt i_n li nk);創建結點 int Get In put(char* buffer,u nsig ned int buffer_l
12、e n); 獲取輸入 int CheckCommand(); 命令檢查 int GetDir(i nt begi n,char *path,char *curDir); 獲取路徑 struct FileNode *cp, *tp, *root; char pathINPUT_LEN-COMMAND_LEN;記錄當前走過的路徑 char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN; char curpathINPUT_LEN-COMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN; char file nameFILENAME
13、_LEN,tmp; un sig ned int i,j;/i nt i,j; struct FileNode / 結點結構 char filenameFILENAME_LEN; 文件名 /目錄名 int isdir;/目錄文件識別標志 int i_nlink;文件的鏈接數 struct FileNode *parent, *child; 指向父親的指針和指向左孩子的指針 struct FileNode *sibli ng_prev, *sibli ng_n ext;/ 指向前一個兄弟的指針和指向后一個兄弟的指針 ; /創建結點 申請結點空間 struct FileNode* CreateFi
14、leNode(char file name,i nt isdir,i nt i_n li nk) struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode);/ /相應內容賦初值 strcpy (no de-file name,file name); no de-isdir=isdir; no de-i_ nli nk=i_ nli nk; no de-pare nt=NULL; n ode-child=NULL; no de-sibli ng_prev=NULL; no de-sibli ng_n ext=NU
15、LL; retur n no de; /初始化文件樹 void Ini t() struct FileNode *bi nN ode,*usrNode, *un ixNode,*etcNode,*libNode,*userNode, *bi nN ode2,*liuNode,*su nN ode,*ftiNode; strcpy(path,/); /根目錄寫入當前路徑 /創建文件樹的結點 bi nN ode=CreateFileNode(bi n,1,0); usrNode=CreateFileNode(usr,1,0); un ixNode=CreateFileNode(u ni x,0,0
16、); etcNode=CreateFileNode(etc,1,0); libNode=CreateFileNode(lib,1,0); userNode=CreateFileNode(user,1,0); bi nN ode2=CreateFileNode(bi n,1,0); liuNode=CreateFileNode(liu,1,0); su nN ode=CreateFileNode(su n,1,0); ftiNode=CreateFileNode(fti,1,0); cp=tp=root=CreateFileNode(/,1,0); /結點相應內容賦值 root-pare nt=
17、NULL; root-child=b inN ode; root-sibli ng_prev=root-sibli ng_n ext=NULL; binN ode-pare nt=root; binN ode-child=NULL; binN ode-sibli ng_prev=NULL; binN ode-sibli ng_n ext=usrNode; usrNode-pare nt=NULL; usrNode-child=libNode; usrNode-sibli ng_prev=b inN ode; usrNode-sibli ng_n ext=uni xNode; uni xNode
18、-pare nt=NULL; un ixNode-child=NULL; uni xNode-sibli ng_prev=usrNode; uni xNode-sibli ng_n ext=etcNode; etcNode-pare nt=NULL; etcNode-child=NULL; etcNode-sibli ng_prev= uni xNode; etcNode-sibli ng_next=NULL; libNode-pare nt=usrNode; libNode-child=liuNode; libNode-sibli ng_prev=NULL; libNode-sibli ng
19、_n ext=userNode; userNode-pare nt=NULL; userNode-child=NULL; userNode-sibli ng_prev=libNode; userNode-sibli ng_n ext=bi nN ode2; binN ode2-pare nt=NULL; binN ode2-child=NULL; binN ode2-sibli ng_prev=userNode; binN ode2-sibli ng_n ext=NULL; liuNode-pare nt=libNode; liuNode-child=NULL; liuNode-sibl in
20、 g_prev=NULL; liuNode-sibli ng_n ext=s unN ode; sunN ode-pare nt=NULL; su nN ode-child=NULL; sunN ode-sibli ng_prev=liuNode; sunN ode-sibli ng_n ext=ftiNode; ftiNode-pare nt=NULL; ftiNode-child=NULL; ftiNode-sibli ng_prev=s unN ode; ftiNode-sibli ng_n ext=NULL; 獲取文件或目錄名,并把指針指向其父親結點 int Fin dFile nam
21、e(char Para2) i=strle n(Para2)-1; j=0; while(Para2i!=/ i-; j+; file namej=O;獲得逆序的文件或目錄名,存入file name中 if(i0) Para2i+1=0: else Para2i=0: j_; for(i=0;i0) 查找路徑 int sig n=Fi ndPath(Para2); if(sig n=0) return 0; return 1; /緩沖區安全輸入子函數 /如果輸入超過buffer_len,則截取前buffer_len-1長度的輸入, buffer_len處字符用70代替 int GetI npu
22、t(char* buffer,u nsig ned int buffer_le n) un sig ned int coun t=0; while(co un tsibli ng_prev) cp=cp-sibli ng_prev; if(cp-pare nt) cp=cp-parent; /找到父親結點 else return 0; /對當前路徑進行相應處理 i=strle n(path); while(pathi!=/ if(i!=O) pathi=O: else pathi+1=0: else Fin dPath(Para2); 查找路徑 return 1; /創建目錄函數 int md
23、Comd() struct FileNode * temp,*tp; temp=CreateFileNode(,1,0); int sig n; if(strle n( Para2)=0) / 參數不能為空 printf(n命令格式有錯誤.n); return 0; if(strle n( Para2)20) 長度檢查 printf(n目錄名過長n); return 0; /格式檢查 if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=7) printf(目錄名格式有錯!n”);/*目錄首字母可以為字母或數字或/*/ return 0; sig n=F
24、in dFile name(Para2);/獲取目錄名 if(sig n=0) return 0; if(cp-isdir!=1) /如當前指針指向的是文件,則報錯 prin tf(you cannot edit a directory in un der a file!n); return 0; tp=CreateFileNode(file name,1,0);/創建目錄結點,并插入到指定目錄下 if(cp-child=NULL) tp-pare nt=cp; tp-child=NULL; cp-child=tp; tp-sibli ng_prev=NULL; tp-sibli ng_n e
25、xt=NULL; else temp=cp;/用temp找到新結點插入處 temp=temp-child; while(temp-sibli ng_n ext ) /find the last sib ing node temp=temp-sibli ng_n ext; if(strcmp(temp-file name,file name)=0重名報錯 return 0; /找到了最后一個結點 temp-sibli ng_n ext=tp; tp-pare nt=NULL; tp-child=NULL; tp-sibli ng_prev=temp; tp-sibli ng_n ext=NULL
26、; return 1; 刪除目錄函數 int rdComd() int sig n; struct FileNode *temp; char cmd2; if(!CheckCommand() / 命令檢查 return 0; sign=FindFilename(Para2); / 獲取目錄名 if(sig n=0) retur n 0; if(cp-child) /用temp指向要刪除的結點 temp=cp-child; while(temp-sibli ng_n ext if(strcmp(temp-file name,file name)!=0) printf(不存在該目錄!n); ret
27、urn 0; else printf(”不存在該目錄!n); return 0; if(temp-isdir!=1) 要刪除的不能是文件 printf(ERROR!該命令只能刪除目錄,不可刪除文件!n); return 0; if(temp-child) 如仍有用戶使用該目錄,則不能刪除 printf(n該目錄不為空,您確定要刪除嗎?Y/N!n); GetI nput(cmd,2); if(strcmp(cmd, n)=O|strcmp(cmd,N)=O) return 0; 刪除工作 if(temp-pare nt=NULL) /不是第一個孩子 temp-sibli ng_prev-sibl
28、i ng_n ext=temp-sibli ng_n ext; if(temp-sibling_next)/處理是最后一個兄弟的情況 temp-sibli ng_n ext-sibli ng_prev=temp-sibli ng_prev; temp-sibli ng_prev=temp-sibli ng_n ext=NULL; /if else /第一個孩子 if(temp-sibling_next)/處理是最后一個兄弟的情況 temp-sibli ng_n ext-pare nt=temp-pare nt; temp-pare nt-child=temp-sibli ng_n ext; f
29、ree(temp); return 1; 顯示目錄子函數 int dirComd() if(strlen(Para2)0) int sign=FindPath(Para2); / 查找路徑 if(sig n=0)retur n 0; else prin tf(n%s, path); if(cp!=root) printf( %sn,.); if(cp-child=NULL) / 指定目錄為空 return 0; tp=cp; tp=tp-child;/指定目錄不為空,顯示其所有子目錄及文件名 while(tp) if(tp-isdir) prin tf(%sn,tp-file name); e
30、lse prin tf(%sn,tp-file name); tp=tp-sibli ng_n ext; return 0; /創建文件函數 int editComd() struct FileNode * temp=CreateFileNode(,0,0); int sig n; struct FileNode *tp; if(strle n( Para2)=0) / 路徑不能為空 printf(n命令格式有錯誤.n); return 0; if(strle n( Para2)20) 長度檢查 printf(n文件名過長n); return 0; /格式檢查 if (!(isalpha(Pa
31、ra20)|Para20=_|Para20=0|Para20=7) printf(文件名格式有錯!n”);/*文件首字母可以為字母或數字或_或/或回車*/ return 0; sign=FindFilename(Para2); 獲取文件名 if(sig n=0) return 0; if(cp-isdir!=1) 如當前指針指向的是文件,則報錯 prin tf(you cannot edit a file in un der a file!n); return 0; /創建文件結點,并插入到指定目錄下 tp=CreateFileNode(,1,0); strcpy(tp-file name,f
32、ile name); tp-isdir=0; tp-i_ nli nk=0; if(cp-child=NULL) tp-pare nt=cp; tp-child=NULL; cp-child=tp; tp-sibli ng_prev=NULL; tp-sibli ng_n ext=NULL; else temp=cp; temp=temp-child;用temp找到新結點插入處 while(temp-sibli ng_n ext ) /find the last sib ing node temp=temp-sibli ng_n ext; if(strcmp(temp-file name,fi
33、le name)=0 /重名報錯 return 0; /找到了最后一個結點 temp-sibli ng_n ext=tp; tp-pare nt=NULL; tp-child=NULL; tp-sibli ng_prev=temp; tp-sibli ng_n ext=NULL; return 1; 刪除文件子函數 int delComd() int sig n; struct FileNode *temp; if(strle n(Para2)=0) / 參數不能為空 printf(n命令格式有錯誤.n); return 0; sig n=Fi ndFile name(Para2);獲取文件名
34、 if(sig n=0) retur n 0; if(cp-child) /用temp指向要刪除的結點 temp=cp-child; while(temp-sibli ng_n ext if(strcmp(temp-file name,file name)!=0) printf(不存在該文件!n); return 0; else printf(不存在該文件!n); return 0; if(temp-isdir!=0) 要刪除的不能是目錄 printf(ERROR!該命令只能刪除文件,不可刪除目錄!n); return 0; if(temp-i_nli nk!=O) II如仍有用戶使用該文件,
35、則不能刪除 printf(”還有用戶共享了該文件,不能刪除!n); return 0; 刪除工作 if(temp-pare nt=NULL) /不是第一個孩子 temp-sibli ng_prev-sibli ng_n ext=temp-sibli ng_n ext; if(temp-sibling_next)/處理是最后一個兄弟的情況 temp-sibli ng_n ext-sibli ng_prev=temp-sibli ng_prev; temp-sibli ng_prev=temp-sibli ng_n ext=NULL; else /第一個孩子 if(temp-sibling_nex
36、t)/處理是最后一個兄弟的情況 temp-sibli ng_n ext-pare nt=temp-pare nt; temp-pare nt-child=temp-sibli ng_n ext; free(temp); return 1; 獲取當前目錄名子函數 int GetDir(i nt begi n, char *path,char *curDir) int i=0; int len=strle n( path); while(!(pathbegi n=)|(pathbegi n=/) curDiri=O: retur n begi n+1; /查找路徑函數 int Fin dPath(
37、char *ph) struct FileNode *temp; /struct FileNode *tp,*temp; char oldpathINPUT_LEN-COMMAND_LEN; un sig ned int i=0; /int i=0 int sig n=1; if(strcmp(ph,/)=0) /ph 是根目錄 cp=root; strcpy(path,/); return 1; temp=cp; strcpy(oldpath,path);/保留原路徑和指針 19 if(phO=/)/指針指向根目錄的左孩子 cp=root-child; i+; / 濾過 T strcpy(p
38、ath,/); else if(cp!=NULL if(cp指針指向當前目錄的左孩子 else printf(路徑錯誤!n); return 0; while(ichild) i+; / 略過/ if(cp-isdir) cp=cp-child; /繼續查找下級目錄 else printf(路徑錯誤!n); return 0; strcat(path,/); while(phi!=/ if(strcmp(cp-file name,curpath)=O) if(cp-isdir=0) strcpy(path,oldpath); cp=temp; printf(是文件不是目錄.n); return 0; strcat(path,cp-file name); if(strcmp(cp-file name,curpath)!=O|cp=NULL) strcpy(path,oldpath); cp=temp; printf(輸入路徑錯誤n); return 0; return 1; /命令檢查函數 int CheckComma nd() if(strle n( Para2)=0) p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛質押貸款信用評估合同規范
- 植物園養護與科普教育合作協議
- 燒烤美食街整體運營管理與品牌合作合同
- 塑料制品代加工保密協議與綠色環保生產協議
- 車位物業服務及停車場設施設備更新合同
- 周大福珠寶店管理制度
- 跨學科主題學習的5個步驟
- 壓力管道資質管理制度
- 五年級數學小數除以整數單元作業模擬題大全附答案
- 二手車公司策劃方案
- KRONES灌裝檢測工作原理及工藝參數調整
- 不同碳減排下生物質氣化制綠色甲醇的經濟性分析
- 液壓與氣動技術(第2版)全冊電子教案模塊1-7教學設計(高職)
- 《疼痛管理策略》課件
- 中國糖尿病防治指南(2024版)解讀
- 智研咨詢發布:2025年中國科技館行業競爭格局及發展前景研究報告
- 反肩關節置換術的護理
- 信用卡金融消費者權益保護措施
- 養老院老人生活娛樂活動組織服務質量管理制度
- 2024年北京市中考英語模擬試卷
- 全新離婚登記協議下載(2024版):雙方財產查核與評估程序
評論
0/150
提交評論