文件管理系統(tǒng)C_第1頁
文件管理系統(tǒng)C_第2頁
文件管理系統(tǒng)C_第3頁
文件管理系統(tǒng)C_第4頁
文件管理系統(tǒng)C_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目錄一課程設(shè)計目的及要求 2二相關(guān)知識 . 2三. 題目分析 . 3四概要設(shè)計 . 4五代碼及流程 . 5六運行結(jié)果 . 21七設(shè)計心得 . 錯誤!未定義書簽。八參考文獻 . 23課程設(shè)計目的及要求深入了解文件管理系統(tǒng),初步掌握文件管理系統(tǒng)的實現(xiàn)方法。用高級語言編寫和調(diào)試一個簡單的文件系統(tǒng),模擬文件管理的工作過程。從而對各 種文件操作命令的實質(zhì)內(nèi)容和執(zhí)行過程有比較深入的了解。編寫一程序,模擬一個簡單的文件管理系統(tǒng)。樹型結(jié)構(gòu),目錄下可以是目錄,也可以是 文件。在此文件管理系統(tǒng),可實現(xiàn)的操作有:改變目錄:格式 顯示目錄:格式 創(chuàng)建目錄:格式 刪除目錄:格式 新建文件:格式 刪除文件:格式 退出文件

2、系統(tǒng):cd dir md rd edit del exit相關(guān)知識1. 文件結(jié)構(gòu)體struct FileNodechar filenameFILENAME_LEN;/ 文件名/ 目錄名int isdir;/ 目錄文件識別標(biāo)志int i_nlink;/ 文件的鏈接數(shù)int adr;/ 文件的地址struct FileNode *parent, *child;/指向父親的指針和指向左孩子的指針struct FileNode *sibling_prev, *sibling_next;/ 指向前一個兄弟的指針和指向 / 后一個兄弟的指針 .;整個文件系統(tǒng)采用二叉樹型存儲結(jié)構(gòu),初始化文件樹如下:1LUf

3、H-*11P*圖2-1初始目錄樹2. 所使用函數(shù)及其功能int Mai n(); /主函數(shù)void Ini t();初始化文件樹int ParseComma nd();接受輸入的命令并把其分解成操作名和路徑文件名void ExecuteCommand(); 執(zhí)行命令,分別執(zhí)行 cd, edit ,md, del,rd, dir , exit 命令in t cdComd(); /改變目錄功能處理int editComd(); 處理edit命令,即創(chuàng)建文件,只要創(chuàng)建表示文件的節(jié)點即可,內(nèi)容及大小不考慮int mdComd(); / int delComd();/ int dirComd();/ i

4、n t rdComd(); /創(chuàng)建目錄處理del命令,即刪除指定文件,不存在是給出錯誤信息 處理dir命令,顯示目錄刪除目錄int Fin dFile name(char Para2);查找文件名struct FileNode* CreateFileNode(char file name,i nt isdir,i nt i_nli nk);倉 U建結(jié)點獲取輸入int GetI nput(char* buffer,u nsig ned int buffer_le n);3. 所使用的變量struct FileNode *cp, *tp, *root;/ *cp, *tp, *root是根目錄節(jié)點

5、char pathINPUT_LEN-COMMAND_LEN;/記錄當(dāng)前走過的路徑char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;/para數(shù) 組存儲輸入的命令,para2數(shù)組存儲輸入的文件名char file nameFILENAME_LEN,tmp;un sig ned int i,j;三題目分析1.文件系統(tǒng)采用二叉樹型存儲結(jié)構(gòu),結(jié)點結(jié)構(gòu)如下: struct FileNodechar filenameFILENAME_LEN;/ 文件名/ 目錄名int isdir;/目錄、文件的識別標(biāo)志( 0為文件, 1 為目錄)int i_nlink;/

6、文件的鏈接數(shù)/int adr;/ 文件的地址struct FileNode *parent, *child;/指向父親的指針和指向左孩子的指針struct FileNode *sibling_prev, *sibling_next;/ 指向前一個兄弟的指針和指向 后一個兄弟的指針 .; 2目錄名和文件名支持全路徑名和相對路徑名,路徑名各分量間用“ / ”隔開 3功能具體描述:改變目錄:改變當(dāng)前工作目錄,目錄不存在時給出出錯信息 顯示目錄:顯示指定目錄下或當(dāng)前目錄下所有文件和一級目錄(選做:帶 /s 參數(shù)的 dir 命令,顯示所有子目錄) 創(chuàng)建目錄:在指定路徑或當(dāng)前路徑下創(chuàng)建指定目錄。重名時給出

7、錯信息。 刪除目錄:刪除指定目錄下所有文件和子目錄。要刪目錄不空時,要給出提示是否要刪 除。創(chuàng)建文件:創(chuàng)建指定名字的文件,只要創(chuàng)建表示文件的節(jié)點即可,內(nèi)容及大小不考慮。 刪除文件:刪除指定文件,不存在時給出出錯信息。退出文件系統(tǒng): exit4、總體流程: 初始化文件目錄; 輸出提示符,等待接受命令,分析鍵入的命令; 對合法的命令,執(zhí)行相應(yīng)的處理程序,否則輸出錯誤信息,繼續(xù)等待新命令,直到鍵入 EXIT 退出為止。四概要設(shè)計1在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實現(xiàn)一個簡單的單用戶文 件系統(tǒng)。2文件存儲空間的分配采用顯式鏈接分配。 為了實現(xiàn)創(chuàng)建和刪除文件必須要有一棵初 始的文件樹存

8、在,以便在文件樹的根節(jié)點下實現(xiàn)創(chuàng)建和刪除文件。3. 數(shù)據(jù)結(jié)構(gòu)與樹結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相 互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點)按分支 關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹中每個分叉點稱為結(jié)點,起始結(jié)點稱 為樹根,任意兩個結(jié)點間的連接關(guān)系稱為樹枝,結(jié)點下面不再有分枝稱為樹葉。結(jié)點的 前趨結(jié)點稱為該結(jié)點的 雙親 ,結(jié)點的后趨結(jié)點稱為該結(jié)點的 孩子 ,同一結(jié)點的 孩 子之間互稱 兄弟。4文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)。為了簡單起見,可以使用文件結(jié)構(gòu)體 ,結(jié)構(gòu)體內(nèi)容包括:文件名,文件

9、目錄識別標(biāo)示,文件鏈接數(shù),以及他的左孩子右孩子左兄弟右兄 弟指5. 要有分解函數(shù)對輸入的命令進行分解。以識別那部分是哪部分是命令,哪部分是路 徑和文件名。6. 最后要有執(zhí)行函數(shù)。來執(zhí)行輸入的創(chuàng)建文件命令。五代碼及流程圖5-1主函數(shù)流程圖2) edit()創(chuàng)建文件函數(shù)流程圖圖5-3 刪除函數(shù)流程圖4) ParseCommand(分解命令函數(shù)流程圖圖5-4分解命令函數(shù)流程圖5)改變目錄函數(shù)rdComd()圖5-5改變目錄函數(shù)流程圖源代碼:#include #include #include #include #include #define FILENAME_LEN 21#define INPUT

10、_LEN 81#define COMMAND_LEN 11 using namespace std;void Init();/ 初始化文件樹int ParseCommand();/ 接受輸入的命令并把其分解成操作名和路徑文件名 void ExecuteCommand();/ 執(zhí)行命令處理 cd 命令處理 edit 命令 處理 del 命令 處理 dir 命令 處理 處理int cdComd();/int editComd();/int delComd();/int dirComd();/md命令rd 命令int mdComd();/int rdComd();/尋找參數(shù) ph 所指向的路徑Par

11、a2);/ 從參數(shù) Para2 中找到要建立或刪除的文件、目錄名,并把指針int FindPath(char *ph);/ int FindFilename(char 只想其父親結(jié)點 struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/ int GetInput(char* buffer,unsigned int buffer_len);/獲取輸入int CheckCommand();/ 命令檢查 int GetDir(int begin,char *path,char *curDir);/ struct

12、FileNode *cp, *tp, *root;獲取路徑創(chuàng)建結(jié)點char pathINPUT_LEN-COMMAND_LEN;/ 記錄當(dāng)前走過的路徑 char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;char curpathINPUT_LEN-COMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN; char filenameFILENAME_LEN,tmp;unsigned int i,j;/int i,j;struct FileNode / 結(jié)點結(jié)構(gòu)文件名 / 目錄名char filenameFILENAME_LE

13、N;/ int isdir;/目錄文件識別標(biāo)志指向父親的指針和指向左孩子的指針指向前一個兄弟的指針和指向后一個兄弟int i_nlink;/ 文件的鏈接數(shù) struct FileNode *parent, *child;/struct FileNode *sibling_prev, *sibling_next;/ 的指針 .;/ 創(chuàng)建結(jié)點申請結(jié)點struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink) struct FileNode* node=(struct FileNode*)malloc(sizeof(str

14、uct FileNode);/ 空間/ 相應(yīng)內(nèi)容賦初值 strcpy(node-filename,filename);node-isdir=isdir; node-i_nlink=i_nlink; node-parent=NULL; node-child=NULL; node-sibling_prev=NULL; node-sibling_next=NULL;return node;/ 初始化文件樹 void Init() struct FileNode *binNode,*usrNode, *unixNode,*etcNode,*libNode,*userNode, *binNode2,*l

15、iuNode,*sunNode,*ftiNode;strcpy(path,/); /根目錄寫入當(dāng)前路徑/ 創(chuàng)建文件樹的結(jié)點 binNode=CreateFileNode(bin,1,0); usrNode=CreateFileNode(usr,1,0); unixNode=CreateFileNode(unix,0,0); etcNode=CreateFileNode(etc,1,0); libNode=CreateFileNode(lib,1,0); userNode=CreateFileNode(user,1,0); binNode2=CreateFileNode(bin,1,0); li

16、uNode=CreateFileNode(liu,1,0); sunNode=CreateFileNode(sun,1,0); ftiNode=CreateFileNode(fti,1,0); cp=tp=root=CreateFileNode(/,1,0);/ 結(jié)點相應(yīng)內(nèi)容賦值 root-parent=NULL; root-child=binNode; root-sibling_prev=root-sibling_next=NULL;binNode-parent=root; binNode-child=NULL; binNode-sibling_prev=NULL; binNode-sibl

17、ing_next=usrNode;usrNode-parent=NULL; usrNode-child=libNode;usrNode-sibling_prev=binNode; usrNode-sibling_next=unixNode;unixNode-parent=NULL;unixNode-child=NULL;unixNode-sibling_prev=usrNode; unixNode-sibling_next=etcNode;etcNode-parent=NULL;etcNode-child=NULL;etcNode-sibling_prev=unixNode; etcNode-

18、sibling_next=NULL;libNode-parent=usrNode;libNode-child=liuNode; libNode-sibling_prev=NULL; libNode-sibling_next=userNode;userNode-parent=NULL;userNode-child=NULL;userNode-sibling_prev=libNode;userNode-sibling_next=binNode2;binNode2-parent=NULL;binNode2-child=NULL;binNode2-sibling_prev=userNode; binN

19、ode2-sibling_next=NULL;liuNode-parent=libNode;liuNode-child=NULL; liuNode-sibling_prev=NULL; liuNode-sibling_next=sunNode;sunNode-parent=NULL;sunNode-child=NULL; sunNode-sibling_prev=liuNode; sunNode-sibling_next=ftiNode;ftiNode-parent=NULL;ftiNode-child=NULL; ftiNode-sibling_prev=sunNode; ftiNode-s

20、ibling_next=NULL;/ 獲取文件或目錄名,并把指針指向其父親結(jié)點 int FindFilename(char Para2) i=strlen(Para2)-1; j=0; while(Para2i!=/& i=0) filenamej=Para2i; i-; j+;filenamej=0;/ 獲得逆序的文件或目錄名,存入 filename 中 if(i0) Para2i+1=0;else Para2i=0;j-;for(i=0;i0) / 查找路徑 int sign=FindPath(Para2); if(sign=0) return 0;return 1;/ 緩沖區(qū)安全輸入子函

21、數(shù)/ 如果輸入超過 buffer_len ,則截取前 buffer_len-1 長度的輸入, /buffer_len 處字符用 /0 代替int GetInput(char* buffer,unsigned int buffer_len) unsigned int count=0; while(countsibling_prev) cp=cp-sibling_prev;if(cp-parent) cp=cp-parent; /找到父親結(jié)點else return 0; / 對當(dāng)前路徑進行相應(yīng)處理 i=strlen(path); while(pathi!=/&i0) i-;if(i!=0)path

22、i=0;else pathi+1=0;else FindPath(Para2);/ 查找路徑return 1;/ 創(chuàng)建目錄函數(shù)int mdComd() struct FileNode * temp,*tp; temp=CreateFileNode(,1,0);int sign;if(strlen(Para2)=0) /參數(shù)不能為空printf(n 命令格式有錯誤 .n);return 0;if(strlen(Para2)20) / 長度檢查printf(n 目錄名過長 n);return 0;/ 格式檢查if (!(isalpha(Para20)|Para20=_|Para20=0|Para2

23、0=/) printf( 目錄名格式有錯 !n);/* 目錄首字母可以為 字母 或 數(shù)字 或 /*/ return 0;sign=FindFilename(Para2); / 獲取目錄名 if(sign=0)return 0; if(cp-isdir!=1) / 如當(dāng)前指針指向的是文件,則報錯printf(you cannot edit a directory in under a file!n);return 0; tp=CreateFileNode(filename,1,0); / 創(chuàng)建目錄結(jié)點,并插入到指定目錄下 if(cp-child=NULL) tp-parent=cp; tp-ch

24、ild=NULL; cp-child=tp; tp-sibling_prev=NULL; tp-sibling_next=NULL;else temp=cp;/ 用 temp 找到新結(jié)點插入處 temp=temp-child;while(temp-sibling_next ) /find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=1) printf( 此目錄名已存在 n);/ 重名報錯 return 0;/ 找到了最后一個結(jié)點 temp-sibling_

25、next=tp; tp-parent=NULL; tp-child=NULL; tp-sibling_prev=temp; tp-sibling_next=NULL;return 1;/ 刪除目錄函數(shù)int rdComd() int sign;struct FileNode *temp; char cmd2;if(!CheckCommand() / 命令檢查return 0; sign=FindFilename(Para2); / 獲取目錄名 if(sign=0) return 0;if(cp-child) / 用 temp 指向要刪除的結(jié)點 temp=cp-child;|while(temp

26、-sibling_next & (strcmp(temp-filename,filename)!=0 temp-isdir!=1)temp=temp-sibling_next; if(strcmp(temp-filename,filename)!=0) printf( 不存在該目錄 !n);else printf( 不存在該目錄 !n);return 0;if(temp-isdir!=1) /要刪除的不能是文件printf(ERROR! 該命令只能刪除目錄 , 不可刪除文件 !n); return 0;if(temp-child) / 如仍有用戶使用該目錄,則不能刪除 printf(n 該目錄

27、不為空,您確定要刪除嗎? Y/N!n); GetInput(cmd,2);if(strcmp(cmd,n)=0|strcmp(cmd,N)=0)return 0;/ 刪除工作if(temp-parent=NULL) / 不是第一個孩子 temp-sibling_prev-sibling_next=temp-sibling_next; if(temp-sibling_next)/ 處理是最后一個兄弟的情況 temp-sibling_next-sibling_prev=temp-sibling_prev; temp-sibling_prev=temp-sibling_next=NULL;/ifel

28、se / 第一個孩子if(temp-sibling_next)/ 處理是最后一個兄弟的情況 temp-sibling_next-parent=temp-parent; temp-parent-child=temp-sibling_next;free(temp);return 1;/ 顯示目錄子函數(shù)int dirComd() if(strlen(Para2)0) int sign=FindPath(Para2); / 查找路徑if(sign=0) return 0; else printf(n%s, path);if(cp!=root)printf( %sn,.);if(cp-child=NUL

29、L) /指定目錄為空 return 0; tp=cp;tp=tp-child; / 指定目錄不為空,顯示其所有子目錄及文件名 while(tp) if(tp-isdir)printf( %sn,tp-filename);elseprintf( %sn,tp-filename);tp=tp-sibling_next;return 0;/ 創(chuàng)建文件函數(shù)int editComd() struct FileNode * temp=CreateFileNode(,0,0);int sign;struct FileNode *tp;if(strlen(Para2)=0) /路徑不能為空printf(n 命

30、令格式有錯誤 .n);return 0;if(strlen(Para2)20) / 長度檢查printf(n 文件名過長 n);return 0;/ 格式檢查if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/) printf( 文件名格式有錯 !n);/* 文件首字母可以為 字母 或 數(shù)字 或_ 或/ 或 回車 */return 0;sign=FindFilename(Para2);/ 獲取文件名if(sign=0)return 0;if(cp-isdir!=1) / 如當(dāng)前指針指向的是文件,則報錯printf(you cannot edit a

31、file in under a file!n);return 0;/ 創(chuàng)建文件結(jié)點,并插入到指定目錄下 tp=CreateFileNode(,1,0);strcpy(tp-filename,filename);tp-isdir=0;tp-i_nlink=0;if(cp-child=NULL) tp-parent=cp;tp-child=NULL;cp-child=tp;tp-sibling_prev=NULL;tp-sibling_next=NULL;else temp=cp;temp=temp-child;/ 用 temp 找到新結(jié)點插入處 while(temp-sibling_next )

32、 /find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=0) printf( 此文件名已存在 , 請重新輸入 n); / 重名報錯 return 0;/ 找到了最后一個結(jié)點temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;return 1;/ 刪除文件子函數(shù)int delComd() int sign;struct Fil

33、eNode *temp;if(strlen(Para2)=0) / 參數(shù)不能為空printf(n 命令格式有錯誤 .n);return 0;sign=FindFilename(Para2); / 獲取文件名if(sign=0) return 0;if(cp-child) / 用 temp 指向要刪除的結(jié)點temp=cp-child;while(temp-sibling_next&(strcmp(temp-filename,filename)!=0|temp-isdir!=0) temp=temp-sibling_next;if(strcmp(temp-filename,filename)!=0

34、) printf( 不存在該文件 !n);return 0;else printf( 不存在該文件 !n);return 0;if(temp-isdir!=0) /要刪除的不能是目錄printf(ERROR! 該命令只能刪除文件 , 不可刪除目錄 !n); return 0;if(temp-i_nlink!=0) / 如仍有用戶使用該文件,則不能刪除 printf( 還有用戶共享了該文件 , 不能刪除 !n); return 0;/ 刪除工作if(temp-parent=NULL) / 不是第一個孩子 temp-sibling_prev-sibling_next=temp-sibling_ne

35、xt; if(temp-sibling_next)/ 處理是最后一個兄弟的情況 temp-sibling_next-sibling_prev=temp-sibling_prev; temp-sibling_prev=temp-sibling_next=NULL;else / 第一個孩子if(temp-sibling_next)/ 處理是最后一個兄弟的情況 temp-sibling_next-parent=temp-parent; temp-parent-child=temp-sibling_next;free(temp);return 1;/ 獲取當(dāng)前目錄名子函數(shù)int GetDir(int

36、begin,char *path,char *curDir) int i=0;int len=strlen(path);while(!(pathbegin=)|(pathbegin=/)&beginchild;i+; / 濾過 / strcpy(path,/); else if(cp!=NULL&cp!=root) strcat(path,/);if(cp&cp-child) if(cp-isdir)cp=cp-child;/ 指針指向當(dāng)前目錄的左孩子 else printf( 路徑錯誤 !n); return 0; while(ichild) i+; / 略過 / if(cp-isdir)

37、cp=cp-child; / 繼續(xù)查找下級目錄 else printf( 路徑錯誤 !n); return 0; strcat(path,/);while(phi!=/&ifilename,curpath)!=0|(cp-isdir!=1)&cp-sibling_next!=NULL) cp=cp-sibling_next; if(strcmp(cp-filename,curpath)=0) if(cp-isdir=0) strcpy(path,oldpath);cp=temp;printf( 是文件不是目錄 .n);return 0; strcat(path,cp-filename); if(strcmp(cp-filename,curpath)!=0|cp=NULL) strcpy(path,oldpath);cp=temp;printf( 輸入路徑錯誤 n);return 0;return 1;/ 命令檢查函數(shù)int CheckCommand() if(strlen(Para2)=0) printf( 命令語法不正確 .n);return 0;return 1;/ 分解命令子函數(shù)int ParseCommand() char InputsINPUT_LEN;int i=0,j=0,ch;unsigned int

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論