版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)文件管理系統(tǒng)模擬實(shí)驗(yàn) 文件管理系統(tǒng)模擬1.實(shí)驗(yàn)?zāi)康耐ㄟ^一個(gè)簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)2.實(shí)驗(yàn)內(nèi)容為Linux系統(tǒng)設(shè)計(jì)一個(gè)簡單的二級文件系統(tǒng)。要求做到以下幾點(diǎn):(1)可以實(shí)現(xiàn)下列幾條命令(至少4條)login用戶登錄dir列文件目錄create創(chuàng)建文件delete刪除文件open打開文件close關(guān)閉文件read讀文件write寫文件(2)列目錄時(shí)要列出文件名、物理地址、保護(hù)碼和文件長度;(3)源文件可以進(jìn)行讀寫保護(hù)。3.實(shí)驗(yàn)提示(1)首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。
2、(2)用戶創(chuàng)建的文件,可以編號存儲于磁盤上。入file0,file1,file2并以編號作為物理地址,在目錄中進(jìn)行登記。4.源代碼15#include<> #include<> #include<> #define MEM_D_SIZE 1024*1024 tem=-1; /*引導(dǎo)塊*/ fat0.em_disk='1' for(i=1;i<ROOT_DISK_NO-1;i+) /*存放 FAT表的磁盤塊號*/ fati.item=i+1; fati.em_disk='1' fatROOT_DISK_NO.item=-1
3、; /*存放根目錄的磁盤塊號*/ fatROOT_DISK_NO.em_disk='1' for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+) fati.item = -1; fati.em_disk = '0' /*-*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目錄的地址*/ /*初始化目錄*/ /*-指向當(dāng)前目錄的目錄項(xiàng)-*/ root->directitem0.sign = 1; root->directitem0.firstdisk = ROOT_DI
4、SK_NO; strcpy(root->,"."); root->directitem0.next = root->directitem0.firstdisk; root->perty = '1' root->directitem0.size = ROOT_DISK_SIZE; /*-指向上一級目錄的目錄項(xiàng)-*/ root->directitem1.sign = 1; root->directitem1.firstdisk = ROOT_DISK_NO;
5、strcpy(root->,"."); root->directitem1.next = root->directitem0.firstdisk; root->perty = '1' root->directitem1.size = ROOT_DISK_SIZE; if(fp = fopen("","wb")=NULL) printf("Error:n Cannot open file n"); return
6、; for(i=2;i<MSD+2;i+) /*-子目錄初始化為空-*/ root->directitemi.sign = 0; root->directitemi.firstdisk = -1; strcpy(root->,""); root->directitemi.next = -1; root->perty = '0' root->directitemi.size = 0; if(fp = fopen("","wb&q
7、uot;)=NULL) printf("Error:n Cannot open file n"); return; if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虛擬磁盤空間保存到磁盤文件中*/ printf("Error:n File write error! n"); fclose(fp); void enter() FILE *fp; int i; fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /*申請 1M空間*/ if(fp=fopen(""
8、,"rb")=NULL) printf("Error:nCannot open filen"); return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /*把磁盤文件 讀入虛擬磁盤空間(內(nèi)存)*/ printf("Error:nCannot read filen"); exit(0); fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目錄地
9、址*/ fclose(fp); /*-初始化用戶打開表-*/ for(i=0;i<MOFN;i+) ,""); i.firstdisk = -1; i.size = 0; = 0; cur_dir = root; /*當(dāng)前目錄為根目錄*/ bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char); strcpy(bufferdir,"Root:"); void halt() FILE *fp; int i; if(fp=fopen("","wb&qu
10、ot;)=NULL) printf("Error:nCannot open filen"); return; if(!fwrite(fdisk,MEM_D_SIZE,1,fp) /*把虛擬磁盤空間(內(nèi)存)內(nèi)容讀入磁盤文件 */ printf("Error:nFile write error!n"); fclose(fp); free(fdisk); free(bufferdir); return;int create(char *name) int i,j; if(strlen(name)>8) /*文件名大于 8位*/ return(-1); f
11、or(j=2;j<MSD+2;j+) /*檢查創(chuàng)建文件是否與已存在的文件重名*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*文件已經(jīng)存在*/ return(-4); for(i=2;i<MSD+2;i+) /*找到第一個(gè)空閑子目錄*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*無空目錄項(xiàng)*/ return(-2); if>=MOFN) /*打開文件太多*/ return(-3); for(j
12、=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*找到空閑盤塊 j 后退出*/ if(fatj.em_disk='0') break; if(j>=DISK_NUM) return(-5); fatj.em_disk = '1' /*將空閑塊置為已經(jīng)分配*/ /*-填寫目錄項(xiàng)-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk = j; cur_dir->directitemi.size = 0; cur_dir->
13、directitemi.next = j; cur_dir->perty = '0' /*-*/ fd = open(name); return 0; int open(char *name) int i, j; for(i=2;i<MSD+2;i+) /*文件是否存在*/ if(!strcmp(cur_dir->,name) break; if(i>=MSD+2) return(-1); /*-是文件還是目錄-*/ if(cur_dir->perty=
14、39;1')return(-4); /*-文件是否打開-*/ for(j=0;j<MOFN;j+) if(!,name) break; if(j<MOFN) /*文件已經(jīng)打開*/ return(-2); if>=MOFN) /*文件打開太多*/ return(-3); /*-查找一個(gè)空閑用戶打開表項(xiàng)-*/ for(j=0;j<MOFN;j+) ifj.firstdisk=-1) break; /*-填寫表項(xiàng)的相關(guān)信息-*/ j.firstdisk = cur_dir->directitemi.firstdisk; strcpyj.n
15、ame,name); j.size = cur_dir->directitemi.size; +; /*-返回用戶打開表表項(xiàng)的序號-*/ return(j); int close(char *name) int i; for(i=0;i<MOFN;i+) if(!,name) break; if(i>=MOFN) return(-1); /*-清空該文件的用戶打開表項(xiàng)的內(nèi)容-*/ ,""); i.firstdisk = -1; i.size = 0; ; return 0; int write(int fd,
16、 char *buf, int len) char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*-用 $ 字符作為空格 # 字符作為換行符-*/ char Space = 32; char Endter= 'n' for(i=0;i<len;i+) if(bufi = '$') bufi = Space; else if(bufi = '#') bufi = Endter; /*-讀取用戶打開表對應(yīng)表項(xiàng)第一個(gè)盤塊號-*/ item = fd.firstdisk;
17、/*-找到當(dāng)前目錄所對應(yīng)表項(xiàng)的序號-*/ for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk=item) break; temp = i; /*-存放當(dāng)前目錄項(xiàng)的下標(biāo)-*/ /*-找到的item 是該文件的最后一塊磁盤塊-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找該文件的下一盤塊-*/ /*-計(jì)算出該文件的最末地址-*/ first = fdisk+item*DISKSIZE+fd.size%DISKSIZE; /*-如果最后磁盤塊剩余的大小大于要寫入的文件的大小-
18、*/ iffd.size%DISKSIZE>len) strcpy(first,buf); fd.size = fd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; else for(i=0;i<fd.size%DISKSIZE);i+) /*寫一部分內(nèi)容到最后一塊磁盤塊的剩余空間(字節(jié))*/ firsti = buf i; /*-計(jì)算分配完最后一塊磁盤的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲-*/ ilen1 = len-fd.size%DISKSIZE); ilen
19、2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = ilen2+1; /*-還需要多少塊磁盤塊-*/ for(j=0;j<ilen2;j+) for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+)/*尋找空閑磁盤塊*/ if(fati.em_disk='0') break; if(i>=DISK_NUM) /*-如果磁盤塊已經(jīng)分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*-找到的那塊空閑磁盤塊的起始地址-*/
20、if(j=ilen2-1) /*-如果是最后要分配的一塊-*/ for(k=0;k<len-fd.size%DISKSIZE)-j*DISKSIZE;k+) firstk = bufk; else/*-如果不是要最后分配的一塊-*/ for(k=0;k<DISKSIZE;k+) firstk =bufk; fatitem.item = i; /*-找到一塊后將它的序號存放在上一塊的指針中-*/ fati.em_disk = '1' /*-置找到的磁盤快的空閑標(biāo)志位為已分配-*/ fati.item = -1; /*-它的指針為 -1 (即沒有下一塊)-*/ /*-修
21、改長度-*/ fd.size = fd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; return 0; int read(int fd, char *buf) int len = fd.size; char *first; int i, j, item; int ilen1, modlen; item = fd.firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+
22、1; /*-計(jì)算文件所占磁盤的塊數(shù)-*/ first = fdisk+item*DISKSIZE; /*-計(jì)算文件的起始位置-*/ for(i=0;i<ilen1;i+) if(i=ilen1-1) /*-如果在最后一個(gè)磁盤塊-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; else /*-不在最后一塊磁盤塊-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盤塊-*/ first = f
23、disk+item*DISKSIZE; return 0; int del(char *name) int i,cur_item,item,temp; for(i=2;i<MSD+2;i+) /*-查找要刪除文件是否在當(dāng)前目錄中-*/ if(!strcmp(cur_dir->,name) break; cur_item = i; /*-用來保存目錄項(xiàng)的序號,供釋放目錄中-*/ if(i>=MSD+2) /*-如果不在當(dāng)前目錄中-*/ return(-1); if(cur_dir->directitemcur_perty!=
24、'0') /*-如果刪除的(不)是目錄-*/ return(-3); for(i=0;i<MOFN;i+) /*-如果文件打開,則不能刪除,退出-*/ if(!,name) return(-2); item = cur_dir->directitemcur_item.firstdisk;/*-該文件的起始盤塊號-*/ while(item!=-1) /*-釋放空間,將FAT表對應(yīng)項(xiàng)進(jìn)行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = '0' item
25、 = temp; /*-釋放目錄項(xiàng)-*/ cur_dir->directitemcur_item.sign = 0; cur_dir->directitemcur_item.firstdisk = -1; strcpycur_,""); cur_dir->directitemcur_item.next = -1; cur_dir->directitemcur_perty = '0' cur_dir->directitemcur_item.size = 0; return 0; int mkdir
26、(char *name) int i,j; struct direct *cur_mkdir; if(!strcmp(name,".") return(-4); if(!strcmp(name,".") return(-4); if(strlen(name)>8) /*-如果目錄名長度大于 8位-*/ return(-1); for(i=2;i<MSD+2;i+) /*-如果有空閑目錄項(xiàng)退出-*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*-目錄/文件
27、已滿-*/ return(-2); for(j=2;j<MSD+2;j+) /*-判斷是否有重名-*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*-如果有重名-*/ return(-3); for(j=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*-找到空閑磁盤塊 j 后退出-*/ if(fatj.em_disk='0') break; if(j>=DISK_NUM) return(-5); fatj.em_disk='1' /*
28、-將該空閑塊設(shè)置為已分配-*/ /*-填寫目錄項(xiàng)-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk=j; cur_dir->directitemi.size=ROOT_DISK_SIZE; cur_dir->directitemi.next=j; cur_dir->perty='1' /*-所創(chuàng)目錄在虛擬磁盤上的地址(內(nèi)存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir-
29、>directitemi.firstdisk*DISKSIZE); /*-初始化目錄-*/ /*-指向當(dāng)前目錄的目錄項(xiàng)-*/ cur_mkdir->directitem0.sign=0; cur_mkdir->directitem0.firstdisk=cur_dir->directitemi.firstdisk; strcpy(cur_mkdir->,"."); cur_mkdir->directitem0.next=cur_mkdir->directitem0.firstdisk; cur_mkd
30、ir->perty='1' cur_mkdir->directitem0.size=ROOT_DISK_SIZE; /*-指向上一級目錄的目錄項(xiàng)-*/ cur_mkdir->directitem1.sign=cur_dir->directitem0.sign;cur_mkdir->directitem1.firstdisk=cur_dir->directitem0.firstdisk; strcpy(cur_mkdir->,"."); cur_mkdir-
31、>directitem1.next=cur_mkdir->directitem1.firstdisk; cur_mkdir->perty='1' cur_mkdir->directitem1.size=ROOT_DISK_SIZE; for(i=2;i<MSD+2;i+) /*-子目錄都初始化為空-*/ cur_mkdir->directitemi.sign=0; cur_mkdir->directitemi.firstdisk=-1; strcpy(cur_mkdir->directitemi.na
32、me,""); cur_mkdir->directitemi.next=-1; cur_mkdir->perty='0' cur_mkdir->directitemi.size=0; return 0; int rmdir(char *name) int i,j,item; struct direct *temp_dir; /*-檢查當(dāng)前目錄項(xiàng)中有無該目錄-*/ for(i=2;i<MSD+2;i+) if(!strcmp(cur_dir->,name) break;
33、 if(i>=MSD+2) /*-沒有這個(gè)文件或目錄-*/ return(-1);if(cur_dir->perty!='1')/*-刪除的不是目錄-*/ return(-3); /*-判斷要刪除的目錄有無子目錄-*/ temp_dir=(struct direct *)(fdisk+cur_dir->directitemi.next*DISKSIZE); for(j=2;j<MSD+2;j+) if(temp_dir->directitemj.next!=-1) break; if(j<MSD+2) /*-有子
34、目錄或文件-*/ return(-2); /*-找到起始盤塊號,并將其釋放-*/ item=cur_dir->directitemi.firstdisk; fatitem.em_disk='0' /*-修改目錄項(xiàng)-*/ cur_dir->directitemi.sign=0; cur_dir->directitemi.firstdisk=-1; strcpy(cur_dir->,""); cur_dir->directitemi.next=-1; cur_dir->perty='0' cur_dir->directitemi.size=0; return 0; void dir() int i; for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk!=-1) /*-如果存在子目錄-*/ printf("%st",cur_dir->); if(cur_dir->perty='0') /*-文件-*/ printf("%dttn"
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版煤炭物流運(yùn)輸新能源車輛采購合同4篇
- 二零二五年度養(yǎng)殖場承包運(yùn)營管理協(xié)議3篇
- 龍湖地產(chǎn)龍湖一期土石方工程二零二五年度質(zhì)量保證合同4篇
- 2025年度個(gè)人對公司養(yǎng)老產(chǎn)業(yè)借款合同(養(yǎng)老產(chǎn)業(yè)發(fā)展支持版)2篇
- 2024藥店藥品追溯系統(tǒng)建設(shè)及運(yùn)營服務(wù)合同范本3篇
- 2025年度內(nèi)墻涂料施工與綠色建筑認(rèn)證合同
- 2025年退休人員創(chuàng)業(yè)扶持勞動合同規(guī)范
- 二零二五年度內(nèi)蒙古自治區(qū)肉牛良種引進(jìn)與推廣合同
- 中小微企業(yè)2024合作創(chuàng)新發(fā)展合同稿版B版
- 2025年二零二五年度跨境電商進(jìn)口商品買賣合同標(biāo)的約定2篇
- 物業(yè)民法典知識培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識點(diǎn)詳解
- 2024-2025學(xué)年八年級數(shù)學(xué)人教版上冊寒假作業(yè)(綜合復(fù)習(xí)能力提升篇)(含答案)
- 《萬方數(shù)據(jù)資源介紹》課件
- 醫(yī)生定期考核簡易程序述職報(bào)告范文(10篇)
- 第一章-地震工程學(xué)概論
- 《中國糖尿病防治指南(2024版)》更新要點(diǎn)解讀
- 交通運(yùn)輸類專業(yè)生涯發(fā)展展示
- 2024年山東省公務(wù)員錄用考試《行測》試題及答案解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理專家共識(2024)解讀
- 2025年九省聯(lián)考新高考 政治試卷(含答案解析)
評論
0/150
提交評論