版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)二:模擬文件管理一設(shè)計(jì)目的( 1) 建立一個(gè)簡(jiǎn)單的模擬文件管理系統(tǒng)。( 2) 理解用戶界面和操作命令在操作系統(tǒng)中的作用。二設(shè)計(jì)要求需要實(shí)現(xiàn)一個(gè)命令行操作界面,包含如下命令:1. 創(chuàng)建文件功能: 創(chuàng)立一個(gè)指定名字的新文件, 即在目錄中增加一項(xiàng),不考慮文件內(nèi)容,但必須能輸入文件長(zhǎng)度。2. 刪除文件功能:刪除指定的文件3. 創(chuàng)建目錄功能:在當(dāng)前路徑下創(chuàng)建指定的目錄。4. 刪除目錄功能:刪除當(dāng)前目錄下的指定目錄,如果該目錄為空,則可刪除,否則應(yīng)提示是否作刪除,刪除操作將該目錄下的全部文件和子目錄都刪除。5. 改變目錄功能:工作目錄轉(zhuǎn)移到指定的目錄下, 只要求完成改變到當(dāng)前目錄的某一個(gè)子目錄下的
2、功能,不要求實(shí)現(xiàn)相對(duì)目錄以及絕對(duì)目錄。6. 顯示目錄功能:顯示全部目錄以及文件,輸出時(shí)要求先輸出接近根的目錄,再輸出子目錄。對(duì)于重名(創(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è)集成開(kāi)發(fā)環(huán)境,其中包含了 windows sdk 所有工
3、具, 所以就不用單獨(dú)在安裝 sdk 了,程序中所用的 api 是操作系統(tǒng)提供的用來(lái)進(jìn)行應(yīng)用程序設(shè)計(jì)的系統(tǒng)功能接口。 要使用這些 api ,需要包含對(duì)這些函數(shù)進(jìn)行說(shuō)明的 sdk 頭文件,最常見(jiàn)的就是 windows.h 。一些特殊的 api 調(diào)用還需要包含其他的頭文件。四步驟1.打開(kāi) vc ,選擇菜單項(xiàng)file-new ,選擇 project 選項(xiàng)卡并建立一個(gè)名為filesys 的 win32console application 工程。2.在工程中創(chuàng)建原文件filesys.cpp :選擇菜單項(xiàng) project-add to project-file ,此時(shí)將打開(kāi)一個(gè)新窗口,在其中輸入想要?jiǎng)?chuàng)建的
4、文件名字,這里是filesys.cpp ,在其中編輯好原文件并保存。3. 通過(guò)調(diào)用菜單項(xiàng)build-rebuild all 進(jìn)行編譯連接,可以在指定的工程目錄下得到debug-filesys.exe 程序,可以在控制臺(tái)進(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 filenodechar filenamefil
5、ename_len;/文件名/目錄名int isdir;int i_nlink;int adr;/目錄文件識(shí)別標(biāo)志/ 文件的鏈接數(shù)/文件的地址struct filenode *parent, *child;/指向父親的指針和指向左孩子的指針struct filenode *sibling_prev, *sibling_next;/指向前一個(gè)兄弟的指針和指向/后一個(gè)兄弟的指針.;void init();/初始化文件樹(shù)int parsecommand();/ 接受輸入的命令并把其分解成操作名和路徑文件名void executecommand();/ 執(zhí)行命令int cdcomd();/處理 cd
6、命令int creatcomd();/ 處理 creat 命令int delcomd();/ 處理 del 命令int dircomd();/ 處理 dir 命令int mdcomd();/ 處理 md 命令int rdcomd();int findpath(char *ph);/尋找參數(shù) ph 所指向的路徑int findfilename(char para2);/ 從參數(shù) para2 中找到要建立或刪除的文件、目錄名,并把指針只想其父親結(jié)點(diǎn)struct filenode* createfilenode(char filename,int isdir,int i_nlink);/int ge
7、tinput(char* buffer,unsigned int buffer_len);/獲取輸入int checkcommand();/ 命令檢查創(chuàng)建結(jié)點(diǎn)int getdir(int begin,char *path,char *curdir);/獲取路徑void trim(char *str);struct filenode *cp, *tp, *root;char pathinput_len-command_len;/記錄當(dāng)前走過(guò)的路徑char para1command_len,para2input_len-command_len;char curpathinput_len-comma
8、nd_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(n-n);init();/ 初始化文件樹(shù)while(1)/printf(#); if(parsecommand()/ 分解命令executecomma
9、nd();/ 執(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(); /del 命令else if(strcmp(para1,rd)=0)sig
10、n=rdcomd();else if(strcmp(para1,dir)=0)sign=dircomd();/dir命令else if(strcmp(para1,exit)=0)exit(0);/exit命令elseprintf(命令錯(cuò)誤,請(qǐng)重試n);/命令輸入不正確,報(bào)錯(cuò)/創(chuàng)建結(jié)點(diǎn)struct filenode* createfilenode(char filename,int isdir,int i_nlink)/申請(qǐng)結(jié)點(diǎn)空間struct filenode* node=(struct filenode*)malloc(sizeof(struct filenode);/相應(yīng)內(nèi)容賦初值strc
11、py(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;/初始化文件樹(shù)void init()struct filenode *dir1node,*dir2node,*file1node,*etcnode,*libnode,*usernode,*binnode2,*liunode,*sunnode,*ftinode;strcpy(path,/)
12、; / 根目錄寫(xiě)入當(dāng)前路徑/創(chuàng)建文件樹(shù)的結(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=createfilenode(bin,1,0);liunode=createfilenode(liu,1,0);sunnode=cre
13、atefilenode(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-sibling_prev=null;dir1node-sibling_next=dir2node;dir2node-parent=null;dir2nod
14、e-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;etcnode-sibling_prev=file1node;etcnode-sibling_next=null;libnode-parent=dir2
15、node;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;binnode2-sibling_next=null;liunode-parent=l
16、ibnode;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-sibling_next=null;/獲取文件或目錄名,并把指針指向其父親結(jié)點(diǎn)int fin
17、dfilename(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-;/filename 逆轉(zhuǎn),獲得正確的文件或目錄名for(i=0;i0)int sign=findpath(para2);if(sign=0)return 0;return 1;/緩沖區(qū)安全輸入子函數(shù)/如果輸入超過(guò)buffer_len ,則截取前buffer_len-1 長(zhǎng)度的輸
18、入,/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( 輸入行太長(zhǎng)。n);return 0;para10=para20=0;/獲取參數(shù)para1,即操作名while(inputsi!= &inputsi!=0 & icommand_len-1)para1i=inputsi;i+;/whilep
19、ara1i=0;/輸入命令太長(zhǎng)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)換成小寫(xiě)字母for(k=0;ksibling_prev) cp=cp-sibling_prev;if(cp-parent) cp=cp-parent; / 找到父親結(jié)點(diǎn)else return 0
20、;/對(duì)當(dāng)前路徑進(jìn)行相應(yīng)處理i=strlen(path);while(pathi!=/&i0) i-;if(i!=0)pathi=0;elsepathi+1=0;else findpath(para2);/查找路徑printf( 進(jìn)入工作目錄n);printf(nn 模擬文件管理系統(tǒng)n);printf(ncd改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n);printf(dir顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n);printf(n-n);return 1;/命令處理子函數(shù)void trim(char *str)int begin,end;c
21、har *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(tmp,&strbegin);strcpy(str,tmp);free(tmp);/獲取當(dāng)前目錄名子函數(shù)int getdir(int begin,char *path,char *curdir)int i=0;in
22、t len=strlen(path);while(!(pathbegin=)|(pathbegin=/)&beginchild;i+; / 濾過(guò) /strcpy(path,/);else if(cp!=null&cp!=root)strcat(path,/);if(cp&cp-child)if(cp-isdir)cp=cp-child;/ 指針指向當(dāng)前目錄的左孩子elseprintf( 路徑錯(cuò)誤 !n);return 0;while(ichild)i+; / 略過(guò) /if(cp-isdir)cp=cp-child; / 繼續(xù)查找下級(jí)目錄else printf( 路徑錯(cuò)誤 !n);return
23、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)strcpy(path,oldpath);cp=temp;printf( 是文件不是目錄.n);return 0;strcat(path,cp-filename);if(strcmp(cp-filename,curpath)!=0|cp=null)s
24、trcpy(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;/路徑不能為空if(strlen(para2)=0)printf(n 命令格式有錯(cuò)誤.n);return 0;/長(zhǎng)度檢查if(strlen(para2)50)printf(n 文件名過(guò)長(zhǎng) n);return 0;/格式檢查if (!(isalpha(para20)|para20=
25、_|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(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-isdi
26、r=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;elsetemp=cp;/用 temp 找到新結(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=0)printf( 此文件名已存
27、在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(ncd改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n);printf(dir顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n);printf(n-n);return 1;/刪除文件子函數(shù)int delcomd()int sig
28、n;struct filenode *temp;/參數(shù)不能為空if(strlen(para2)=0)printf(n 命令格式有錯(cuò)誤.n);return 0;/獲取文件名sign=findfilename(para2);if(sign=0) return 0;/用 temp 指向要?jiǎng)h除的結(jié)點(diǎn)if(cp-child)temp=cp-child;while(temp-sibling_next & (strcmp(temp-filename,filename)!=0 | temp-isdir!=0)temp=temp-sibling_next;if(strcmp(temp-filename,file
29、name)!=0)printf( 不存在該文件 !n);return 0;elseprintf( 不存在該文件!n);return 0;/要?jiǎng)h除的不能是目錄if(temp-isdir!=0)printf(error! 該命令只能刪除文件,不可刪除目錄 !n);return 0;/如仍有用戶使用該文件,則不能刪除if(temp-i_nlink!=0)printf( 還有用戶共享了該文件,不能刪除 !n);return 0;/刪除工作if(temp-parent=null)/不是第一個(gè)孩子temp-sibling_prev-sibling_next=temp-sibling_next;if(tem
30、p-sibling_next)/ 處理是最后一個(gè)兄弟的情況temp-sibling_next-sibling_prev=temp-sibling_prev;temp-sibling_prev=temp-sibling_next=null;printf( 刪除完畢 );/ifelse/第一個(gè)孩子if(temp-sibling_next)/ 處理是最后一個(gè)兄弟的情況temp-sibling_next-parent=temp-parent;temp-parent-child=temp-sibling_next;printf( 刪除完畢 n);/elsefree(temp);printf(nn 模擬文
31、件管理系統(tǒng)n);printf(ncd改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n);printf(dir顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n);printf(n-n);return 1;/int mdcomd()struct filenode * temp,*tp;temp=createfilenode(,1,0);int sign;/參數(shù)不能為空if(strlen(para2)=0)printf(n 命令格式有錯(cuò)誤.n);return 0;/長(zhǎng)度檢查if(strlen(para2)50)printf(n 目錄名過(guò)長(zhǎng) n);return
32、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(you cannot edit a directory in under a file!n);return 0;/創(chuàng)建目錄結(jié)點(diǎn),并插入到指定目錄下tp=createfilenode(filename,
33、1,0);if(cp-child=null) tp-parent=cp; tp-child=null; cp-child=tp; tp-sibling_prev=null; tp-sibling_next=null;elsetemp=cp;/用 temp 找到新結(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ò)r
34、eturn 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);printf(nnprintf(ncdprintf(dir模擬文件管理系統(tǒng)n);改變目錄 ; creat 創(chuàng)建文件 ; del 刪除文件 ;n);顯示目錄 ; md 創(chuàng)建目錄 ; rd 刪除目錄 ; exit 退出 .n);printf(n-n);return 1;int rdcomd()int sign;struct filenode *te
35、mp;char cmd2;/命令檢查if(!checkcommand()return 0;/獲取目錄名sign=findfilename(para2);if(sign=0) return 0;/用 temp 指向要?jiǎng)h除的結(jié)點(diǎn)if(cp-child)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;/要?jiǎng)h除的不能是文件if(temp-isdir!=1)printf(error! 該命令只能刪除目錄,不可刪除文件 !n);return 0;/如仍有用戶使用該目錄,則不能刪除if(temp-child)pri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Tenacissoside-E-生命科學(xué)試劑-MCE
- Sulfuric-34S-acid-disodium-生命科學(xué)試劑-MCE
- Sucrose-octaacetate-Standard-生命科學(xué)試劑-MCE
- 統(tǒng)考版2025屆高考地理二輪復(fù)習(xí)專題闖關(guān)導(dǎo)練熱點(diǎn)3精準(zhǔn)扶貧與鄉(xiāng)村振興含解析
- 2024年家用電器批發(fā)服務(wù)項(xiàng)目建議書(shū)
- 2024年交叉極化傳輸用微波天線項(xiàng)目合作計(jì)劃書(shū)
- 鹽城師范學(xué)院《中國(guó)現(xiàn)當(dāng)代文學(xué)名篇賞析》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024蛋糕店用工合同范文
- 鹽城師范學(xué)院《藥劑學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 鹽城師范學(xué)院《隋唐史研究》2021-2022學(xué)年第一學(xué)期期末試卷
- 文言文特殊句式整理(完美版)課件
- 雅魯藏布江大拐彎巨型水電站規(guī)劃方案
- 第7課認(rèn)認(rèn)真真學(xué)打字(教案)- 三年級(jí)上冊(cè)信息技術(shù) 人教版
- 人教版九年級(jí)上冊(cè)化學(xué)實(shí)驗(yàn)報(bào)告單
- 廣西基本醫(yī)療保險(xiǎn)門診特殊慢性病申報(bào)表
- 城市經(jīng)濟(jì)學(xué)習(xí)題與答案
- 國(guó)開(kāi)成本會(huì)計(jì)第14章綜合練習(xí)試題及答案
- 幼兒園大班科學(xué):《樹(shù)葉為什么會(huì)變黃》課件
- 幼兒園教育活動(dòng)設(shè)計(jì)與指導(dǎo)(第二版)教案第二章第二節(jié)幼兒園語(yǔ)言教育活動(dòng)設(shè)計(jì)二
- 1到50帶圈數(shù)字直接復(fù)制
- 鐵路工程施工組織設(shè)計(jì)(施工方案)編制分類
評(píng)論
0/150
提交評(píng)論