




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
簡單文件系統(tǒng)的實現(xiàn)的實驗報告_操作系統(tǒng)課程設(shè)計杭州電子科技大學(xué)操作系統(tǒng)課程設(shè)計課程設(shè)計題目:簡單文件系統(tǒng)的實現(xiàn)學(xué)院:計算機(jī)學(xué)院專業(yè):計算機(jī)科學(xué)與技術(shù)(2+2)完成日期:2012-5-28簡單文件系統(tǒng)的實現(xiàn)一,課程設(shè)計的目的1,通過具體的文件愛你存儲空間的管理、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)和文件操作的實現(xiàn),加深對文件系統(tǒng)內(nèi)部數(shù)據(jù)結(jié)、功能及實現(xiàn)過程的理解二,設(shè)計要求在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲分區(qū),在其上實現(xiàn)一個簡單的基于多級目錄的但用戶單任務(wù)系統(tǒng)的文件系統(tǒng)。在1,退出文件系統(tǒng)的使用時,應(yīng)將虛擬文件系統(tǒng)一個Windows文件的方式保存到磁盤中,以便下次再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中2,文件存儲空間的分配可采用顯示鏈接分配或其它方法3,空閑磁盤空間的管理可選擇位示圖或其它方法4,文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)5,需要提供一以下操作命令i.Formatii.Mkdiriii.Rmdiriv.Lsv.Cdvi.Createvii.Openviii.Closeix.Writex.Readxi.Rmxii.Exit三,程序設(shè)計思想以及總流程圖程序設(shè)計思想1,i.首先,在文件系統(tǒng)啟動時,申請一塊較大的內(nèi)存,用來當(dāng)作文件系統(tǒng)的磁盤空間ii.然后,對其進(jìn)行格式化,虛擬磁盤的空間布局是仿照FAT16文件系統(tǒng),結(jié)構(gòu)如下:1塊2塊2塊995塊引導(dǎo)塊FAT1FAT2數(shù)據(jù)區(qū)格式化時,主要包括引導(dǎo)塊,F(xiàn)AT1,F(xiàn)AT2,的一些初始化工作例如設(shè)置文件魔數(shù),文件系統(tǒng)的信息,F(xiàn)AT1,F(xiàn)AT2的信息等等iii.根據(jù)用戶輸入的命令,調(diào)用對應(yīng)的函數(shù).2,程序流程圖程序啟動加載文件系統(tǒng)文件系統(tǒng)存在文件系統(tǒng)不存在創(chuàng)建新的文件系統(tǒng)并格式化等待用戶輸入命令。。。lsMkdirCreateExit四,系統(tǒng)各個功能的實現(xiàn)思想1,創(chuàng)建目錄a)調(diào)用do_read讀入當(dāng)前目錄文件到內(nèi)存,檢查新建文件目錄是否重名b)分配一個空閑的打開文件表項c)分配一個空閑的盤塊d)在當(dāng)前目錄中問新建目錄尋找一個空閑的目錄項e)設(shè)置FCB,文件的屬性信息f)創(chuàng)建特殊的兩個目錄項‘.’,‘..’g)返回2,Cd命令a)Open指定的目錄名,調(diào)用read讀入該父目錄到內(nèi)存b)檢查新的當(dāng)前目錄名是否存在c)關(guān)閉原當(dāng)前目錄d)設(shè)置當(dāng)前目錄為該目錄3,Rmdir命令a)Read讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查要刪除的文件目錄是否存在b)檢查該目錄是否為空c)檢查是否已經(jīng)打開,打開用close則關(guān)閉d)回收給目錄文件的磁盤塊e)修改該目錄文件的目錄項f)修改用戶打開表項的長度信息g)返回4,Ls命令a)Read當(dāng)前目錄到內(nèi)存b)讀出目錄文件的信息,顯示到屏幕上c)返回5,Create命令a)分配一個空閑的打開文件表項b)檢查新文件的父目錄是否打開c)Read該父目錄的文件到內(nèi)存,并檢測新建的文件名是否重名d)檢查是否有空閑盤塊e)尋找空閑的目錄項f)準(zhǔn)備好新文件的FCBg)調(diào)用close關(guān)閉打開的父目錄文件h)返回6,Rm命令a)檢查要刪除的文件的父目錄是否已打開b)Read父目錄到內(nèi)存c)檢查文件是否打開d)回收磁盤快e)清空該文件的目錄項f)修改用戶打開文件表項中的長度信息g)返回7,Open命令a)檢查該文件名是否存在b)Read該父目錄到內(nèi)存c)檢查用戶打開的文件表中是否有空閑表項d)為該文件填寫空白用戶打開文件表項內(nèi)容e)返回Close8,a)檢查fd的有效性b)檢查用戶打開文件表表項的fcbstate字段c)回收該文件占據(jù)的用戶打開文件表表項d)返回9,Write命令a)檢查fd的有效性b)提示用戶輸入寫方式c)提示用戶輸入內(nèi)容d)調(diào)用do_write()將鍵入的內(nèi)容寫入到文件中e)返回寫入的字節(jié)數(shù)五,系統(tǒng)的詳細(xì)過程#include<stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>#include<string.h>#defineBLOCKSIZE1024#defineSIZE1024000#defineEND65535#defineFREE0#defineROOT_BLOCKNUM2#defineMAX_OPEN_FILE10#defineMAX_TXT_SIZE10000typedefstructFCB{charfilename[8];/*8B文件名*/charexname[3];/*3B擴(kuò)展名*/unsignedcharattribute;/*文件屬性字段*/charretainbyte[10];/*10B保留字*/unsignedshorttime;/*文件創(chuàng)建時間*/unsignedshortdate;/*文件創(chuàng)建日期*/unsignedshortfirst;/*首塊號*/unsignedlonglength;/*文件大小*/}fcb;/*文件分配表fileallocationtable*/typedefstructFAT{unsignedshortid;}fat;/*屬性對照表位76543210屬性保留保留存檔子目錄卷標(biāo)系統(tǒng)文件隱藏只讀*/typedefstructUSEROPEN{charfilename[8];/*8B文件名*/charexname[3];/*3B擴(kuò)展名*/unsignedcharattribute;/*文件屬性字段*/charretainbyte[10];/*10B保留字*/unsignedshorttime;/*文件創(chuàng)建時間*/unsignedshortdate;/*文件創(chuàng)建日期*/unsignedshortfirst;/*首塊號*/unsignedlonglength;/*文件大小*/charfree;/*表示目錄項是否為空0空1分配*/intfather;/*父目錄的文件描述符*/intdirno;/*相應(yīng)打開文件的目錄項在父目錄文件中的盤塊號*/intdiroff;/*相應(yīng)打開文件的目錄項在父目錄文件的dirno盤塊中的目錄項序號*/chardir[MAX_OPEN_FILE][80];/*相應(yīng)打開文件所在的目錄*/intcount;/*讀寫指針在文件中的位置*/charfcbstate;/*是否修改了文件的FCB內(nèi)容,修改置1,否則為0*/chartopenfile;/*表示該用戶打開的表項是否為空,若值為0,表示為空*/}useropen;typedefstructBLOCK0{unsignedshortfbnum;charinformation[200];unsignedshortroot;unsignedchar*startblock;}block0;/*全局變量定義*/unsignedchar*myvhard;/*指向虛擬磁盤的起始地址*/useropenopenfilelist[MAX_OPEN_FILE];/*用戶打開文件表數(shù)組*/useropen*ptrcurdir;/*指向用戶打開文件表中的當(dāng)前目錄所在打開文件表項的位置*/intcurfd;charcurrentdir[80];/*記錄當(dāng)前目錄的文件名*/unsignedchar*startp;/*記錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置*/charfilename[]="c:\\myfilesys";/*虛擬空間保存路徑*/unsignedcharbuffer[SIZE];/*函數(shù)聲明*/voidstartsys();voidmy_format();voidmy_cd(char*dirname);voidmy_mkdir(char*dirname);voidmy_rmdir(char*dirname);voidmy_ls();voidmy_create(char*filename);voidmy_rm(char*filename);intmy_open(char*filename);intmy_close(intfd);intmy_write(intfd);intdo_write(intfd,char*text,intlen,charwstyle);unsignedshortfindFree();intmy_read(intfd,intlen);intdo_read(intfd,intlen,char*text);voidmy_exitsys();/*函數(shù)設(shè)計*//*文件系統(tǒng)初始化*//*原型聲明:voidstartsys()功能描述,文件系統(tǒng)初始化,初始化所建立的文件系統(tǒng)輸入,無輸出,無函數(shù)功能實現(xiàn)算法描述,1,申請磁盤空間2,打開系統(tǒng)磁盤,若不存在,創(chuàng)建新的系統(tǒng)磁盤,并格式化3,初始化用戶打開文件表,將表項0分配給根目錄文件使用并填寫根目錄文件的相關(guān)信息4,將ptrcurdir指向該用戶打開文件表項5,將當(dāng)前目錄設(shè)置為根目錄*/voidstartsys(){FILE*fp;inti;myvhard=(unsignedchar*)malloc(SIZE);memset(myvhard,0,SIZE);fp=fopen(filename,"r");if(fp){fread(buffer,SIZE,1,fp);fclose(fp);if(buffer[0]!=0xaa||buffer[1]!=0xaa){printf("myfilesysisnotexist,begintocreatthefile...\n");my_format();}else{for(i=0;i<SIZE;i++)myvhard[i]=buffer[i];}}else{printf("myfilesysisnotexist,begintocreatthefile...\n");my_format();}strcpy(openfilelist[0].filename,"root");strcpy(openfilelist[0].exname,"di");openfilelist[0].attribute=0x2d;openfilelist[0].time=((fcb*)(myvhard+5*BLOCKSIZE))->time;openfilelist[0].date=((fcb*)(myvhard+5*BLOCKSIZE))->date;openfilelist[0].first=((fcb*)(myvhard+5*BLOCKSIZE))->first;openfilelist[0].length=((fcb*)(myvhard+5*BLOCKSIZE))->length;openfilelist[0].free=1;openfilelist[0].dirno=5;openfilelist[0].diroff=0;openfilelist[0].count=0;openfilelist[0].fcbstate=0;openfilelist[0].topenfile=0;openfilelist[0].father=0;memset(currentdir,0,sizeof(currentdir));strcpy(currentdir,"\\root\\");strcpy(openfilelist->dir[0],currentdir);startp=((block0*)myvhard)->startblock;ptrcurdir=&openfilelist[0];curfd=0;}/*原型聲明:voidmy_format()功能描述,對虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件輸入,無輸出,無函數(shù)功能實現(xiàn)算法描述,虛擬磁盤空間布局1塊2塊2塊995塊引導(dǎo)塊FAT1FAT2數(shù)據(jù)區(qū)虛擬磁盤一共劃分成1000個磁盤塊每塊1024個字節(jié),磁盤空間布局如上將數(shù)據(jù)區(qū)的第一塊,即虛擬磁盤的第6塊,分配給根目錄文件*/voidmy_format(){FILE*fp;fat*fat1,*fat2;block0*b0;time_t*now;structtm*nowtime;unsignedchar*p;fcb*root;inti;p=myvhard;b0=(block0*)p;fat1=(fat*)(p+BLOCKSIZE);fat2=(fat*)(p+3*BLOCKSIZE);/*引導(dǎo)塊*/b0->fbnum=0xaaaa;/*文件系統(tǒng)魔數(shù)10101010*/b0->root=5;strcpy(b0->information,"MyFileSystemVer1.0\nBlocksize=1KBWholesize=1000KBBlocknum=1000RootBlocknum=2\n");/*FAT1,FAT2前面五個磁盤塊已分配,標(biāo)記為END*/fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=6;fat2->id=6;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;/*將數(shù)據(jù)區(qū)的標(biāo)記為空閑狀態(tài)*/for(i=7;i<SIZE/BLOCKSIZE;i++){(*fat1).id=FREE;(*fat2).id=FREE;fat1++;fat2++;}/*創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第一塊分配給根目錄區(qū)在給磁盤上創(chuàng)建兩個特殊的目錄項,".","..",除了文件名之外,其它都相同*/p+=BLOCKSIZE*5;root=(fcb*)p;strcpy(root->filename,".");strcpy(root->exname,"di");root->attribute=40;now=(time_t*)malloc(sizeof(time_t));time(now);nowtime=localtime(now);root->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root++;strcpy(root->filename,"..");strcpy(root->exname,"di");root->attribute=40;time(now);nowtime=localtime(now);root->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root++;for(i=2;i<BLOCKSIZE*2/sizeof(fcb);i++,root++){root->filename[0]='\0';}fp=fopen(filename,"w");b0->startblock=p+BLOCKSIZE*4;fwrite(myvhard,SIZE,1,fp);free(now);fclose(fp);}/**//*原型聲明:voidmy_exitsys()功能描述,退出文件系統(tǒng)輸入,無輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_exitsys(){FILE*fp;fcb*rootfcb;chartext[MAX_TXT_SIZE];while(curfd)curfd=my_close(curfd);if(openfilelist[curfd].fcbstate){openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);rootfcb=(char*)text;rootfcb->length=openfilelist[curfd].length;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);}fp=fopen(filename,"w");fwrite(myvhard,SIZE,1,fp);free(myvhard);fclose(fp);}/*原型聲明:intdo_read(intfd,intlen,char*text)功能描述,實際讀文件函數(shù),讀出指定文件中從指定指針開始的長度為len的內(nèi)容到用戶空間的text中輸入,fdopen,,函數(shù)的返回值,文件的描述符len要求從文件中讀出的字節(jié)數(shù)text指向存放讀出數(shù)據(jù)的用戶區(qū)地址輸出,實際讀出的字節(jié)數(shù)函數(shù)功能實現(xiàn)算法描述,*/intdo_read(intfd,intlen,char*text){unsignedchar*buf;unsignedshortbknum;intoff,i,lentmp;unsignedchar*bkptr;char*txtmp,*p;fat*fat1,*fatptr;fat1=(fat*)(myvhard+BLOCKSIZE);lentmp=len;txtmp=text;/*申請1024B空間作為緩沖區(qū)buffer*/buf=(unsignedchar*)malloc(1024);if(buf==NULL){printf("mallocfailed!\n");return-1;}off=openfilelist[fd].count;bknum=openfilelist[fd].first;fatptr=fat1+bknum;while(off>=BLOCKSIZE){off=off-BLOCKSIZE;bknum=fatptr->id;fatptr=fat1+bknum;if(bknum==END){printf("Error,theblockisnotexist.\n");return-1;}}bkptr=(unsignedchar*)(myvhard+bknum*BLOCKSIZE);//strncpy(buf,bkptr,BLOCKSIZE);for(i=0;i<BLOCKSIZE;i++){buf[i]=bkptr[i];}while(len>0){if(BLOCKSIZE-off>len){//strncpy(txtmp,buf+off,len);//len=len-len;//openfilelist[fd].count+=len;//off+=len;for(p=buf+off;len>0;p++,txtmp++){*txtmp=*p;len--;off++;openfilelist[fd].count++;}}else{//strncpy(txtmp,buf+off,BLOCKSIZE-off);//len=len-(BLOCKSIZE-off);//openfilelist[fd].count+=(BLOCKSIZE-off);for(p=buf+off;p<buf+BLOCKSIZE;p++,txtmp++){*txtmp=*p;len--;openfilelist[fd].count++;}off=0;//txtmp+=(BLOCKSIZE-off);bknum=fatptr->id;fatptr=fat1+bknum;bkptr=(unsignedchar*)(myvhard+bknum*BLOCKSIZE);//strncpy(buf,bkptr,BLOCKSIZE);for(i=0;i<BLOCKSIZE;i++){buf[i]=bkptr[i];}}}free(buf);returnlentmp-len;}/**//*原型聲明:intmy_read(intfd,intlen)功能描述,讀文件函數(shù)輸入,fd打開文件的idlen要讀出字符的個數(shù)輸出,返回實際讀的字符的個數(shù)函數(shù)功能實現(xiàn)算法描述,*/intmy_read(intfd,intlen){chartext[MAX_TXT_SIZE];if(fd>MAX_OPEN_FILE){printf("TheFileisnotexist!\n");return-1;}openfilelist[curfd].count=0;if(do_read(fd,len,text)>0){text[len]='\0';printf("%s\n",text);}else{printf("ReadError!\n");return-1;}returnlen;}/**//*原型聲明:intdo_write(intfd,char*text,intlen,charwstyle)功能描述,實際寫文件函數(shù)輸入,fd當(dāng)前打開的文件的idtext指向要寫入的內(nèi)容的指針len本次要寫入字節(jié)數(shù)wstyle寫方式輸出,實際寫入的字節(jié)數(shù)函數(shù)功能實現(xiàn)算法描述,*/intdo_write(intfd,char*text,intlen,charwstyle){unsignedchar*buf;unsignedshortbknum;intoff,tmplen=0,tmplen2=0,i,rwptr;unsignedchar*bkptr,*p;char*txtmp,flag=0;fat*fat1,*fatptr;fat1=(fat*)(myvhard+BLOCKSIZE);txtmp=text;/*申請臨時1024B的buffer*/buf=(unsignedchar*)malloc(BLOCKSIZE);if(buf==NULL){printf("mallocfailed!\n");return-1;}rwptr=off=openfilelist[fd].count;bknum=openfilelist[fd].first;fatptr=fat1+bknum;while(off>=BLOCKSIZE){off=off-BLOCKSIZE;bknum=fatptr->id;if(bknum==END){bknum=fatptr->id=findFree();if(bknum==END)return-1;fatptr=fat1+bknum;fatptr->id=END;}fatptr=fat1+bknum;}fatptr->id=END;bkptr=(unsignedchar*)(myvhard+bknum*BLOCKSIZE);while(tmplen<len){for(i=0;i<BLOCKSIZE;i++){buf[i]=0;}//if(off)//{for(i=0;i<BLOCKSIZE;i++){buf[i]=bkptr[i];tmplen2++;if(tmplen2==openfilelist[curfd].length)break;}//}//else//{//for(i=0;i<BLOCKSIZE;i++)//{//buf[i]=0;//}//}for(p=buf+off;p<buf+BLOCKSIZE;p++){*p=*txtmp;tmplen++;txtmp++;off++;if(tmplen==len)break;/*if((*p)==NULL){break;}*/}for(i=0;i<BLOCKSIZE;i++){bkptr[i]=buf[i];}openfilelist[fd].count=rwptr+tmplen;if(off>=BLOCKSIZE){off=off-BLOCKSIZE;bknum=fatptr->id;if(bknum==END){bknum=fatptr->id=findFree();if(bknum==END)return-1;fatptr=fat1+bknum;fatptr->id=END;}fatptr=fat1+bknum;bkptr=(unsignedchar*)(myvhard+bknum*BLOCKSIZE);}}free(buf);if(openfilelist[fd].count>openfilelist[fd].length){openfilelist[fd].length=openfilelist[fd].count;}openfilelist[fd].fcbstate=1;returntmplen;}/**//*原型聲明:unsignedshortfindFree()功能描述,尋找下一個空閑盤塊輸入,無輸出,返回空閑盤塊的id函數(shù)功能實現(xiàn)算法描述,*/unsignedshortfindFree(){unsignedshorti;fat*fat1,*fatptr;fat1=(fat*)(myvhard+BLOCKSIZE);for(i=6;i<END;i++){fatptr=fat1+i;if(fatptr->id==FREE){returni;}}printf("Error,Can'tfindfreeblock!\n");returnEND;}/*原型聲明:intfindFreeO()功能描述,尋找空閑文件表項輸入,無輸出,返回空閑文件表項的id函數(shù)功能實現(xiàn)算法描述,*/intfindFreeO(){inti;for(i=0;i<MAX_OPEN_FILE;i++){if(openfilelist[i].free==0){returni;}}printf("Error,opentoomanyfiles!\n");return-1;}/**//*原型聲明:intmy_write(intfd)功能描述,寫文件函數(shù)輸入,fd打開文件的id輸出,返回實際寫的長度函數(shù)功能實現(xiàn)算法描述,*/intmy_write(intfd){intwstyle=0,wlen=0;fat*fat1,*fatptr;unsignedshortbknum;unsignedchar*bkptr;chartext[MAX_TXT_SIZE];fat1=(fat*)(myvhard+BLOCKSIZE);if(fd>MAX_OPEN_FILE){printf("Thefileisnotexist!\n");return-1;}while(wstyle<1||wstyle>3){printf("Pleaseenterthenumberofwritestyle:\n1.cutwrite\t2.coverwrite\t3.addwrite\n");scanf("%d",&wstyle);getchar();switch(wstyle){case1://截斷寫{bknum=openfilelist[fd].first;fatptr=fat1+bknum;while(fatptr->id!=END){bknum=fatptr->id;fatptr->id=FREE;fatptr=fat1+bknum;}fatptr->id=FREE;bknum=openfilelist[fd].first;fatptr=fat1+bknum;fatptr->id=END;openfilelist[fd].length=0;openfilelist[fd].count=0;break;}case2://覆蓋寫{openfilelist[fd].count=0;break;}case3://追加寫{bknum=openfilelist[fd].first;fatptr=fat1+bknum;openfilelist[fd].count=0;while(fatptr->id!=END){bknum=fatptr->id;fatptr=fat1+bknum;openfilelist[fd].count+=BLOCKSIZE;}bkptr=(unsignedchar*)(myvhard+bknum*BLOCKSIZE);while(*bkptr!=0){bkptr++;openfilelist[fd].count++;}break;}default:break;}}printf("pleaseinputwritedata:\n");gets(text);if(do_write(fd,text,strlen(text),wstyle)>0){wlen+=strlen(text);}else{return-1;}if(openfilelist[fd].count>openfilelist[fd].length){openfilelist[fd].length=openfilelist[fd].count;}openfilelist[fd].fcbstate=1;returnwlen;}/*原型聲明:voidmy_mkdir(char*dirname)功能描述,創(chuàng)建子目錄函數(shù),在當(dāng)前目錄下創(chuàng)建名為dirname的目錄輸入,dirname指向新建目錄的名字的指針輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_mkdir(char*dirname){fcb*dirfcb,*pcbtmp;intrbn,i,fd;unsignedshortbknum;chartext[MAX_TXT_SIZE],*p;time_t*now;structtm*nowtime;/*將當(dāng)前的文件信息讀到text中rbn是實際讀取的字節(jié)數(shù)*/openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);dirfcb=(fcb*)text;/*檢測是否有相同的目錄名*/for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirname,dirfcb->filename)==0){printf("Error,thedirnameisalreadyexist!\n");return-1;}dirfcb++;}/*分配一個空閑的打開文件表項*/dirfcb=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirfcb->filename,"")==0)break;dirfcb++;}openfilelist[curfd].count=i*sizeof(fcb);fd=findFreeO();if(fd<0){return-1;}/*尋找空閑盤塊*/bknum=findFree();if(bknum==END){return-1;}pcbtmp=(fcb*)malloc(sizeof(fcb));now=(time_t*)malloc(sizeof(time_t));//在當(dāng)前目錄下新建目錄項pcbtmp->attribute=0x30;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;strcpy(pcbtmp->filename,dirname);strcpy(pcbtmp->exname,"di");pcbtmp->first=bknum;pcbtmp->length=2*sizeof(fcb);openfilelist[fd].attribute=pcbtmp->attribute;openfilelist[fd].count=0;openfilelist[fd].date=pcbtmp->date;strcpy(openfilelist[fd].dir[fd],openfilelist[curfd].dir[curfd]);p=openfilelist[fd].dir[fd];while(*p!='\0')p++;strcpy(p,dirname);while(*p!='\0')p++;*p='\\';p++;*p='\0';openfilelist[fd].dirno=openfilelist[curfd].first;openfilelist[fd].diroff=i;strcpy(openfilelist[fd].exname,pcbtmp->exname);strcpy(openfilelist[fd].filename,pcbtmp->filename);openfilelist[fd].fcbstate=1;openfilelist[fd].first=pcbtmp->first;openfilelist[fd].length=pcbtmp->length;openfilelist[fd].free=1;openfilelist[fd].time=pcbtmp->time;openfilelist[fd].topenfile=1;do_write(curfd,(char*)pcbtmp,sizeof(fcb),2);pcbtmp->attribute=0x28;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;strcpy(pcbtmp->filename,".");strcpy(pcbtmp->exname,"di");pcbtmp->first=bknum;pcbtmp->length=2*sizeof(fcb);do_write(fd,(char*)pcbtmp,sizeof(fcb),2);pcbtmp->attribute=0x28;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;strcpy(pcbtmp->filename,"..");strcpy(pcbtmp->exname,"di");pcbtmp->first=openfilelist[curfd].first;pcbtmp->length=openfilelist[curfd].length;do_write(fd,(char*)pcbtmp,sizeof(fcb),2);openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);pcbtmp=(fcb*)text;pcbtmp->length=openfilelist[curfd].length;my_close(fd);openfilelist[curfd].count=0;do_write(curfd,text,pcbtmp->length,2);}/**//*原型聲明:voidmy_ls()功能描述,顯示目錄函數(shù)輸入,無輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_ls(){fcb*fcbptr;inti;chartext[MAX_TXT_SIZE];unsignedshortbknum;openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb*)text;for(i=0;i<(int)(openfilelist[curfd].length/sizeof(fcb));i++){if(fcbptr->filename[0]!='\0'){if(fcbptr->attribute&0x20){printf("%s\\\t\t<DIR>\t\t%d/%d/%d\t%02d:%02d:%02d\n",fcbptr->filename,((fcbptr->date)>>9)+1980,((fcbptr->date)>>5)&0x000f,(fcbptr->date)&0x001f,fcbptr->time>>11,(fcbptr->time>>5)&0x003f,fcbptr->time&0x001f*2);}else{printf("%s.%s\t\t%dB\t\t%d/%d/%d\t%02d:%02d:%02d\t\n",fcbptr->filename,fcbptr->exname,fcbptr->length,((fcbptr->date)>>9)+1980,(fcbptr->date>>5)&0x000f,fcbptr->date&0x1f,fcbptr->time>>11,(fcbptr->time>>5)&0x3f,fcbptr->time&0x1f*2);}}fcbptr++;}openfilelist[curfd].count=0;}/**//*原型聲明:voidmy_rmdir(char*dirname)功能描述,刪除子目錄函數(shù)輸入,dirname指向新建目錄的名字的指針輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_rmdir(char*dirname){intrbn,fd;chartext[MAX_TXT_SIZE];fcb*fcbptr,*fcbtmp,*fcbtmp2;unsignedshortbknum;inti,j;fat*fat1,*fatptr;if(strcmp(dirname,".")==0||strcmp(dirname,"..")==0){printf("Error,can'tremovethisdirectory.\n");return-1;}fat1=(fat*)(myvhard+BLOCKSIZE);openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirname,fcbptr->filename)==0){break;}fcbptr++;}if(i>=rbn/sizeof(fcb)){printf("Error,thedirectoryisnotexist.\n");return-1;}bknum=fcbptr->first;fcbtmp2=fcbtmp=(fcb*)(myvhard+bknum*BLOCKSIZE);for(j=0;j<fcbtmp->length/sizeof(fcb);j++){if(strcmp(fcbtmp2->filename,".")&&strcmp(fcbtmp2->filename,"..")&&fcbtmp2->filename[0]!='\0'){printf("Error,thedirectoryisnotempty.\n");return-1;}fcbtmp2++;}while(bknum!=END){fatptr=fat1+bknum;bknum=fatptr->id;fatptr->id=FREE;}strcpy(fcbptr->filename,"");strcpy(fcbptr->exname,"");fcbptr->first=END;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);}/*原型聲明:intmy_open(char*filename)功能描述,打開文件函數(shù)輸入,filename指向要打開的文件的名字的指針輸出,返回打開的文件的id函數(shù)功能實現(xiàn)算法描述,*/intmy_open(char*filename){inti,fd,rbn;chartext[MAX_TXT_SIZE],*p,*fname,*exname;fcb*fcbptr;charexnamed=0;fname=strtok(filename,".");exname=strtok(NULL,".");if(!exname){exname=(char*)malloc(3);strcpy(exname,"di");exnamed=1;}for(i=0;i<MAX_OPEN_FILE;i++){if(strcmp(openfilelist[i].filename,filename)==0&&strcmp(openfilelist[i].exname,exname)==0&&i!=curfd){printf("Error,thefileisalreadyopen.\n");return-1;}}openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(filename,fcbptr->filename)==0&&strcmp(fcbptr->exname,exname)==0){break;}fcbptr++;}if(i>=rbn/sizeof(fcb)){printf("Error,thefileisnotexist.\n");returncurfd;}if(exnamed){free(exname);}fd=findFreeO();if(fd==-1){return-1;}strcpy(openfilelist[fd].filename,fcbptr->filename);strcpy(openfilelist[fd].exname,fcbptr->exname);openfilelist[fd].attribute=fcbptr->attribute;openfilelist[fd].count=0;openfilelist[fd].date=fcbptr->date;openfilelist[fd].first=fcbptr->first;openfilelist[fd].length=fcbptr->length;openfilelist[fd].time=fcbptr->time;openfilelist[fd].father=curfd;openfilelist[fd].dirno=openfilelist[curfd].first;openfilelist[fd].diroff=i;openfilelist[fd].fcbstate=0;openfilelist[fd].free=1;openfilelist[fd].topenfile=1;strcpy(openfilelist[fd].dir[fd],openfilelist[curfd].dir[curfd]);p=openfilelist[fd].dir[fd];while(*p!='\0')p++;strcpy(p,filename);while(*p!='\0')p++;if(openfilelist[fd].attribute&0x20){*p='\\';p++;*p='\0';}else{*p='.';p++;strcpy(p,openfilelist[fd].exname);}returnfd;}/**//*原型聲明:intmy_close(intfd)功能描述,關(guān)閉文件函數(shù)輸入,開文件的idfd打輸出,返回fd的father的id函數(shù)功能實現(xiàn)算法描述,*/intmy_close(intfd){fcb*fafcb;chartext[MAX_TXT_SIZE];intfa;/*檢查fd的有效性*/if(fd>MAX_OPEN_FILE||fd<=0){printf("Error,thefileisnotexist.\n");return-1;}fa=openfilelist[fd].father;if(openfilelist[fd].fcbstate){fa=openfilelist[fd].father;openfilelist[fa].count=0;do_read(fa,openfilelist[fa].length,text);fafcb=(fcb*)(text+sizeof(fcb)*openfilelist[fd].diroff);fafcb->attribute=openfilelist[fd].attribute;fafcb->date=openfilelist[fd].date;fafcb->first=openfilelist[fd].first;fafcb->length=openfilelist[fd].length;fafcb->time=openfilelist[fd].time;strcpy(fafcb->filename,openfilelist[fd].filename);strcpy(fafcb->exname,openfilelist[fd].exname);openfilelist[fa].count=0;do_write(fa,text,openfilelist[fa].length,2);}openfilelist[fd].attribute=0;openfilelist[fd].count=0;openfilelist[fd].date=0;strcpy(openfilelist[fd].dir[fd],"");strcpy(openfilelist[fd].filename,"");strcpy(openfilelist[fd].exname,"");openfilelist[fd].length=0;openfilelist[fd].time=0;openfilelist[fd].free=0;openfilelist[fd].topenfile=0;returnfa;}/**//*原型聲明:voidmy_cd(char*dirname)功能描述,更改當(dāng)前目錄函數(shù)輸入,dirname指向目錄名的指針輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_cd(char*dirname){char*p,text[MAX_TXT_SIZE];intfd,i;p=strtok(dirname,"\\");if(strcmp(p,".")==0)return;if(strcmp(p,"..")==0){fd=openfilelist[curfd].father;my_close(curfd);curfd=fd;ptrcurdir=&openfilelist[curfd];return;}if(strcmp(p,"root")==0){for(i=1;i<MAX_OPEN_FILE;i++){if(openfilelist[i].free)my_close(i);}ptrcurdir=&openfilelist[0];curfd=0;p=strtok(NULL,"\\");}while(p){fd=my_open(p);if(fd>0){ptrcurdir=&openfilelist[fd];curfd=fd;}elsereturn-1;p=strtok(NULL,"\\");}}/**//*原型聲明:voidmy_create(char*filename)功能描述,創(chuàng)建文件函數(shù)輸入,filename指向文件名的指針輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_create(char*filename){char*fname,*exname,text[MAX_TXT_SIZE];intfd,rbn,i;fcb*filefcb,*fcbtmp;time_t*now;structtm*nowtime;unsignedshortbknum;fat*fat1,*fatptr;fat1=(fat*)(myvhard+BLOCKSIZE);fname=strtok(filename,".");exname=strtok(NULL,".");if(strcmp(fname,"")==0){printf("Error,creatingfilemusthavearightname.\n");return-1;}if(!exname){printf("Error,creatingfilemusthaveaexternname.\n");return-1;}openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);filefcb=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(fname,filefcb->filename)==0&&strcmp(exname,filefcb->exname)==0){printf("Error,thefilenameisalreadyexist!\n");return-1;}filefcb++;}filefcb=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(filefcb->filename,"")==0)break;filefcb++;}openfilelist[curfd].count=i*sizeof(fcb);bknum=findFree();if(bknum==END){return-1;}fcbtmp=(fcb*)malloc(sizeof(fcb));now=(time_t*)malloc(sizeof(time_t));fcbtmp->attribute=0x00;time(now);nowtime=localtime(now);fcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;strcpy(fcbtmp->filename,fname);strcpy(fcbtmp->exname,exname);fcbtmp->first=bknum;fcbtmp->length=0;do_write(curfd,(char*)fcbtmp,sizeof(fcb),2);free(fcbtmp);free(now);openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);fcbtmp=(fcb*)text;fcbtmp->length=openfilelist[curfd].length;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);openfilelist[curfd].fcbstate=1;fatptr=(fat*)(fat1+bknum);fatptr->id=END;}/**//*原型聲明:voidmy_rm(char*filename)功能描述,刪除文件函數(shù)輸入,filename指向文件名的指針輸出,無函數(shù)功能實現(xiàn)算法描述,*/voidmy_rm(char*filename){char*fname,*exname;chartext[MAX_TXT_SIZE];fcb*fcbptr;inti,rbn;unsignedshortbknum;fat*fat1,*fatptr;fat1=(fat*)(myvhard+BLOCKSIZE);fname=strtok(filename,".");exname=strtok(NULL,".");if(!fname||strcmp(fname,"")==0){printf("Error,removingfilemusthavearightname.\n");return-1;}if(!exname){printf("Error,removingfilemusthaveaexternname.\n");return-1;}openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(fname,fcbptr->filename)==0&&strcmp(exname,fcbptr->exname)==0){break;}fcbptr++;}if(i>=rbn/sizeof(fcb)){printf("Error,thefileisnotexist.\n");return-1;}bknum=fcbptr->first;while(bknum!=END){fatptr=fat1+bknum;bknum=fatptr->id;fatptr->id=FREE;}strcpy(fcbptr->filename,"");strcpy(fcbptr->exname,"");fcbptr->first=END;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);}/*主函數(shù)*/voidmain(){charcmd[15][10]={"mkdir","rmdir","ls","cd","create","rm","open","close","write","read","exit"};chars[30],*sp;intcmdn,i;sta
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年證件打印一體機(jī)項目合作計劃書
- 2025年中石化:石油腦項目合作計劃書
- 吧臺設(shè)備轉(zhuǎn)讓合同范例
- 影片拍攝投標(biāo)合同范本
- 農(nóng)業(yè)技能培訓(xùn)合同范本
- 司機(jī)水泥合同范例
- 合同范例新版正版
- 單位綠化施工合同范例
- LED戶外顯示屏廣告位租賃合同范本
- 個人購房合同范本簡易
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫完整
- 部編版《道德與法治》四年級下冊全冊教案
- 雷鋒精神生生不息-2025年學(xué)校3.5學(xué)雷鋒月主題活動方案
- 山東2025年山東大學(xué)輔導(dǎo)員招聘筆試歷年參考題庫附帶答案詳解
- 骨科管理制度
- 電動叉車培訓(xùn)課件
- 2025年山東化工職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 健身行業(yè)會員權(quán)益保障及免責(zé)條款協(xié)議
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- “供應(yīng)商融資安排”會計列報、披露問題研究
- 顱內(nèi)動脈動脈瘤介入治療臨床路徑
評論
0/150
提交評論