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

下載本文檔

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

文檔簡(jiǎn)介

目錄

一.課程設(shè)計(jì)目的1

二.課程設(shè)計(jì)要求1

三.設(shè)計(jì)思想及流程2

四.數(shù)據(jù)結(jié)構(gòu)3

五.詳細(xì)設(shè)計(jì)4

六.程序源代碼5

七.運(yùn)行結(jié)果17

八.課程設(shè)計(jì)心得17

九.參考文獻(xiàn)18

一.課程設(shè)計(jì)目的

深入了解文件管理系統(tǒng),初步掌握文件管理系統(tǒng)的實(shí)現(xiàn)方法。

用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)簡(jiǎn)單的文件系統(tǒng),模擬文件管理的工作過(guò)程。從而對(duì)各種

文件操作命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比擬深入的了解。

二.課程設(shè)計(jì)要求

編寫(xiě)一程序,模擬一個(gè)簡(jiǎn)單的文件管理系統(tǒng)。樹(shù)型結(jié)構(gòu),目錄下可以是目錄,也可以是文

件。

在此文件管理系統(tǒng),可實(shí)現(xiàn)的操作有:

改變目錄:格式:cd〈目錄名)

顯示目錄:格式:dir〈目錄名〉

創(chuàng)立目錄:格式:md〈目錄名)

刪除目錄:格式:rd〈目錄名)

新建文件:格式:edit<文件名)

刪除文件:格式:del〈文件名)

退出文件系統(tǒng):exit

1.文件系統(tǒng)采用二叉樹(shù)型存儲(chǔ)結(jié)構(gòu),結(jié)點(diǎn)結(jié)構(gòu)如下:

structFileNode

charfilename[FILENAME_LEN];〃文件名/目錄名

intisdir;〃目錄、文件的識(shí)別標(biāo)志(0為文件,1為目錄)

inti_nlink;〃文件的鏈接數(shù)

//intadr;〃文件的地址

structFileNode*parent,*chiId;//指向父親的指針和指向左孩子的指計(jì)

structFileNode*sibling_prcv,*siblingncxt;〃指向前一個(gè)兄弟的指針和指向后

一個(gè)兄弟的指針.

};

2.目錄名和文件名支持全路徑名和相對(duì)路徑名,路徑名各分量間用“/”隔開(kāi)

3.功能具體描述:

改變目錄:改變當(dāng)前工作目錄,目錄不存在時(shí)給出出錯(cuò)信息

顯示目錄:顯示指定目錄下或當(dāng)前目錄下所有文件和一級(jí)目錄(選做:帶/s參數(shù)的dir命

令,顯示所有子目錄)

創(chuàng)立目錄:在指定路徑或當(dāng)前路徑下創(chuàng)立指定日錄。重名時(shí)給出錯(cuò)信息。

刪除目錄:刪除指定目錄下所有文件和子目錄。要?jiǎng)h目錄不空時(shí),要給出提示是否要?jiǎng)h除。

創(chuàng)立文件:創(chuàng)立指定名字的文件,只要?jiǎng)?chuàng)立表示文件的節(jié)點(diǎn)即可,內(nèi)容及大小不考慮。

刪除文件:刪除指定文件,不存在時(shí)給出出錯(cuò)信息。

退出文件系統(tǒng):exit

4、總體流程:

初始化文件目錄;

輸出提示符,等待接受命令,分析鍵入的命令;

對(duì)合法的命令,執(zhí)行相應(yīng)的處理程序,否那么輸出錯(cuò)誤信息,繼續(xù)等待新命令,直到鍵入

EXIT退出為止。

三.設(shè)計(jì)思想及流程

1.在內(nèi)存中開(kāi)辟一個(gè)虛擬磁盤(pán)空間作為文件存儲(chǔ)器,在其上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的單用戶(hù)文件系

統(tǒng)。

2.文件存儲(chǔ)空間的分配采用顯式鏈接分配。為了實(shí)現(xiàn)創(chuàng)立和刪除文件必須要有一棵初始的

文件樹(shù)存在,以便在文件樹(shù)的根節(jié)點(diǎn)下實(shí)現(xiàn)創(chuàng)立和刪除文件。

3.數(shù)據(jù)結(jié)構(gòu)與樹(shù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互

之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。

樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱(chēng)為結(jié)點(diǎn))按分支關(guān)

系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)中每個(gè)分叉點(diǎn)稱(chēng)為結(jié)點(diǎn),起始結(jié)點(diǎn)稱(chēng)為樹(shù)

根,任意兩個(gè)結(jié)點(diǎn)間的連接關(guān)系稱(chēng)為樹(shù)枝,結(jié)點(diǎn)下面不再有分枝稱(chēng)為樹(shù)葉。結(jié)點(diǎn)的前趨結(jié)

點(diǎn)稱(chēng)為該結(jié)點(diǎn)的“雙親”,結(jié)點(diǎn)的后趨結(jié)點(diǎn)稱(chēng)為該結(jié)點(diǎn)的“孩子”,同一結(jié)點(diǎn)的“孩子"之間互稱(chēng)”

兄弟二

4.文件目錄結(jié)構(gòu)采用多級(jí)目錄結(jié)構(gòu)。為了簡(jiǎn)單起見(jiàn),可以使用文件結(jié)構(gòu)體,結(jié)構(gòu)體內(nèi)容包

括:文件名,文件口錄識(shí)別標(biāo)示,文件鏈接數(shù),以及他的左孩子右孩子左兄弟右兄弟指

5.要有分解函數(shù)對(duì)輸入的命令進(jìn)行分解。以識(shí)別那局部是哪局部是命令,哪局部是路徑和

文件名。

6.最后要有執(zhí)行函數(shù)。來(lái)執(zhí)行輸入的創(chuàng)立文件命令。

四.數(shù)據(jù)結(jié)構(gòu)

L文件結(jié)構(gòu)體

structFileNode

{

charfilename[FILENAME_LEN];〃文件名/目錄名

intisdir;〃目錄文件識(shí)別標(biāo)志

inti_nlink;〃文件的鏈接數(shù)

intadr;〃文件的地址

structFileNode*parenl,*child;〃指向父親的指針和指向左孩子的指針

structFileNode*sibling_prev,*sibling_next;〃指向前一個(gè)兄弟的指針和指向

〃后一個(gè)兄弟的指針.

):

整個(gè)文件系統(tǒng)采用二叉樹(shù)型存儲(chǔ)結(jié)構(gòu),初始化文件樹(shù)如下:

圖4-1初始目錄樹(shù)

2.所使用函數(shù)及其功能

intMain();〃主函數(shù)

voidInit();〃初始化文件樹(shù)

intParseCommand();〃接受輸入的命令并把其多解成操作名和路徑文件名

voidExecuteCommand。;//執(zhí)行命令,分別執(zhí)行cd,edit,md,del,rd,dir,exit命令

intcdComd();〃改變目錄功能處理

inteditComd();〃處理edit命令,即創(chuàng)立文件,只要?jiǎng)?chuàng)立表示文件的節(jié)點(diǎn)即可,內(nèi)容及大小

不考慮

intmdComd。;//創(chuàng)立目錄

intdelComd。;//處理del命令,即刪除指定文件,不存在是給出錯(cuò)誤信息

inldirComd();〃處理dir命令,顯示目錄

intrdComd。;〃刪除目錄

intFindFilename(charPara2[]);〃查找文件名

structFileNode*CreateFilcNodc(charfilenamc[J,intisdir,inti_nlink);〃創(chuàng)立結(jié)點(diǎn)

intGetlnput(char*buffer,unsignedintbuffer」en);〃獲取輸入

3.所使用的變量

structFileNode*cp,*tp,*roo(;//*cp,*tp,*root是根目錄節(jié)點(diǎn)

charpath[INPUT_LEN-COMMAND_LEN];〃記錄當(dāng)前走過(guò)的路徑

charParal[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//paral數(shù)組存儲(chǔ)輸入

的命令,para2數(shù)組存儲(chǔ)輸入的文件名

charfilcnamc[FILENAME_LEN],tnip;

unsignedinti,j;

開(kāi)始

圖5-3刪除函數(shù)流程圖

4)ParseCommand()分解命令函數(shù)流程圖

圖5-4分解命令函數(shù)流程圖

六.程序源代碼

#include<stdio.h>

#include<iostream>

#include<string.h>

#include<ctype.h>

#include<stdlib.h>

#dcfincFILENAME_LEN21

#defineINPUT_LEN81

#defineCOMMAND.LEN11

usingnamespacestd;

void初始化文件樹(shù)

intParseCommand。,接受輸入的命令并把其分解成操作名和路徑文件名

voidExecuteCommand();〃執(zhí)行命令

intcdComd();〃處理cd命令

intedilComd();〃處理edit命令

intdelComd();〃處理del命令

intdirComd。;〃處理dir命令

intmdComd();〃處理md命令

intrdComd。;〃處理rd命令

intFindPath(char小ph);〃尋找參數(shù)ph所指向的路徑

intFindFilcnamc(charPara2口);〃從參數(shù)Para2中找到要建立或刪除的文件、目錄名,并把指針只想其父親

結(jié)點(diǎn)

structFilcNodc*CrcatcFilcNodc(charfilcnamc[],intisdir,inti_nlink);〃創(chuàng)立結(jié)點(diǎn)

intGellnpul(char*buffer,unsignedin(buffer」en);〃獲取輸入

intCheckCommand。;〃命令檢查

intGetDir(intbegin,char*path,char*curDir);〃獲取路徑

structFileNode*cp,*tp,*root;

charpalh[INPUT_LEN-COMMAND_LEN];〃記錄當(dāng)前走過(guò)的路徑

charParalfCOMMAND_LENLP<ira2[INPUT_LEN-COMMAND_LENl;

charcurpathlINPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LENJ;

charfiIcnamc[FILENAME_LEN],(mp;

unsignedinti,j;//inti,j;

structFileNode〃結(jié)點(diǎn)結(jié)構(gòu)

{

charfilename[FILENAME_LEN];〃文件名/目錄名

in(isdir;〃目錄文件識(shí)別標(biāo)志

inti」Wnk;〃文件的鏈接數(shù)

structFileNode*parent,*chikl;〃指向父親的指針和指向左孩子的指針

structFileNode*sibling_prev,*sibling_next;〃指向前一,個(gè)兄弟的指針和指向后一個(gè)兄弟的指針.

);

〃創(chuàng)立結(jié)點(diǎn)

structFileNode*CreateFileNode(charfilename[J,intisdir,inti_nlink){

structFileNode*node=(structFileNode*)malloc(sizeof(structFileNode));//申請(qǐng)結(jié)點(diǎn)空間

〃相應(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_ncxt=NULL;

returnnode;

)

〃初始化文件樹(shù)

voidInit(){

structFileNode*binNode,*usrNode,

*unixNode,*etcNode,*libNode,*userNode,

*binNodc2,*liuNode,*sunNodc,*ftiNodc;

strcpy(path;7");〃根目錄寫(xiě)入當(dāng)前路徑

〃創(chuàng)立文件樹(shù)的結(jié)點(diǎn)

binNode=CreateFileNode(,'bin,',1,0);

usrNode=CreateFileNode("usr,,,1,0);

unixNode=CreateFileNode("unix'\0,0);

etcNode=CreateFileNode("etc",1,0);

!ibNodc=CreatcFilcNodc("lib",1,0);

userNode=CreateFileNode("user",1,0);

binNode2=CreateFileNode("bin"J,0);

liuNode=CreateFileNode("liu",1.0);

sunNodc=CreatcFilcNodc("sun,,,l,0);

ftiNode=CreateFileNode("ftir,1,0);

cp=tp=root=CreateFileNode('7",1,0);

〃結(jié)點(diǎn)相應(yīng)內(nèi)容賦值

root->parent=NULL;

root->child=binNode;

root->sibling_prev=root->sibling_next=NULL;

binNode->parcnt=root;

binNodc->child=NULL;

binNode->sibling_prev=NULL;

binNode->sibling_next=usrNode;

usrNode->parent=NULL;

usrNode->child=libNode;

usrNode->sibling_prev=binNode;

usrNodc->sibling_ncxt=unixNode;

unixNode->parent=NULL;

unixNode->child=NULL;

unixNode->sibling_prev=usrNode;

unixNode->sibling_next=etcNode;

etcNode->parent=NULL;

etcNode->child=NULL;

ctcNodc->sibling_prcv=unixNode;

etcNode->sibling_next=NULL;

libNodc->parcnt=usrNodc;

libNode->child=liuNode:

libNode->sibling_prev=NULL:

IibNode->sibling_next=userNode;

userNode->parent=NULL;

uscrNodc->child=NULL;

userNode->sibling_prev=libNode;

userNode->sibling_next=binNode2;

binNode2->parent=NULL;

binNode2->child=NULL;

binNode2->sibling_prev=userNode;

binNode2->sibling_next=NULL;

liuNodc->parcnt=libNode;

liuNode->child=NULL;

liuNode->sibling_prev=NULL:

liuNode->sibling_next=sunNode;

sunNode->parent=NULL;

sunNode->child=NULL;

sunNode->sibling_prev=]iuN[)de;

sunNode->sibling_next=ftiNodc;

ftiNode->parent=NULL;

ftiNode->child=NULL;

ftiNode->sibling_prev=sunNode;

ftiNode->sibling_ncxt=NULL;

〃獲取文件或目錄名,并把指針指向其父親結(jié)點(diǎn)

intFindFilename(charPara2[]){

i=strlen(Para2)-l;

j=0;

while(Para2[il!=7'&&i>=0){

filcnamc[j]=Para2li];

}

filenameljlCO'J/獲得逆序的文件或目錄名,存入filename中

if(i<0)Para2[i+l]='\O';

elsePara2[i]=>\0';

j~~?

for(i=0;i<strlcn(filcname)/2;i++,j-){//filename逆轉(zhuǎn),獲得正確的文件或目錄名

tmp=filename[i];

filenanic[i]=filcnamc[j];

filename[j]=unp;

}

if(strlen(Para2)>0){〃查找路徑

intsign=FindPath(Para2);

if(sign==O)

return0;

)

returnI;

I

〃緩沖區(qū)平安輸入子函數(shù)

〃如果輸入超過(guò)buffejlen,那么截取前bufler」en-l長(zhǎng)度的輸入,

//bufferjen處字符用'/O'代替

intGetlnput(char*buffer,unsignedintbufferjen){

unsignedintcount=0;

while(count<buffer_len){

if((buffer[count]=getchar())==l0){

buffer[count]='\0';

returncount;

)

count++;

)

while(getchar()!=10);

buffer[buffer_ien-1]='\0';

return-1;

)

〃改變目錄函數(shù)

intcdComdO{

if(!CheckCommand())〃命令檢查

return0;

if(strcmp(Para2,"..")==0){〃對(duì)cd..命令的處理

inii;

while(cp->sibling_prev)

cp=cp->sibling_prev;

if(cp->parent)

{cp=cp->parent;}//找到父親結(jié)點(diǎn)

else

{return0;}

〃對(duì)當(dāng)前路徑進(jìn)行相應(yīng)處理

i=strlen(path);

while(path[i]!=7'&&i>0)i-;

if(i!=0)

path[i]=\(y;

else

path[i+l]='\0';

}

else{

FindPaih(Para2)W查找路徑

}

return1;

)

//創(chuàng)立目錄函數(shù)

intmdComd(){

structFilcNodc*tcmp,*tp;

temp=CreateFiIeNode("",1,0);

intsign;

if(strlen(Para2)==0){〃參數(shù)小能為空

printf("\n命令格式有錯(cuò)誤An”);

return0;

)

if(strlen(Para2)>20){〃長(zhǎng)度檢查

printf("\n目錄名過(guò)長(zhǎng)\n");

return0;

)

〃格式檢查

if(!(isalpha(Para2[O])||Para2[D]==,_,l|Para2|O]==,\O,||Para2lO]==7,)){

printfC目錄名格式有錯(cuò)八n");/*|=|錄首字母可以為‘字母,或,數(shù)字,或,/'*/

return0;

I

sign=FindFilename(Para2);〃獲取忖錄名

if(sign==O)

return0;

if(cp->isdir!=l){〃如當(dāng)前指針指向的是文件,那么報(bào)錯(cuò)

prinlf("youcannoteditadirectoryinunderafile!\n");

return0;

tp=CrcateFilcNodc(filcnamc,1,0);〃創(chuàng)立目錄結(jié)點(diǎn),并插入到指定目錄下

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找至lj新結(jié)點(diǎn)插入處

lemp=iemp->child;

while(temp->sibling_next){//findthelastsibingnode

tenip=temp->sibling_next;

if(strcmp(temp->filename,filename)==O&&temp->isdir==1){

printf("此目錄名已存在\n");〃重名報(bào)錯(cuò)

retum0;

}

}〃找到了最后一個(gè)結(jié)點(diǎn)

temp->sibling_next=tp;

tp->parent=NULL;

tp->child=NULL;

tp->sibling_prcv=tcmp;

lp->sibling_next=NULL;

)

returnI;

I

〃刪除目錄函數(shù)

intrdComdO{

intsign;

structFileNode*lemp;

charcmd[2];

if(!CheckCommand())〃命令檢查

return0;

sign=FindFilenanie(Para2);/廢取目錄名

if(sign==0)return0:

if(cp->child){〃用temp指向要?jiǎng)h除的結(jié)點(diǎn)

temp=cp->child;

while(temp->sibling_next&&(strcmp(temp->filename,filename)!=0||temp->isdir!=l))

lemp=(emp->sibling_next;

if(strcmp(temp->filename,filename)!=O){

printf("不存在該目錄!\n”);

return0;

else{

printf("不存在該目錄!\n");

return0;

)

if(temp->isdir!=l){〃要?jiǎng)h除的不能是文件

prinlf(”ERROR!該命令只能刪除目錄,不可刪除文件!\n”);

return0;

)

if(temp->child){〃如仍有用戶(hù)使用該目錄,那么不能刪除

printf("\n該目錄不為空,您確定要?jiǎng)h除嗎?Y/N!\n");

Gctlnput(cmd,2);

if(strcmp(cmd,"n,,)==O||strcmp(cmd,,'N")==O)

return0;

}

〃刪除工作

if(temp->parent==NULL){〃不是第一個(gè)孩子

temp->sibling_prcv->sibling_ncxt=tcmp->sibling_ncxt;

if(temp->sibling_next)〃處理是最后一個(gè)兄弟的情況

tcmp->sibling_ncxt->sibling_prcv=tcmp->sibling_prcv;

temp->sibling_prev=iemp->sibling_nexi=NULL;

}//if

else{〃第一個(gè)孩子

if(temp->sibling_nexl)〃處理是最后一個(gè)兄弟的情況

tcmp->sibling_ncxt->parcnt=tcmp->parcnt;

temp->parent->child=temp->sibling_next;

)

free(temp);

return1;

)

〃顯示目錄子函數(shù)

intdirComd(){

if(strlen(Para2)>0){

intsign二FindPath(Para2);〃查找路徑

if(sign==O){return0;}

else

{printf("\n%s>'\path);}

}

if(cp!=root)

printfC<DIR>%s\n";'..");

if(cp->child==NULL)〃指定目錄為空

{return0;}

tp=cp;

tp=tp->child;〃指定目錄不為空,顯示其所有子目錄及文件名

while(tp){

if(tp->isdir)

printf(n<DIR>%s\n",tp->filename);

else

printf("<FILE>%s\n",tp->filename);

tp=tp->sibling_ncxt;

)

return0;

)

〃創(chuàng)立文件函數(shù)

inteditComd(){

structFileNode*temp=CreateFileNode("",0.0);

intsign;

structFileNode*tp;

if(strlen(Para2)==0){//路徑不能為空

printf("\n命令格式有錯(cuò)誤An");

return0;

)

if(strlen(Para2)>20){〃長(zhǎng)度檢查

printf("\n文件名過(guò)長(zhǎng)\n");

return0;

)

〃格式檢查

if(!(isaIpha(Para2[0])||Para2[0]==,_,||Para2[0]=='\0|||Para2[0]==7,)){

prinlf("文件名格式有錯(cuò)八n”);/*文件首字母可以為,字母,或,數(shù)字,或1或/或恒車(chē)為

return0;

)

sign=FindFilename(Para2);〃獲取文件名

if(sign==0)

return0;

if(cp->isdir!=l){〃如當(dāng)前指針指向的是文件,那么報(bào)錯(cuò)

printf("youcannoteditafileinunderafile!\n");

return0;

)

〃創(chuàng)立文件結(jié)點(diǎn),并插入到指定目錄下

tp=CreateFileNode("",1,0);

strcpy(tp->filename,filename);

tp->isdir=O;

tp->i_nlink=O;

if(cp->child==NULL){

tp->parcnt=cp;

(p->child=NULL;

cp->child=tp;

tp->sibling_prev=NULL;

tp->sibling_next=NULL;

)

else{

temp=cp;

temp=temp->child;//用temp找到新結(jié)點(diǎn)插入處

while(tenip->sibling_ncxt){//findthelastsibingnode

temp=temp->sibling_next;

if(strcinp(tcmp->fil3name,filcnainc)==0&&tcmp->isdir==0){

printfT此文件名已存在,請(qǐng)重新輸入W);〃重名報(bào)錯(cuò)

return0;

}

}〃找到了最后一個(gè)結(jié)點(diǎn)

temp->sibling_next=tp;

tp->parent=NULL;

tp->child=NULL;

tp->sibling_prcv=tcmp;

tp->sibling_next=NULL;

I

return1;

)

〃刑除文件子函數(shù)

intdclComd(){

intsign;

structFilcNodc*tcmp;

if(sirlen(Para2)==O){〃參數(shù)不能為空

printf("\n命令格式有錯(cuò)誤.\n”);

return0;

}

sign=FindFilcnamc(Para2);〃獲取文件名

if(sign==O)return0;

if(cp->child){〃用temp指向要?jiǎng)h除的結(jié)點(diǎn)

(emp=cp->child;

while(temp->sibling_next&&(strcmp(temp->filename,filename)!=O||temp->isdir!=O))

temp=temp->sibling_next;

if(strcmp(temp->filename,filename)!=O){

printf("不存在該文件不

return0;

I

)

else{

printf("不存在該文件!\n");

return0;

)

if(temp->isdir!=O){〃要?jiǎng)h除的不能是1=1錄

printf(”ERROR!該命令只能刪除文件,不可刪除目錄!\n”);

return0;

}

if(temp->i_nlink!=O){〃如仍有用戶(hù)使用該文件,那么不能刪除

prinlf(”還有用戶(hù)共享了該文件,不能刪除!\n”);

return0;

〃刪除工作

if(temp->parent==NULL){〃不是第一個(gè)孩子

tcmp->sibling_prcv->sibling_ncxt=tcmp->sibling_ncxt;

if((emp->sibling_next)//處理是最后一個(gè)兄弟的情況

temp->sibling_next->sibling_prev=temp->sibling_prev;

temp->sibling_prev=(emp->sibling_next=NULL;

}

else{〃第一個(gè)孩子

if(temp->sibling_next)〃處理是最后一個(gè)兄弟的情況

tcnip->sibling_ncxt->parent=tcmp->parent;

tcmp->parcnt->child=tcmp->sibling_ncxt;

}

free(iemp);

return1;

)

〃獲取當(dāng)前目錄名子函數(shù)

intGctDir(intbegin,char*path,char*curDir){

in(i=0;

intlcn=strlcn(path);

while(!((path[begin]=='\V)||(path[begin]=-/'))&&begin<len)

{curDir[i++]=path[begin+-];}

curDirli]='\O';

returnbegin+1;

)

〃行找路徑函數(shù)

intFindPath(char*ph){

structFileNode*lemp;//structFileNode*(p,*(emp;

charoldpath[INPUT_LEN-COMMAND_LEN];

unsignedinti=0;//inti=0

intsign=l;

if(strcmp(ph,'7")==0){//ph是根目錄

cp=root;

strcpy(path,'7'');

return1;

}

temp=cp;

strcpy(oldpalh,path);〃保存原路徑和指針

if(ph|O]==,/'){〃指針指向根目錄的左孩子

cp=root->child;

i++;〃濾過(guò)/

strcpy(path,'7");

}

else{

if(cp!=NULL&&cp!=root)

strcat(path,"/");

if(cp&&cp->child){

if(cp->isdir)

cp=cp->child;〃指針指向當(dāng)前用錄的左孩子

else{

primf("路徑錯(cuò)誤!\n”);

return0;

}

)

)

while(i<=strlen(ph)&&cp){〃繼續(xù)查找指定路徑,如遇到文件那么報(bào)錯(cuò)

intj=0;

if(phfi]==7,&&cp->child){

i++;〃略過(guò)/

if(cp->isdir)

cp二cp->child;〃繼續(xù)查找下級(jí)目錄

else{

printf("路徑錯(cuò)誤!\n”);

return0;

)

strcat(path,"/");

)

while(ph[i]!=7'&&i<=strlen(ph)){//curpath記錄當(dāng)前要找的路徑名

curpath[j]=ph[i];

i++;j++;

)

curpath[j]='\0';

whilc((strcinp(cp->filcname,curpath)!=O||(cp->isdir!=l))&&cp->sibling_ncxt!=NULL)

{cp=cp->sibling_next;}

if(strcmp(cp->fiIcname,curpath)==O){

if(cp->isdir==0){

strcpy(pa(h.oldpath);

cp=temp;

prinlf("是文件不是目錄An”);

return0;

)

strcat(path,cp->filename);

)

if(sticmp(cp->filename,curpath)!=O||cp==NULL){

strcpy(path,oldpath);

cp=teinp;

printf("輸入路徑錯(cuò)誤\n");

return0;

)

)

return1;

)

〃命令檢查函數(shù)

intCheckCommandO{

if(strlen(Para2)==0){

printf("命令語(yǔ)法不正確An");

return0;

}

returnI;

)

〃分解命令子函數(shù)

intParseCommandO{

charlnputslINPUT_LENJ;

inti=O,j=O,ch;

unsignedintk=0;

printf("%s>",path);

if(GetInput(Inputs,INPUT_LEN)==-l){〃獲取輸入

printf("輸入行太長(zhǎng)入");

return0;

)

Paral[0]=Para2f0]='\0';

〃獲取參數(shù)Paral,即操作名

while(Inpuis[i]!=''&&Inpuis[i]!='\0'&&i<COMMAND_LEN-l){

Paral[i]=Inputs[i];

i++;

}

Para1[口='0';

if(i==(COMMAND_LEN-l))return1;〃輸入命令太長(zhǎng)

if(Inputs[i]!+\(y){〃獲取參數(shù)2,即路徑文件名

while(lnpu(s[i]==,'&&i<INPUT_LEN-1)i++;j=O;

while(Inpiits[i]!='\O'&&i<INPUT_LEN-l){

Para2|jJ=Inputs[i];

i++;j++;

)

Para2Lj]='\0';

}

for(k=0;k<strlen(Paral);k++){〃將操作名全部轉(zhuǎn)換成小寫(xiě)字母

ch=tolower((int)Paral[k]);

Paral[k]=ch;

}

return1;

)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論