版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年河北專(zhuān)升本數(shù)學(xué)真題試卷含答案
- 2026年初中美術(shù)教師考試試卷培訓(xùn)試卷
- 六年級(jí)下冊(cè)數(shù)學(xué)北師大含答案 圖形的旋轉(zhuǎn)(一)
- 醫(yī)院科室月份工作總結(jié)
- 消處分思想報(bào)告2026(3篇)
- 痤瘡治療知識(shí)試題及答案解析
- 五年級(jí)下冊(cè)數(shù)學(xué)北師大含答案 分?jǐn)?shù)乘法(一)2
- 基金試題及答案APP:備考基金的得力助手
- 2026中國(guó)太陽(yáng)能熱水器生產(chǎn)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 江西省宜春市上高二中2025-2026學(xué)年高二下學(xué)期7月期末地理試卷(含部分解析)
- 蔬菜采購(gòu)述職報(bào)告
- 25版:學(xué)案89 掌握議論文寫(xiě)作結(jié)構(gòu)導(dǎo)圖(高分式)-借助導(dǎo)圖形成思路
- JJG 1009-2024X、γ輻射個(gè)人劑量當(dāng)量HP(10)監(jiān)測(cè)儀檢定規(guī)程
- 2024年T+產(chǎn)品歷年考試高頻考點(diǎn)試題附帶答案
- 抑郁癥健康教育知識(shí)講座
- 腫瘤多組學(xué)研究
- FLUKE1550C電子兆歐表使用介紹
- GB/T 29008-2012農(nóng)林輪式拖拉機(jī)行車(chē)制動(dòng)裝置的性能要求
- 模電實(shí)驗(yàn)元件識(shí)別和儀器使用課件
- 浦東新區(qū)青青年心理健康教育三年行動(dòng)打算
- T-CCIAT 0043-2022 建筑工程滲漏治理技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論