操作系統(tǒng) 模擬文件管理 大作業(yè)_第1頁
操作系統(tǒng) 模擬文件管理 大作業(yè)_第2頁
操作系統(tǒng) 模擬文件管理 大作業(yè)_第3頁
操作系統(tǒng) 模擬文件管理 大作業(yè)_第4頁
操作系統(tǒng) 模擬文件管理 大作業(yè)_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計二:模擬文件管理一設(shè)計目的(1) 建立一個簡單的模擬文件管理系統(tǒng)。(2) 理解用戶界面和操作命令在操作系統(tǒng)中的作用。二設(shè)計要求需要實現(xiàn)一個命令行操作界面,包含如下命令:1.創(chuàng)建文件 功能:創(chuàng)立一個指定名字的新文件,即在目錄中增加一項,不考慮文件內(nèi)容,但必須能輸入文件長度。2.刪除文件 功能:刪除指定的文件3.創(chuàng)建目錄 功能:在當(dāng)前路徑下創(chuàng)建指定的目錄。4.刪除目錄 功能:刪除當(dāng)前目錄下的指定目錄,如果該目錄為空,則可刪除,否則應(yīng)提示是否作刪除,刪除操作將該目錄下的全部文件和子目錄都刪除。5.改變目錄 功能:工作目錄轉(zhuǎn)移到指定的目錄下,只要求完成改變到當(dāng)前目錄的某一個子目錄下的功能,不要

2、求實現(xiàn)相對目錄以及絕對目錄。 6.顯示目錄 功能:顯示全部目錄以及文件,輸出時要求先輸出接近根的目錄,再輸出子目錄。對于重名(創(chuàng)建時),文件不存在(刪除時),目錄不存在(改變目錄時)等錯誤情況,程序應(yīng)該作出相應(yīng)處理并給出錯誤信息。界面的提示符為#,提示的命令以及調(diào)試的方法應(yīng)和前面的要求一致,可以自己設(shè)計更多的命令或者附加功能。三環(huán)境本實驗是在windows xp+vc 6.0環(huán)境下實現(xiàn)的,利用windows SDK 提供的系統(tǒng)接口(API)完成程序功能。在windows xp下安裝好VC后進(jìn)行,VC是一個集成開發(fā)環(huán)境,其中包含了windows SDK所有工具,所以就不用單獨在安裝SDK了,程序

3、中所用的API是操作系統(tǒng)提供的用來進(jìn)行應(yīng)用程序設(shè)計的系統(tǒng)功能接口。要使用這些API,需要包含對這些函數(shù)進(jìn)行說明的SDK頭文件,最常見的就是windows.h。一些特殊的API調(diào)用還需要包含其他的頭文件。四步驟1. 打開VC,選擇菜單項File->New,選擇Project選項卡并建立一個名為filesys的win32 console application工程。2. 在工程中創(chuàng)建原文件filesys.cpp:選擇菜單項Project->Add to Project->File,此時將打開一個新窗口,在其中輸入想要創(chuàng)建的文件名字,這里是filesys.cpp,在其中編輯好原文件

4、并保存。3. 通過調(diào)用菜單項Build->Rebuild all進(jìn)行編譯連接,可以在指定的工程目錄下得到debug->filesys.exe程序,可以在控制臺進(jìn)入該debug目錄運行程序了。5 源代碼程序:#include <stdio.h>#include <iostream>#include <string.h>#include <ctype.h>#include <stdlib.h>#define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11usi

5、ng namespace std;/結(jié)點結(jié)構(gòu)struct FileNode char filenameFILENAME_LEN; /文件名/目錄名int isdir; /目錄文件識別標(biāo)志int i_nlink; /文件的鏈接數(shù)int adr; /文件的地址struct FileNode *parent, *child;/指向父親的指針和指向左孩子的指針struct FileNode *sibling_prev, *sibling_next;/指向前一個兄弟的指針和指向/后一個兄弟的指針.;void Init(); /初始化文件樹int ParseCommand(); /接受輸入的命令并把其分解

6、成操作名和路徑文件名void ExecuteCommand(); /執(zhí)行命令int cdComd(); /處理cd命令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é)點struct FileNode* CreateFileNod

7、e(char filename,int isdir,int i_nlink);/創(chuàng)建結(jié)點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,Para2INPU

8、T_LEN-COMMAND_LEN;char 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(

9、"n-n");Init();/初始化文件樹while(1) /printf("#");if(ParseCommand()/分解命令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命令

10、 else if(strcmp(Para1,"md")=0) sign=mdComd();else if(strcmp(Para1,"del")=0) sign=delComd(); /del命令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命令elseprint

11、f("命令錯誤,請重試n"); /命令輸入不正確,報錯/創(chuàng)建結(jié)點struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink)/申請結(jié)點空間 struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode);/相應(yīng)內(nèi)容賦初值 strcpy(node->filename,filename);node->isdir=isdir;node->i_nlink=i_nlink;node->parent=NULL;

12、node->child=NULL;node->sibling_prev=NULL;node->sibling_next=NULL; return node;/初始化文件樹void Init()struct FileNode *dir1Node,*dir2Node,*file1Node,*etcNode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;strcpy(path,"/"); /根目錄寫入當(dāng)前路徑/創(chuàng)建文件樹的結(jié)點dir1Node=CreateFileNode("dir1&q

13、uot;,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=CreateFil

14、eNode("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=dir1Node;root->sibling_prev=root->sibling_next=NULL;dir1Node->parent=root;dir1Node->

15、;child=NULL;dir1Node->sibling_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-&g

16、t;sibling_next=etcNode;etcNode->parent=NULL;etcNode->child=NULL;etcNode->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=NUL

17、L;userNode->sibling_prev=libNode;userNode->sibling_next=binNode2;binNode2->parent=NULL;binNode2->child=NULL;binNode2->sibling_prev=userNode;binNode2->sibling_next=NULL;liuNode->parent=libNode;liuNode->child=NULL;liuNode->sibling_prev=NULL;liuNode->sibling_next=sunNode;s

18、unNode->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é)點int FindFilename(char Para2)i=strlen(Para2)-1;j=0;while(P

19、ara2i!='/'&& i>=0)filenamej=Para2i;i-; j+;filenamej='0'/獲得逆序的文件或目錄名,存入filename中if(i<0) Para2i+1='0'else Para2i='0'j-;/filename逆轉(zhuǎn),獲得正確的文件或目錄名for(i=0;i<strlen(filename)/2;i+,j-)tmp=filenamei;filenamei=filenamej;filenamej=tmp;/return filenamei;/查找路徑if(st

20、rlen(Para2)>0)int sign=FindPath(Para2);if(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<buffer_len)if(buffercount=getchar()=10)buffercount

21、='0'return count;count+;while(getchar()!=10);bufferbuffer_len-1='0'return -1;/分解命令子函數(shù)int ParseCommand()char InputsINPUT_LEN;int i=0,j=0,ch;unsigned int k=0;/int k=0;printf("%s>",path);printf("#");/獲取輸入if(GetInput(Inputs,INPUT_LEN)=-1)printf("輸入行太長。n")

22、;return 0;Para10=Para20='0'/獲取參數(shù)Para1,即操作名while(Inputsi!=' '&&Inputsi!='0' && i<COMMAND_LEN-1) Para1i=Inputsi;i+;/whilePara1i='0'/輸入命令太長if(i=(COMMAND_LEN-1)return 1;/獲取參數(shù)2,即路徑文件名if(Inputsi!='0') while(Inputsi=' ' && i<INPU

23、T_LEN-1) i+;j=0;while(Inputsi!='0' && i<INPUT_LEN-1) Para2j=Inputsi;i+; j+;Para2j='0'Trim(Para1);Trim(Para2);/將操作名全部轉(zhuǎn)換成小寫字母for(k=0;k<strlen(Para1);k+)ch=tolower(int)Para1k);Para1k=ch;return 1;/cd功能處理子函數(shù)int cdComd()if(!CheckCommand() /命令檢查return 0;if(strcmp(Para2,".

24、")=0) /對cd.命令的處理int i;while(cp->sibling_prev)cp=cp->sibling_prev;if(cp->parent) cp=cp->parent; /找到父親結(jié)點else return 0; /對當(dāng)前路徑進(jìn)行相應(yīng)處理i=strlen(path);while(pathi!='/'&&i>0) i-;if(i!=0)pathi='0'elsepathi+1='0'else FindPath(Para2);/查找路徑printf("進(jìn)入工作目錄n

25、"); 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;char *tmp;begin=0;end=strlen(str);/找到字符串第一個非空格的位置while(strbegin=' 

26、9;&&strbegin!='0')begin+; /去除字符串尾部空格 while(str-end=' ');strend+1='0'/ 除去空格if(begin<end)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;int len=strlen(p

27、ath);while(!(pathbegin='')|(pathbegin='/')&&begin<len) curDiri+=pathbegin+; curDiri='0'Trim(curDir);return begin+1;/查找路徑函數(shù)int FindPath(char *ph)struct FileNode *temp; /struct FileNode *tp,*temp;char oldpathINPUT_LEN-COMMAND_LEN;unsigned int i=0; /int i=0int sign=1;

28、if(strcmp(ph,"/")=0) /ph是根目錄cp=root;strcpy(path,"/");return 1;temp=cp;strcpy(oldpath,path);/保留原路徑和指針if(ph0='/') /指針指向根目錄的左孩子cp=root->child;i+; /濾過'/'strcpy(path,"/");else if(cp!=NULL&&cp!=root)strcat(path,"/");if(cp&&cp->c

29、hild)if(cp->isdir)cp=cp->child;/指針指向當(dāng)前目錄的左孩子elseprintf("路徑錯誤!n");return 0;while(i<=strlen(ph)&&cp) /繼續(xù)查找指定路徑,如遇到文件則報錯int j=0;if(phi='/'&&cp->child)i+; /略過'/'if(cp->isdir)cp=cp->child; /繼續(xù)查找下級目錄else printf("路徑錯誤!n");return 0;strcat

30、(path,"/"); / curpath 記錄當(dāng)前要找的路徑名while(phi!='/'&&i<=strlen(ph)curpathj=phi;i+; j+;curpathj='0'while(strcmp(cp->filename,curpath)!=0|(cp->isdir!=1)&&cp->sibling_next!=NULL) cp=cp->sibling_next; if(strcmp(cp->filename,curpath)=0)if(cp->isdi

31、r=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;/創(chuàng)建文件子函數(shù)int creatComd() struct FileNode * temp=CreateFileNode("",0,0

32、);int sign;struct FileNode *tp;/路徑不能為空if(strlen(Para2)=0)printf("n命令格式有錯誤.n");return 0;/長度檢查if(strlen(Para2)>50)printf("n文件名過長n");return 0;/格式檢查if (!(isalpha(Para20)|Para20='_'|Para20='0'|Para20='/')printf("文件名格式有錯!n");/* 文件首字母可以為'字母'或

33、'數(shù)字'或'_'或'/'或'回車'*/return 0;/獲取文件名sign=FindFilename(Para2);if(sign=0)return 0;if(cp->isdir!=1)/如當(dāng)前指針指向的是文件,則報錯printf("you cannot edit a file in under a file!n");return 0;/創(chuàng)建文件結(jié)點,并插入到指定目錄下tp=CreateFileNode("",1,0);strcpy(tp->filename,filename)

34、;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;elsetemp=cp; /用temp找到新結(jié)點插入處temp=temp->child;while(temp->sibling_next )/find the last sibing nodetemp=temp->sibling_next;if(strcmp(temp-&

35、gt;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;printf("新建文件n"); printf("nn模擬文件管理系統(tǒng)n"); printf("ncd 改變目錄; cr

36、eat 創(chuàng)建文件; del 刪除文件;n");printf("dir 顯示目錄; md 創(chuàng)建目錄; rd 刪除目錄; exit 退出.n");printf("n-n");return 1;/刪除文件子函數(shù)int delComd() int sign;struct FileNode *temp;/參數(shù)不能為空if(strlen(Para2)=0)printf("n命令格式有錯誤.n");return 0;/獲取文件名sign=FindFilename(Para2);if(sign=0) return 0;/用temp指向要刪除

37、的結(jié)點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,filename)!=0)printf("不存在該文件!n");return 0;elseprintf("不存在該文件!n");return 0;/要刪除的不能是目錄if(tem

38、p->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_next;if(temp->sibling_next)/處理是最后一個兄弟的情況temp-&g

39、t;sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;printf("刪除完畢");/ifelse/第一個孩子 if(temp->sibling_next)/處理是最后一個兄弟的情況temp->sibling_next->parent=temp->parent;temp->parent->child=temp->sibling_next; printf("刪除完畢n&quo

40、t;);/elsefree(temp); 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;/int mdComd() struct FileNode * temp,*tp;temp=CreateFileNode("",1,0);int sign;/參數(shù)不能為空if(strle

41、n(Para2)=0)printf("n命令格式有錯誤.n");return 0;/長度檢查if(strlen(Para2)>50)printf("n目錄名過長n");return 0;/格式檢查if (!(isalpha(Para20)|Para20='_'|Para20='0'|Para20='/')printf("目錄名格式有錯!n");/* 目錄首字母可以為'字母'或'數(shù)字'或'/'*/return 0;/獲取目錄名sign=

42、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;/創(chuàng)建目錄結(jié)點,并插入到指定目錄下tp=CreateFileNode(filename,1,0);if(cp->child=NULL)tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp-&g

43、t;sibling_next=NULL;elsetemp=cp; /用temp找到新結(jié)點插入處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");/重名報錯return 0;/找到了最后一個結(jié)點temp->sibling_next=tp;tp->

44、parent=NULL;tp->child=NULL;tp->sibling_prev=temp;tp->sibling_next=NULL; printf("創(chuàng)建目錄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;int rdComd() in

45、t sign;struct FileNode *temp;char cmd2;/命令檢查if(!CheckCommand()return 0;/獲取目錄名sign=FindFilename(Para2);if(sign=0) return 0;/用temp指向要刪除的結(jié)點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;/要刪除的不能是文件if(temp->isdir!=1)printf("ERROR!該命令只能刪除目錄,不可刪除文件!n");return 0;/如仍有用戶使用該目錄,則不能刪除if(temp->child)printf("n該

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論