操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告模擬FAT文件系統(tǒng)_第1頁
操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告模擬FAT文件系統(tǒng)_第2頁
操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告模擬FAT文件系統(tǒng)_第3頁
操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告模擬FAT文件系統(tǒng)_第4頁
操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告模擬FAT文件系統(tǒng)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì)之三設(shè)計(jì)任務(wù):模擬os文件系統(tǒng)在任一os(window或者dos;也可以是在linux下,但要求能將結(jié)果演示給老師看)下,建立一個(gè)大文件,把它假象成一張盤,在其中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模擬os文件系統(tǒng)。1、在現(xiàn)有機(jī)器硬盤上開辟10m(共10000個(gè)盤塊,每盤塊大小為1k)的硬盤空間(生成一個(gè)10m的用戶文件sdisk.dat即可),作為設(shè)定的硬盤空間。2、編寫一管理程序sdisk,對(duì)此空間進(jìn)行管理,以模擬os文件系統(tǒng),要求:、盤塊大小1k 、空閑盤塊的管理:采用位示圖法、文件空間管理:采用fat(文件分配表),每個(gè)盤塊號(hào)占2個(gè)字節(jié)、目錄項(xiàng)管理:、每個(gè)目錄項(xiàng)占用32字節(jié),其中前8個(gè)字節(jié)(

2、0-7)為文件名,之后跟3個(gè)字節(jié)(8-10)的擴(kuò)展名,26-27字節(jié),存放文件的第一個(gè)盤塊號(hào),最后四個(gè)字節(jié)(28-31),存放文件長(zhǎng)度(如果目錄項(xiàng)對(duì)應(yīng)的是下一級(jí)子目錄(文件),其文件長(zhǎng)度部分為0)、目錄按文件方式管理,每個(gè)目錄僅用一個(gè)盤塊(即1k,最多裝32個(gè)目錄項(xiàng))、第0個(gè)目錄項(xiàng)為本目錄,即“.”,第0個(gè)字節(jié)為“.”,即0x2e,第26-27字節(jié)指明本目錄所在盤塊。、第1個(gè)目錄項(xiàng)為父目錄,即“.”,第0,1個(gè)字節(jié)為“.”即0x2e,0x2e,第26-27字節(jié)指明父目錄所在盤塊。、每個(gè)目錄實(shí)際能放下文件或子目錄30項(xiàng)。、文件系統(tǒng)空間分配:、第0個(gè)盤塊(1k)存放磁盤信息(可以設(shè)定為格式說明“f

3、at32”、盤塊大小,盤塊數(shù)等內(nèi)容)、第1個(gè)盤塊起,至125盤塊,共125個(gè)盤塊(125k)存放fat內(nèi)容、第126、127(2個(gè))盤塊,存放位示圖、從第128盤塊至10000盤塊,皆為數(shù)據(jù)(區(qū))盤塊,其邏輯編號(hào)從0開始,至9872號(hào)數(shù)據(jù)盤塊,即第0數(shù)據(jù)盤塊為128號(hào)盤塊,第1數(shù)據(jù)盤塊為129號(hào)盤塊,、第0數(shù)據(jù)盤塊(即128號(hào)盤塊),存放根目錄(同樣只用一個(gè)盤塊作根目錄),由于第0、1目錄項(xiàng)為“.”(本目錄), “.”(父目錄),因此根目錄下同樣只能存放30個(gè)文件或目錄,并且從第2個(gè)目錄項(xiàng)開始。、文件或子目錄數(shù)據(jù),放在第1數(shù)據(jù)盤塊及以后的數(shù)據(jù)盤塊中,由用戶按需要使用。3、sdisk管理程序的功

4、能要求如下:、正常情況下,顯示等待命令輸入符號(hào)#、改變目錄命令:#cd 目錄名,改變當(dāng)前工作目錄,目錄不存在時(shí)給出出錯(cuò)信息#cd .,返回上一級(jí)目錄,如果是根目錄,給出提示信息、生成新目錄#md 目錄名,創(chuàng)建新目錄(需要更改fat內(nèi)容和位示圖內(nèi)容)、刪除目錄#rd 目錄名,刪除目錄,如果目錄不存在時(shí)給出出錯(cuò)信息(需要更改fat內(nèi)容和位示圖內(nèi)容)、顯示目錄#dir,顯示指定目錄下或當(dāng)前目錄下的信息,包括文件名、擴(kuò)展名、物理地址(文件或目錄第一個(gè)盤塊號(hào))、文件長(zhǎng)度、子目錄、創(chuàng)建新文件#createfile 文件名.擴(kuò)展名 文件長(zhǎng)度,根據(jù)文件名.擴(kuò)展名,創(chuàng)建一個(gè)目錄項(xiàng)(fcb),根據(jù)文件長(zhǎng)度和位示圖

5、中空閑盤塊情況,分配足夠多的連續(xù)盤塊,給新文件(需要更改fat內(nèi)容和位示圖內(nèi)容)。、刪除文件#delfile 文件名.擴(kuò)展名,在文件所在的目錄項(xiàng)中,將第一個(gè)字節(jié)變?yōu)?xe5,并同時(shí)修改fat內(nèi)容和位示圖內(nèi)容;如果文件不存在,給出出錯(cuò)信息、文件拷貝#copyfile 老文件,新文件,為新文件創(chuàng)建一個(gè)目錄項(xiàng),并將老文件內(nèi)容復(fù)制到新文件中,并同時(shí)修改fat內(nèi)容和位示圖內(nèi)容、顯示位示圖內(nèi)容#showbitmp,將位示圖內(nèi)容(已有信息部分),顯示在屏幕上(按十六進(jìn)制)、顯示fat內(nèi)容#showfat,將fat內(nèi)容(已有信息部分),顯示在屏幕上(按十六進(jìn)制)4、程序的總體流程為:、輸出提示符#,等待接受命

6、令,分析鍵入的命令;、對(duì)合法的命令,執(zhí)行相應(yīng)的處理程序,否則輸出錯(cuò)誤信息,繼續(xù)等待新命令(1、請(qǐng)參考“03.fat32文件系統(tǒng)簡(jiǎn)介.doc”中,有關(guān)文件系統(tǒng)的規(guī)定; 2、請(qǐng)參考winhex中,目錄所顯示的信息進(jìn)行編程)/關(guān)于fat 和map表的解釋/用bitset庫,做map的是否判斷,因?yàn)樽鳂I(yè)要求從數(shù)據(jù)塊從128位開始,所以bitset的前128位被置為-1,同樣fat表也是,其次,map表和fat表同樣是用數(shù)組方式做保存,這樣就略過了是對(duì)具體地址的操作,從數(shù)組的下標(biāo)很容易的定位,關(guān)于對(duì)fat表和map表的用法1. 當(dāng)要用到數(shù)據(jù)塊是,查詢map表(因?yàn)橹蛔霰容^查詢即可),查詢到的未用位置置1

7、,然后在fat表上進(jìn)行相應(yīng)記錄,在本程序做出的規(guī)定是,當(dāng)文件夾fat表做-1,若是文件則按照fat做對(duì)應(yīng)的順序記錄,最后一塊同樣是-1結(jié)束,2. 回收的時(shí)候,是按照fat表的首項(xiàng),做順序置0,然后map也在相應(yīng)位置置0#include#include#include#include#include /*/author:chenlog/enviroment:vc2008 win7/date:2011-6-5 version 1.0/*/using namespace std;const int blocknum_size=2;/盤塊號(hào)大小const int block_size=1024; /一

8、個(gè)盤塊大小數(shù)const int block_num=10001; /盤塊數(shù)量const int disk_size=1024*1000*10;/磁盤大小const int list_size=32;/目錄項(xiàng)大小const int map_size=10001;/map 長(zhǎng)度const int fatnum=125;/fat的盤塊數(shù) 第塊沒有用const int fatlist=512;/每個(gè)盤口fat的記錄數(shù)const int databeg=128;/數(shù)據(jù)項(xiàng)開始fat號(hào)struct fcbchar fname8;/文件名char exname3;/擴(kuò)展名short fnum;/首塊號(hào)int

9、length;/文件大小, 目錄則文件大小為;;struct fatidshort idfatnum*fatlist; /fat 大小512個(gè)記錄 一塊*fat;struct mapbitset maplist;*map;struct dirstruct fcb listlist_size+1;*filedir;int currentid=128; /當(dāng)前fat號(hào)int currentdir=128; /當(dāng)前目錄塊號(hào)初始化是+1 由于第個(gè)單元沒有使用char *file; /磁盤的首地址char *filepath=myfat; /window文件保存地址file *fp; /window 文

10、件地址string current=root;/當(dāng)前路徑char cmd30;/輸入指令char command16;/*對(duì)文件存儲(chǔ)器進(jìn)行格式化*創(chuàng)建根目錄*/void findbit(struct map *map)void init(struct fatid *fat)int i,j;for(i=1;idatabeg)fat-idi=0;elsefat-idi=-1;void format()bool i; fat=(struct fatid *)(file+block_size); /當(dāng)前fat地址 map=(struct map *)(file+(fatnum+1)*block_siz

11、e); /初始化位示圖init(fat);fat-id0=9872;filedir=(struct dir *)(file+(fatnum+1+2)*block_size); /當(dāng)前目錄指針地址fat-id128=-1;fat-id0=9872-1;strcpy(filedir-list0.fname,.);strcpy(filedir-list0.exname,dir);filedir-list0.fnum=currentdir;filedir-list0.length=0;strcpy(filedir-list1.fname,.);strcpy(filedir-list1.exname,d

12、ir);filedir-list1.fnum=currentdir;filedir-list1.length=0;fp=fopen(filepath,w+);fwrite(file,sizeof(char),disk_size,fp);fclose(fp);printf(初始化已經(jīng)完成,現(xiàn)在可以進(jìn)行操作了!nn);/*創(chuàng)建子目錄*/int mkdir(char *str)int i,j;int blockid;/將要?jiǎng)?chuàng)建的fat號(hào)int blockdir;/將要?jiǎng)?chuàng)建的目錄塊號(hào)int listnum;/目錄塊內(nèi)編號(hào)struct fatid *flagid; struct dir *dir; /當(dāng)

13、前目錄指針struct map *map;struct fatid *fat;if(strcmp(str,)=0)printf(目錄名稱不能為空n);return 0; dir=(struct dir *)(file+(currentdir)*block_size); map=(struct map *)(file+(fatnum+1)*block_size); fat=(struct fatid *)(file+block_size); for(i=databeg+1;imaplisti=0) break; if(iblock_num) printf(內(nèi)存不足n);return 0; map

14、-maplisti=1;/map 置即已用dir=(struct dir *)(file+(currentdir)*block_size);for(i=2;ilisti.fname,str)=0)printf(目錄下有同名文件夾n);return 0;for(i=2;ilisti.fname,)=0)/有空的目錄塊且無重名,第一版本的時(shí)候與上面的循環(huán)放在一起,存在一個(gè)情況是前面的建立的目錄刪除后,直接被同名的覆蓋了break;if(ilist_size)printf(內(nèi)存不足n);return 0;flagid=(struct fatid *)(file+block_size);/fat 首位

15、地址for(j=databeg+1;jidj=0)blockdir=j;break;strcpy(dir-listi.fname,str);dir-listi.fnum=blockdir;strcpy(dir-listi.exname,dir);dir-listi.length=0;dir=(struct dir *)(file+blockdir*block_size); /為新目錄項(xiàng)創(chuàng)建根目錄strcpy(dir-list0.fname,.);strcpy(dir-list0.exname,dir);dir-list0.fnum=blockdir;dir-list0.length=0;str

16、cpy(dir-list1.fname,.);strcpy(dir-list1.exname,dir);dir-list1.fnum=currentdir;dir-list1.length=0;flagid-idj=-1; /修改fat 目錄尾部fat-id0=fat-id0-1;printf(已經(jīng)成功創(chuàng)建目錄%s n,str);return 0;/*顯示目錄*/int listshow()int i,sumfile,sumdir,fl100,dr100;/fl 為文件的號(hào)數(shù),dr為目錄的號(hào)數(shù)sumfile=sumdir=0;struct dir *dir;struct fatid *fat;

17、dir=(struct dir *)(file+currentdir*block_size);for(i=0;ilisti.length=0&(strcmp(dir-listi.fname,)!=0)&(dir-listi.fnum!=0)/為目錄的drsumdir=i;sumdir+;if(dir-listi.length!=0&strcmp(dir-listi.fname,)!=0)/為目錄的flsumfile=i;sumfile+;for(i=0;ilistdri.fname);for(i=0;ilistfli.fname,dir-listfli.exname);printf(n);pr

18、intf(n在該目錄下共有%d 個(gè)文件, %d 個(gè)文件夾nn,sumfile,sumdir-2);return 0;/*刪除子目錄*/int rmdir(char *str)int i;int blockid;int flag=0;/fat號(hào)int blocknum;/目錄塊struct fatid *fat;struct dir *dir;struct dir *flagdir;/標(biāo)記目錄塊char c=a; /做用戶交互int m=2;/從第三個(gè)子目錄項(xiàng)開始搜索要?jiǎng)h除的目錄項(xiàng)情況fat=(struct fatid *)(file+block_size);dir=(struct dir *)

19、(file+currentdir*block_size);/當(dāng)前目錄指針map=(struct map *)(file+(fatnum+1)*block_size);for(i=2;ilisti.fname,str)=0)/找到要?jiǎng)h除的子目錄break;if(ilist_size)printf(該文件夾下不存在%s,str);return 0;while(1)printf(是否確認(rèn)?(y/n));cinc;if(c=y|c=y)|(c=n|c=n)break;if(c=n|c=n)return 0;blocknum=dir-listi.fnum;flagdir=(struct dir *)(f

20、ile+blocknum*block_size);while(m!=list_size)if(strcmp(flagdir-listm.fname,)!=0)printf(該目錄下有子文件或者子目錄,不能刪除該目錄);m+;strcpy(dir-listi.fname,);/父目錄dirstrcpy(dir-listi.exname,);dir-listi.fnum=0;strcpy(flagdir-list0.fname,);/要?jiǎng)h除目錄的dirstrcpy(flagdir-list0.exname,);flagdir-list0.fnum=0;strcpy(flagdir-list1.fn

21、ame,);strcpy(flagdir-list1.exname,);flagdir-list0.fnum=0;map-maplistblocknum=0;fat-idblocknum=0;fat-id0=fat-id0+1;return 0;/*更改當(dāng)前目錄*/int changedir(char *str)int i,j;int blocknum;/當(dāng)前目錄位置int flagnum;/temp的目錄位置struct dir * flagdir,*dir;struct fatid * fat;string strflag; /為了改當(dāng)前顯示的代碼dir=(struct dir *)(fi

22、le+currentdir*block_size);if(strcmp(.,str)=0)/判斷是不是上層目錄blocknum=currentdir;if(dir-list0.fnum=dir-list1.fnum)/根目錄的特征return 1;currentdir=dir-list1.fnum;/改變當(dāng)前目錄指針flagdir=(struct dir *)(file+currentdir*block_size);/去上層的目錄地址for(int j=0;jlistj.fnum=blocknum)strflag=flagdir-listj.fname;break;current=curren

23、t.substr(0,(current.length()-strflag.length()-1);return 1;for(i=2;ilisti.fname,str)=0&strcmp(dir-listi.exname,dir)=0)currentdir=dir-listi.fnum;break;if(ilist_size)printf(找不到指定的目錄%sn,str);return 0;current=current+str+;return 1;/*創(chuàng)建文件*/int create(char *str,int length)/getfilenameint i,j,l,t,k;int bloc

24、kdir;int fid;/fat的首塊號(hào)int flag;/文件的首塊判斷char name8=0;/文件名稱 char exname3=0;/文件擴(kuò)展名int templength; /temp文件長(zhǎng)度struct fatid * fat;struct dir *dir;struct map *map; dir=(struct dir *)(file+(currentdir)*block_size); map=(struct map *)(file+(fatnum+1)*block_size); fat=(struct fatid *)(file+block_size); templeng

25、th=length;l=strlen(str);/取文件名for(i=0;i=8)printf(文件名稱過長(zhǎng)n);return 0;/去擴(kuò)展名j=0;i+;i+;/除去點(diǎn)k=l-i;for(j=0;jfat-id0)printf(文件超出磁盤容納空間n);return 0; for(i=2;ilisti.fname,name)=0&strcmp(dir-listi.exname,exname)=0) printf(改文件夾下,已經(jīng)有同名文件);return 0; if(strcmp(dir-listi.fname,)=0)break; if(ilist_size)printf(內(nèi)存不足n);r

26、eturn 0;strcpy(dir-listi.fname,name);strcpy(dir-listi.exname,exname);dir-listi.length=length;flag=1;j=databeg+1;while(1)/不斷循環(huán)if(map-maplistj!=1)if(!templength-)/當(dāng)length全部被分配完截止break;/上一塊的地址if(flag)/第一次分配是的首地址dir-listi.fnum=j;/給文件的首塊map-maplistj=1;/map減少if(!flag)fat-idt=j;/fat-id0=fat-id0-1;t=j;flag=

27、0;j+;fat-idt=-1;/fat-id0=fat-id0-1; printf(已經(jīng)成功創(chuàng)建文件%s n,name);return 1;/*復(fù)制文件*/int cp(char *str,char *newname)int i,j,k,l,length;char name8=0;/文件名稱 char exname3=0;/文件擴(kuò)展名struct dir *dir;l=strlen(str);/取文件名for(i=0;il;i+)namei=stri;if(stri+1=.) break;/去擴(kuò)展名j=0;i+;i+;/除去點(diǎn)k=l-i;for(j=0;jk;j+)if(stri=0)bre

28、ak;exnamej=stri;i+;if(strcmp(newname,)=0)printf(文件名不能為空n);return 0;dir=(struct dir *)(file+currentdir*block_size);for(i=2;ilisti.fname,name)=0&strcmp(dir-listi.exname,exname)=0)break;if(ilist_size)printf(找不到指定的文件%sn,str);return 0;length=dir-listi.length ;create(newname,length);/*刪除文件*/int delfile(ch

29、ar *str)int i,j,l,k;int blocknum; /要?jiǎng)h除的首塊地址int temp;char name8=0;/文件名稱 char exname3=0;/文件擴(kuò)展名char c=a;struct dir *dir;struct fatid *fat;struct map *map;l=strlen(str);/取文件名for(i=0;il;i+)namei=stri;if(stri+1=.) break;/去擴(kuò)展名j=0;i+;i+;/除去點(diǎn)k=l-i;for(j=0;jk;j+)if(stri=0)break;exnamej=stri;i+;if(strcmp(str,)

30、=0)printf(文件名不能為空n);return 0; dir=(struct dir *)(file+(currentdir)*block_size); map=(struct map *)(file+(fatnum+1)*block_size); fat=(struct fatid *)(file+block_size); for(i=2;ilisti.fname,name)=0)&(strcmp(dir-listi.exname,exname)=0)break;if(ilist_size)printf(找不到%s 文件n,str);return 0;while(1)printf(是否

31、確認(rèn)?(y/n));cinc;if(c=y|c=y)|(c=n|c=n)break;if(c=n|c=n)return 0;blocknum=dir-listi.fnum;dir-listi.fnum=0;/把目錄項(xiàng)還原strcpy(dir-listi.exname,);strcpy(dir-listi.fname,);dir-listi.length=0;/處理fat and map 表while(fat-idblocknum!=-1)temp=fat-idblocknum;fat-idblocknum=0;fat-id0=fat-id0+1;map-maplistblocknum=0;bl

32、ocknum=temp;printf(已經(jīng)成功刪除%sn,str);return 0;int showbitmp()int i,j;int listblock_size=0;struct map *map; map=(struct map *)(file+(fatnum+1)*block_size);j=0;for(i=databeg+1;imaplisti=1)listj=i;j+;for(i=0;iblock_size;i+)if(listi!=0)printf( %0x,listi);if(i%10=0)printf(n);return 0;int findbit()return 0;i

33、nt showfat()int i,j,flag;struct fatid *fat;int listblock_size=0;fat=(struct fatid *)(file+block_size);j=0;for(i=databeg+1;iidi!=0)listj=i;j+;j=0;flag=0;for(i=0;iblock_size;i+)if(listi!=0)printf( %0x,listi);if(flag)if(j%10=0)printf(n);flag=1;j+;return 0;/*退出系統(tǒng)*/int exit()fp=fopen(filepath,w+);fwrite(

34、file,sizeof(char),disk_size,fp);fclose(fp);free(file);return 1;void welcome()/歡迎列表printf(-n);printf(n以下是使用說明n);printf(format : 對(duì)磁盤格式化.n);printf(exit : 安全退出該文件系統(tǒng),保存信息.n);printf(mkdir dirname ; 創(chuàng)建子目錄.n);printf(rmdir dirname : 刪除子目錄.n);printf(ls dirname : 顯示當(dāng)前目錄下信息.n);printf(cd dirname : 更改當(dāng)前目錄.n);printf(create fil

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論