版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設計之三設計任務:模擬os文件系統(tǒng)在任一os(window或者dos;也可以是在linux下,但要求能將結(jié)果演示給老師看)下,建立一個大文件,把它假象成一張盤,在其中實現(xiàn)一個簡單的模擬os文件系統(tǒng)。1、在現(xiàn)有機器硬盤上開辟10m(共10000個盤塊,每盤塊大小為1k)的硬盤空間(生成一個10m的用戶文件sdisk.dat即可),作為設定的硬盤空間。2、編寫一管理程序sdisk,對此空間進行管理,以模擬os文件系統(tǒng),要求:、盤塊大小1k 、空閑盤塊的管理:采用位示圖法、文件空間管理:采用fat(文件分配表),每個盤塊號占2個字節(jié)、目錄項管理:、每個目錄項占用32字節(jié),其中前8個字節(jié)(
2、0-7)為文件名,之后跟3個字節(jié)(8-10)的擴展名,26-27字節(jié),存放文件的第一個盤塊號,最后四個字節(jié)(28-31),存放文件長度(如果目錄項對應的是下一級子目錄(文件),其文件長度部分為0)、目錄按文件方式管理,每個目錄僅用一個盤塊(即1k,最多裝32個目錄項)、第0個目錄項為本目錄,即“.”,第0個字節(jié)為“.”,即0x2e,第26-27字節(jié)指明本目錄所在盤塊。、第1個目錄項為父目錄,即“.”,第0,1個字節(jié)為“.”即0x2e,0x2e,第26-27字節(jié)指明父目錄所在盤塊。、每個目錄實際能放下文件或子目錄30項。、文件系統(tǒng)空間分配:、第0個盤塊(1k)存放磁盤信息(可以設定為格式說明“f
3、at32”、盤塊大小,盤塊數(shù)等內(nèi)容)、第1個盤塊起,至125盤塊,共125個盤塊(125k)存放fat內(nèi)容、第126、127(2個)盤塊,存放位示圖、從第128盤塊至10000盤塊,皆為數(shù)據(jù)(區(qū))盤塊,其邏輯編號從0開始,至9872號數(shù)據(jù)盤塊,即第0數(shù)據(jù)盤塊為128號盤塊,第1數(shù)據(jù)盤塊為129號盤塊,、第0數(shù)據(jù)盤塊(即128號盤塊),存放根目錄(同樣只用一個盤塊作根目錄),由于第0、1目錄項為“.”(本目錄), “.”(父目錄),因此根目錄下同樣只能存放30個文件或目錄,并且從第2個目錄項開始。、文件或子目錄數(shù)據(jù),放在第1數(shù)據(jù)盤塊及以后的數(shù)據(jù)盤塊中,由用戶按需要使用。3、sdisk管理程序的功
4、能要求如下:、正常情況下,顯示等待命令輸入符號#、改變目錄命令:#cd 目錄名,改變當前工作目錄,目錄不存在時給出出錯信息#cd .,返回上一級目錄,如果是根目錄,給出提示信息、生成新目錄#md 目錄名,創(chuàng)建新目錄(需要更改fat內(nèi)容和位示圖內(nèi)容)、刪除目錄#rd 目錄名,刪除目錄,如果目錄不存在時給出出錯信息(需要更改fat內(nèi)容和位示圖內(nèi)容)、顯示目錄#dir,顯示指定目錄下或當前目錄下的信息,包括文件名、擴展名、物理地址(文件或目錄第一個盤塊號)、文件長度、子目錄、創(chuàng)建新文件#createfile 文件名.擴展名 文件長度,根據(jù)文件名.擴展名,創(chuàng)建一個目錄項(fcb),根據(jù)文件長度和位示圖
5、中空閑盤塊情況,分配足夠多的連續(xù)盤塊,給新文件(需要更改fat內(nèi)容和位示圖內(nèi)容)。、刪除文件#delfile 文件名.擴展名,在文件所在的目錄項中,將第一個字節(jié)變?yōu)?xe5,并同時修改fat內(nèi)容和位示圖內(nèi)容;如果文件不存在,給出出錯信息、文件拷貝#copyfile 老文件,新文件,為新文件創(chuàng)建一個目錄項,并將老文件內(nèi)容復制到新文件中,并同時修改fat內(nèi)容和位示圖內(nèi)容、顯示位示圖內(nèi)容#showbitmp,將位示圖內(nèi)容(已有信息部分),顯示在屏幕上(按十六進制)、顯示fat內(nèi)容#showfat,將fat內(nèi)容(已有信息部分),顯示在屏幕上(按十六進制)4、程序的總體流程為:、輸出提示符#,等待接受命
6、令,分析鍵入的命令;、對合法的命令,執(zhí)行相應的處理程序,否則輸出錯誤信息,繼續(xù)等待新命令(1、請參考“03.fat32文件系統(tǒng)簡介.doc”中,有關(guān)文件系統(tǒng)的規(guī)定; 2、請參考winhex中,目錄所顯示的信息進行編程)/關(guān)于fat 和map表的解釋/用bitset庫,做map的是否判斷,因為作業(yè)要求從數(shù)據(jù)塊從128位開始,所以bitset的前128位被置為-1,同樣fat表也是,其次,map表和fat表同樣是用數(shù)組方式做保存,這樣就略過了是對具體地址的操作,從數(shù)組的下標很容易的定位,關(guān)于對fat表和map表的用法1. 當要用到數(shù)據(jù)塊是,查詢map表(因為只做比較查詢即可),查詢到的未用位置置1
7、,然后在fat表上進行相應記錄,在本程序做出的規(guī)定是,當文件夾fat表做-1,若是文件則按照fat做對應的順序記錄,最后一塊同樣是-1結(jié)束,2. 回收的時候,是按照fat表的首項,做順序置0,然后map也在相應位置置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;/盤塊號大小const int block_size=1024; /一
8、個盤塊大小數(shù)const int block_num=10001; /盤塊數(shù)量const int disk_size=1024*1000*10;/磁盤大小const int list_size=32;/目錄項大小const int map_size=10001;/map 長度const int fatnum=125;/fat的盤塊數(shù) 第塊沒有用const int fatlist=512;/每個盤口fat的記錄數(shù)const int databeg=128;/數(shù)據(jù)項開始fat號struct fcbchar fname8;/文件名char exname3;/擴展名short fnum;/首塊號int
9、length;/文件大小, 目錄則文件大小為;;struct fatidshort idfatnum*fatlist; /fat 大小512個記錄 一塊*fat;struct mapbitset maplist;*map;struct dirstruct fcb listlist_size+1;*filedir;int currentid=128; /當前fat號int currentdir=128; /當前目錄塊號初始化是+1 由于第個單元沒有使用char *file; /磁盤的首地址char *filepath=myfat; /window文件保存地址file *fp; /window 文
10、件地址string current=root;/當前路徑char cmd30;/輸入指令char command16;/*對文件存儲器進行格式化*創(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); /當前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); /當前目錄指針地址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)在可以進行操作了!nn);/*創(chuàng)建子目錄*/int mkdir(char *str)int i,j;int blockid;/將要創(chuàng)建的fat號int blockdir;/將要創(chuàng)建的目錄塊號int listnum;/目錄塊內(nèi)編號struct fatid *flagid; struct dir *dir; /當
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)/有空的目錄塊且無重名,第一版本的時候與上面的循環(huán)放在一起,存在一個情況是前面的建立的目錄刪除后,直接被同名的覆蓋了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); /為新目錄項創(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 為文件的號數(shù),dr為目錄的號數(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 個文件, %d 個文件夾nn,sumfile,sumdir-2);return 0;/*刪除子目錄*/int rmdir(char *str)int i;int blockid;int flag=0;/fat號int blocknum;/目錄塊struct fatid *fat;struct dir *dir;struct dir *flagdir;/標記目錄塊char c=a; /做用戶交互int m=2;/從第三個子目錄項開始搜索要刪除的目錄項情況fat=(struct fatid *)(file+block_size);dir=(struct dir *)
19、(file+currentdir*block_size);/當前目錄指針map=(struct map *)(file+(fatnum+1)*block_size);for(i=2;ilisti.fname,str)=0)/找到要刪除的子目錄break;if(ilist_size)printf(該文件夾下不存在%s,str);return 0;while(1)printf(是否確認?(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,);/要刪除目錄的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;/*更改當前目錄*/int changedir(char *str)int i,j;int blocknum;/當前目錄位置int flagnum;/temp的目錄位置struct dir * flagdir,*dir;struct fatid * fat;string strflag; /為了改當前顯示的代碼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;/改變當前目錄指針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的首塊號int flag;/文件的首塊判斷char name8=0;/文件名稱 char exname3=0;/文件擴展名int templength; /temp文件長度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(文件名稱過長n);return 0;/去擴展名j=0;i+;i+;/除去點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-)/當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;/*復制文件*/int cp(char *str,char *newname)int i,j,k,l,length;char name8=0;/文件名稱 char exname3=0;/文件擴展名struct dir *dir;l=strlen(str);/取文件名for(i=0;il;i+)namei=stri;if(stri+1=.) break;/去擴展名j=0;i+;i+;/除去點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; /要刪除的首塊地址int temp;char name8=0;/文件名稱 char exname3=0;/文件擴展名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;/去擴展名j=0;i+;i+;/除去點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、確認?(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;/把目錄項還原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 : 對磁盤格式化.n);printf(exit : 安全退出該文件系統(tǒng),保存信息.n);printf(mkdir dirname ; 創(chuàng)建子目錄.n);printf(rmdir dirname : 刪除子目錄.n);printf(ls dirname : 顯示當前目錄下信息.n);printf(cd dirname : 更改當前目錄.n);printf(create fil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程合包合同范例
- 上海建房合同范例范例
- 維修表店合作合同范例
- 商用租房合同范例下
- 小電車租車合同范例
- 山東現(xiàn)代學院《影視非線性編輯》2023-2024學年第一學期期末試卷
- 生物質(zhì)長期合同范例
- 山東外事職業(yè)大學《移動社交廣告》2023-2024學年第一學期期末試卷
- 外包餐飲保潔合同范例
- 山東信息職業(yè)技術(shù)學院《數(shù)據(jù)庫系統(tǒng)原理實踐》2023-2024學年第一學期期末試卷
- 人間生活-中國部分+課件高中美術(shù)湘美版(2019)美術(shù)鑒賞1
- YY/T 1771-2021彎曲-自由恢復法測試鎳鈦形狀記憶合金相變溫度
- LY/T 1755-2008國家濕地公園建設規(guī)范
- JJF 1874-2020(自動)核酸提取儀校準規(guī)范
- GB/T 7378-2012表面活性劑堿度的測定滴定法
- GB/T 37762-2019同步調(diào)相機組保護裝置通用技術(shù)條件
- GB/T 36961-2018超高強鋼熱沖壓工藝通用技術(shù)
- 國開Photoshop圖像處理模式試題1及答案
- 日益重要的國際組織課件- 高中政治統(tǒng)編版選擇性必修一當代國際政治與經(jīng)濟
- 政工工作制度15篇
- 環(huán)境保護法與兩高司法解釋課件
評論
0/150
提交評論