版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計(jì)二:模擬文件管理一設(shè)計(jì)目的(1) 建立一個(gè)簡單的模擬文件管理系統(tǒng)。(2) 理解用戶界面和操作命令在操作系統(tǒng)中的作用。二設(shè)計(jì)要求需要實(shí)現(xiàn)一個(gè)命令行操作界面,包含如下命令:1. 創(chuàng)建文件功能: 創(chuàng)立一個(gè)指定名字的新文件, 即在目錄中增加一項(xiàng),不考慮文件內(nèi)容,但必須能輸入 文件長度。2. 刪除文件 功能:刪除指定的文件3. 創(chuàng)建目錄 功能:在當(dāng)前路徑下創(chuàng)建指定的目錄。4. 刪除目錄 功能:刪除當(dāng)前目錄下的指定目錄,如果該目錄為空,則可刪除,否則應(yīng)提示是否作刪除, 刪除操作將該目錄下的全部文件和子目錄都刪除。5. 改變目錄 功能:工作目錄轉(zhuǎn)移到指定的目錄下, 只要求完成改變到當(dāng)前目錄的某一個(gè)子
2、目錄下的功能, 不要求實(shí)現(xiàn)相對目錄以及絕對目錄。6. 顯示目錄 功能:顯示全部目錄以及文件,輸出時(shí)要求先輸出接近根的目錄,再輸出子目錄。對于重名(創(chuàng)建時(shí)) ,文件不存在(刪除時(shí)) ,目錄不存在(改變目錄時(shí))等錯(cuò)誤情況, 程序應(yīng)該作出相應(yīng)處理并給出錯(cuò)誤信息。界面的提示符為 #,提示的命令以及調(diào)試的方法應(yīng)和前面的要求一致,可以自己設(shè)計(jì)更 多的命令或者附加功能。三環(huán)境本實(shí)驗(yàn)是在 windows xp+vc 6.0 環(huán)境下實(shí)現(xiàn)的,利用 windows SDK 提供的系統(tǒng)接口 (API )完成程序功能。在 windows xp 下安裝好 VC 后進(jìn)行, VC 是一個(gè)集成開發(fā)環(huán)境,其 中包含了 windo
3、ws SDK所有工具,所以就不用單獨(dú)在安裝 SDK 了,程序中所用的API是操 作系統(tǒng)提供的用來進(jìn)行應(yīng)用程序設(shè)計(jì)的系統(tǒng)功能接口。要使用這些API,需要包含對這些函數(shù)進(jìn)行說明的 SDK 頭文件,最常見的就是 windows.h 。一些特殊的 API 調(diào)用還需要包含其 他的頭文件。四步驟1. 打開 VC ,選擇菜單項(xiàng) File-New ,選擇 Project 選項(xiàng)卡并建立一個(gè)名為 filesys 的 win32 console application 工程。2. 在工程中創(chuàng)建原文件 filesys.cpp :選擇菜單項(xiàng) Project-Add to Project-File ,此時(shí)將打開 一個(gè)新窗
4、口,在其中輸入想要創(chuàng)建的文件名字,這里是filesys.cpp ,在其中編輯好原文件并保存。3. 通過調(diào)用菜單項(xiàng) Build-Rebuild all 進(jìn)行編譯連接,可以在指定的工程目錄下得到 debug-filesys.exe 程序,可以在控制臺進(jìn)入該 debug 目錄運(yùn)行程序了。五 源代碼程序:#include #include #include #include #include #define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11using namespace std;/結(jié)點(diǎn)結(jié)構(gòu)struct FileNode/
5、文件名 /目錄名/目錄文件識別標(biāo)志/文件的鏈接數(shù)/文件的地址 指向父親的指針和指向左孩子的指針 指向前一個(gè)兄弟的指針和指向char filenameFILENAME_LEN;int isdir;int i_nlink;int adr;struct FileNode *parent, *child;/struct FileNode *sibling_prev, *sibling_next;/ /后一個(gè)兄弟的指針 .;void Init();int ParseCommand();件名void ExecuteCommand();int cdComd();int creatComd();int del
6、Comd();int dirComd();int mdComd();int rdComd();int FindPath(char *ph);int FindFilename(char Para2); 并把指針只想其父親結(jié)點(diǎn)/初始化文件樹/接受輸入的命令并把其分解成操作名和路徑文/執(zhí)行命令/處理 cd 命令/處理 creat 命令/ 處理 del 命令/ 處理 dir 命令/ 處理 md 命令/尋找參數(shù) ph 所指向的路徑/從參數(shù) Para2 中找到要建立或刪除的文件、目錄名, struct FileNode* CreateFileNode(char filename,int isdir,int
7、 i_nlink);/ 創(chuàng)建結(jié)點(diǎn) int GetInput(char* buffer,unsigned int buffer_len);/ 獲取輸入int CheckCommand();/ 命令檢查int GetDir(int begin,char *path,char *curDir);/ 獲取路徑 void Trim(char *str);struct FileNode *cp, *tp, *root;char pathINPUT_LEN-COMMAND_LEN;/ 記錄當(dāng)前走過的路徑char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;char
8、 curpathINPUT_LEN-COMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN; char filenameFILENAME_LEN,tmp;unsigned int i,j;/int i,j;/主函數(shù)int main()printf( 模擬文件管理系統(tǒng) n);printf(ncd 改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n); printf(dir 顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n); printf(nn);Init();/ 初始化文件樹while(1) /printf(#);if(Parse
9、Command()/ 分解命令ExecuteCommand();/ 執(zhí)行命令return 0;/執(zhí)行命令子函數(shù)void ExecuteCommand() int sign;/根據(jù)參數(shù) Para1 調(diào)用相應(yīng)的功能處理模塊if(strcmp(Para1,cd)=0) sign=cdComd(); /cd 命令 else if(strcmp(Para1,creat)=0) sign=creatComd();/edit 命令 else if(strcmp(Para1,md)=0) sign=mdComd();else if(strcmp(Para1,del)=0) sign=delComd(); /d
10、el 命令 else if(strcmp(Para1,rd)=0) sign=rdComd();else if(strcmp(Para1,dir)=0)sign=dirComd(); /dir 命令 else if(strcmp(Para1,exit)=0)exit(0); /exit 命令 elseprintf( 命令錯(cuò)誤 ,請重試 n); /命令輸入不正確,報(bào)錯(cuò) /創(chuàng)建結(jié)點(diǎn)struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink) /申請結(jié)點(diǎn)空間struct FileNode* node=(struct File
11、Node*)malloc(sizeof(struct 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 *dir1Node,*dir2Node, *file1Node,*etcNode,*libNode,*u
12、serNode, *binNode2,*liuNode,*sunNode,*ftiNode;strcpy(path,/); / 根目錄寫入當(dāng)前路徑 /創(chuàng)建文件樹的結(jié)點(diǎn) dir1Node=CreateFileNode(dir1,1,0); dir2Node=CreateFileNode(dir2,1,0); file1Node=CreateFileNode(file1,0,0); etcNode=CreateFileNode(etc,1,0); libNode=CreateFileNode(lib,1,0); userNode=CreateFileNode(user,1,0); binNode2
13、=CreateFileNode(bin,1,0); liuNode=CreateFileNode(liu,1,0); sunNode=CreateFileNode(sun,1,0); ftiNode=CreateFileNode(fti,1,0); cp=tp=root=CreateFileNode(/,1,0);/結(jié)點(diǎn)相應(yīng)內(nèi)容賦值 root-parent=NULL;root-child=dir1Node; root-sibling_prev=root-sibling_next=NULL;dir1Node-parent=root;dir1Node-child=NULL;dir1Node-sib
14、ling_prev=NULL;dir1Node-sibling_next=dir2Node;dir2Node-parent=NULL;dir2Node-child=libNode;dir2Node-sibling_prev=dir1Node;dir2Node-sibling_next=file1Node;file1Node-parent=NULL;file1Node-child=NULL;file1Node-sibling_prev=dir2Node;file1Node-sibling_next=etcNode;etcNode-parent=NULL;etcNode-child=NULL;et
15、cNode-sibling_prev=file1Node;etcNode-sibling_next=NULL;libNode-parent=dir2Node;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;
16、binNode2-sibling_prev=userNode;binNode2-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
17、-sibling_prev=sunNode; ftiNode-sibling_next=NULL;/獲取文件或目錄名,并把指針指向其父親結(jié)點(diǎn)int FindFilename(char Para2)i=strlen(Para2)-1;j=0;while(Para2i!=/& i=0)filenamej=Para2i;i-; j+;filename 中filenamej=0;/ 獲得逆序的文件或目錄名, if(i0) Para2i+1=0;else Para2i=0;j-;/filename 逆轉(zhuǎn),獲得正確的文件或目錄名 for(i=0;i0)int sign=FindPath(Para2);if
18、(sign=0)return 0;return 1;/緩沖區(qū)安全輸入子函數(shù) /如果輸入超過 buffer_len ,則截取前 buffer_len-1 長度的輸入, /buffer_len 處字符用 /0代替int GetInput(char* buffer,unsigned int buffer_len) unsigned int count=0;/int count=0; while(count,path); printf(#);/獲取輸入 if(GetInput(Inputs,INPUT_LEN)=-1)printf( 輸入行太長。 n);return 0;Para10=Para20=0
19、;獲取參數(shù)Paral,即操作名while(Inputsi!= &Inputsi!=0 & iCOMMAND_LEN-1) Para1i=Inputsi;i+;/while Para1i=0;/輸入命令太長if(i=(COMMAND_LEN-1)return 1;/獲取參數(shù) 2,即路徑文件名 if(Inputsi!=0)while(Inputsi= & iINPUT_LEN-1) i+; j=0;while(Inputsi!=0 & iINPUT_LEN-1) Para2j=Inputsi; i+; j+; Para2j=0; Trim(Para1); Trim(Para2);/將操作名全部轉(zhuǎn)換
20、成小寫字母 for(k=0;ksibling_prev) cp=cp-sibling_prev;if(cp-parent) cp=cp-parent; / 找到父親結(jié)點(diǎn) else return 0; /對當(dāng)前路徑進(jìn)行相應(yīng)處理 i=strlen(path);while(pathi!=/&i0) i-; if(i!=0)pathi=0;elsepathi+1=0;else Fin dPath(Para2); 查找路徑printf( 進(jìn)入工作目錄 n);printf(nn 模擬文件管理系統(tǒng) n);printf(ncd 改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n); printf(
21、dir 顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n); printf(nn);return 1;/命令處理子函數(shù)void Trim(char *str)int begin,end;char *tmp;begin=0;end=strlen(str);/找到字符串第一個(gè)非空格的位置while(strbegin= &strbegin!=0)begin+;/去除字符串尾部空格while(str-end= );strend+1=0;/ 除去空格if(beginend)tmp=(char *)malloc(sizeof(char)*(end-begin+2); strcpy
22、(tmp,&strbegin);strcpy(str,tmp);free(tmp);/獲取當(dāng)前目錄名子函數(shù)int GetDir(int 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)前目錄的左孩子 els
23、eprintf( 路徑錯(cuò)誤 !n);return 0;while(ichild)i+; / 略過 / if(cp-isdir) cp=cp-child; / 繼續(xù)查找下級目錄 else printf( 路徑錯(cuò)誤 !n); return 0; strcat(path,/);/ curpath 記錄當(dāng)前要找的路徑名 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) str
24、cpy(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( 輸入路徑錯(cuò)誤 n); return 0; return 1;/創(chuàng)建文件子函數(shù) int creatComd() struct FileNode * temp=CreateFileNode(,0,0);int sign;struct FileNode *tp;/路徑不能為空i
25、f(strlen(Para2)=0)printf(n 命令格式有錯(cuò)誤 .n);return 0;/長度檢查if(strlen(Para2)50)printf(n 文件名過長 n);return 0;/格式檢查if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/)printf( 文件名格式有錯(cuò) !n);/* 文件首字母可以為 字母 或數(shù)字 或_或/或回車 */ return 0;/獲取文件名sign=FindFilename(Para2);if(sign=0)return 0;if(cp-isdir!=1)/ 如當(dāng)前指針指向的是文件,則報(bào)錯(cuò)printf
26、(you cannot edit a file in under a file!n);return 0;/創(chuàng)建文件結(jié)點(diǎn),并插入到指定目錄下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 找到新結(jié)點(diǎn)插入處 temp=temp-child;while(tem
27、p-sibling_next )/find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=0) printf( 此文件名已存在 n);/ 重名報(bào)錯(cuò) return 0;/ 找到了最后一個(gè)結(jié)點(diǎn)temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp; tp-sibling_next=NULL;printf( 新建文件 n);printf(nn 模擬文件管理系統(tǒng) n);printf
28、(ncd 改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n); printf(dir 顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n); printf(nn);return 1;/刪除文件子函數(shù)int delComd()int sign;struct FileNode *temp;/參數(shù)不能為空 if(strlen(Para2)=0)printf(n 命令格式有錯(cuò)誤 .n); return 0;/獲取文件名sign=FindFilename(Para2);if(sign=0) return 0;/用 temp 指向要刪除的結(jié)點(diǎn)if(cp-child)
29、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) printf( 不存在該文件 !n);return 0;elseprintf( 不存在該文件 !n); return 0;/要刪除的不能是目錄 if(temp-isdir!=0) printf(ERROR! 該命令只能刪除文件 ,不可刪除目錄 !n); return 0;/如仍有用戶使用該文
30、件,則不能刪除 if(temp-i_nlink!=0)printf( 還有用戶共享了該文件,不能刪除 !n);return 0;/刪除工作if(temp-parent=NULL)/ 不是第一個(gè)孩子 temp-sibling_prev-sibling_next=temp-sibling_next; if(temp-sibling_next)/ 處理是最后一個(gè)兄弟的情況 temp-sibling_next-sibling_prev=temp-sibling_prev; temp-sibling_prev=temp-sibling_next=NULL;printf( 刪除完畢 );/ifelse/第
31、一個(gè)孩子 if(temp-sibling_next)/ 處理是最后一個(gè)兄弟的情況temp-sibling_next-parent=temp-parent;temp-parent-child= temp-sibling_next;printf( 刪除完畢 n);/elsefree(temp);printf(nn 模擬文件管理系統(tǒng) n);printf(ncd 改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n); printf(dir 顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n); printf(nn);return 1;/ int mdComd()st
32、ruct FileNode * temp,*tp; temp=CreateFileNode(,1,0);int sign;/參數(shù)不能為空 if(strlen(Para2)=0)printf(n 命令格式有錯(cuò)誤 .n); return 0;/長度檢查 if(strlen(Para2)50)printf(n 目錄名過長 n); return 0;/格式檢查if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/)printf( 目錄名格式有錯(cuò) !n);/* 目錄首字母可以為 字母 或 數(shù)字 或 /*/ return 0;/獲取目錄名sign=FindFile
33、name(Para2);if(sign=0)return 0;if(cp-isdir!=1)/ 如當(dāng)前指針指向的是文件,則報(bào)錯(cuò)printf(you cannot edit a directory in under a file!n); return 0;/創(chuàng)建目錄結(jié)點(diǎn),并插入到指定目錄下 tp=CreateFileNode(filename,1,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 找到
34、新結(jié)點(diǎn)插入處temp=temp-child;while(temp-sibling_next )/find the last sibing nodetemp=temp-sibling_next;if(strcmp(temp-filename,filename)=0&temp-isdir=1)printf( 此目錄名已存在 n);/ 重名報(bào)錯(cuò)return 0;/ 找到了最后一個(gè)結(jié)點(diǎn)temp-sibling_next=tp; tp-parent=NULL;tp-child=NULL; tp-sibling_prev=temp; tp-sibling_next=NULL; printf( 創(chuàng)建目錄 n
35、);printf(nn 模擬文件管理系統(tǒng) n);printf(ncd 改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n); printf(dir 顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n);n);printf(nreturn 1;int rdComd()int sign;struct FileNode *temp;char cmd2;/命令檢查if(!CheckCommand()return 0;/獲取目錄名sign=FindFilename(Para2); if(sign=0) return 0;/用 temp 指向要刪除的結(jié)點(diǎn) if(cp-c
36、hild)temp=cp-child;while(temp-sibling_next & (strcmp(temp-filename,filename)!=0 | temp-isdir!=1) temp=temp-sibling_next;if(strcmp(temp-filename,filename)!=0)printf( 不存在該目錄 !n);return 0;elseprintf( 不存在該目錄 !n);return 0;/要刪除的不能是文件if(temp-isdir!=1)printf(ERROR! 該命令只能刪除目錄 ,不可刪除文件 !n);return 0;/如仍有用戶使用該目錄,則不能刪除 if(temp-child)printf(n 該目錄不為空,您確定要刪除嗎? Y/N!n); GetInput(cmd,2); if(strcmp(cmd,n)=0|strcmp(cmd,N)=0) return 0;/刪除工作 if(temp-parent=NULL)/ 不是第一個(gè)孩子 temp-sibling_prev-sibling_next=temp-sibli
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度綠色建筑施工現(xiàn)場環(huán)保施工監(jiān)管合同3篇
- 2024年度高端摩托車租賃服務(wù)合作協(xié)議2篇
- 2024年武漢地區(qū)記賬代理業(yè)務(wù)協(xié)議樣本版B版
- 2024年度建筑工程施工合同綠色施工與節(jié)能要求3篇
- 漯河醫(yī)學(xué)高等??茖W(xué)校《材料與工藝(陶瓷)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度水利工程圍板定制與水利設(shè)施保護(hù)協(xié)議3篇
- 2024年標(biāo)準(zhǔn)個(gè)人借款與連帶責(zé)任擔(dān)保協(xié)議版B版
- 2024年版智能交通系統(tǒng)研發(fā)與實(shí)施合同
- 2024年度實(shí)習(xí)培訓(xùn)生崗位實(shí)習(xí)協(xié)議書模板集錦2篇
- 2024年度室內(nèi)木門行業(yè)聯(lián)盟合作發(fā)展合同3篇
- 2023年高考物理復(fù)習(xí)26電磁感應(yīng)中的圖像問題
- 全生命周期目標(biāo)成本管理
- 基礎(chǔ)手語-南京特殊教育師范學(xué)院中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 淺談國航海外營業(yè)部營銷創(chuàng)新解決方案環(huán)球旅訊特約評論員-楊超-
- 山西保利平山煤業(yè)股份有限公司煤炭資源開發(fā)利用和礦山環(huán)境保護(hù)與土地復(fù)墾方案
- 牛津譯林版八年級英語上冊Unit 7 Reading (I) 示范課教學(xué)設(shè)計(jì)
- 公司財(cái)務(wù)預(yù)算工作報(bào)告
- 民警工作調(diào)動申請書
- 2022年軍隊(duì)文職考試公共科目試題
- 題庫(大氣科學(xué)基礎(chǔ)(一)-題庫)資料
- 人音版八年級上冊音樂期末測試試題及答案
評論
0/150
提交評論