




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 文件管理系統模擬1.實驗目的通過一個簡單多用戶文件系統的設計,加深理解文件系統的內部功能及內部實現2.實驗內容為linux系統設計一個簡單的二級文件系統。要求做到以下幾點:(1)可以實現下列幾條命令(至少4條)login用戶登錄dir列文件目錄create創建文件delete刪除文件open打開文件close關閉文件read讀文件write寫文件(2)列目錄時要列出文件名、物理地址、保護碼和文件長度;(3)源文件可以進行讀寫保護。3.實驗提示(1)首先應確定文件系統的數據結構:主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。(2)用戶創建的文件,可以編
2、號存儲于磁盤上。入file0,file1,file2并以編號作為物理地址,在目錄中進行登記。4.源代碼#include #include #include #define mem_d_size 1024*1024 /總磁盤空間為1m#define disksize 1024/磁盤塊的大小1k#define disk_num 1024/磁盤塊數目1k#define fatsize disk_num*sizeof(struct fatitem)/fat表大小#define root_disk_no fatsize/disksize+1/根目錄起始盤塊號#define root_disk_size
3、sizeof(struct direct)/根目錄大小#define dir_maxsize 1024/路徑最大長度為1kb#define msd 5/最大子目錄數5#define mofn 5/最大文件深度為5#define max_write 1024*128/最大寫入文字長度128kb struct fatitem /* size 8*/ int item; /*存放文件下一個磁盤的指針*/ char em_disk; /*磁盤塊是否空閑標志位 0 空閑*/ ; struct direct /*-文件控制快信息-*/ struct fcb char name9; /*文件/目錄名 8位*
4、/ char property; /*屬性 1位目錄 0位普通文件*/ int size; /*文件/目錄字節數、盤塊數)*/ int firstdisk; /*文件/目錄 起始盤塊號*/ int next; /*子目錄起始盤塊號*/ int sign; /*1是根目錄 0不是根目錄*/ directitemmsd+2; ; struct opentable struct openttableitem char name9; /*文件名*/ int firstdisk; /*起始盤塊號*/ int size; /*文件的大小*/ openitemmofn; int cur_size; /*當前
5、打文件的數目*/ ; struct fatitem *fat; /*fat表*/ struct direct *root; /*根目錄*/ struct direct *cur_dir; /*當前目錄*/ struct opentable u_opentable; /*文件打開表*/ int fd=-1; /*文件打開表的序號*/ char *bufferdir; /*記錄當前路徑的名稱*/ char *fdisk; /*虛擬磁盤起始地址*/ void initfile(); void format(); void enter(); void halt(); int create(char *
6、name); int open(char *name); int close(char *name); int write(int fd,char *buf,int len); int read(int fd,char *buf); int del(char *name); int mkdir(char *name); int rmdir(char *name); void dir(); int cd(char *name); void print(); void show(); void initfile() fdisk = (char *)malloc(mem_d_size*sizeof(
7、char); /*申請 1m空間*/ format(); void format() int i; file *fp; fat = (struct fatitem *)(fdisk+disksize); /*計算fat表地址,引導區向后偏移 1k)*/ /*-初始化fat表-*/ fat0.item=-1; /*引導塊*/ fat0.em_disk=1; for(i=1;iroot_disk_no-1;i+) /*存放 fat表的磁盤塊號*/ fati.item=i+1; fati.em_disk=1; fatroot_disk_no.item=-1; /*存放根目錄的磁盤塊號*/ fatro
8、ot_disk_no.em_disk=1; for(i=root_disk_no+1;idirectitem0.sign = 1; root-directitem0.firstdisk = root_disk_no; strcpy(,.); root-directitem0.next = root-directitem0.firstdisk; perty = 1; root-directitem0.size = root_disk_size; /*-指向上一級目錄的目錄項-*/ root-directitem1.
9、sign = 1; root-directitem1.firstdisk = root_disk_no; strcpy(,.); root-directitem1.next = root-directitem0.firstdisk; perty = 1; root-directitem1.size = root_disk_size; if(fp = fopen(disk.dat,wb)=null) printf(error:n cannot open file n); return; for(i=2;idirec
10、titemi.sign = 0; root-directitemi.firstdisk = -1; strcpy(,); root-directitemi.next = -1; perty = 0; root-directitemi.size = 0; if(fp = fopen(disk.dat,wb)=null) printf(error:n cannot open file n); return; if(fwrite(fdisk,mem_d_size,1,fp)!=1) /*把虛擬磁盤空間保存到磁盤文件中*
11、/ 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(disk.dat,rb)=null) printf(error:ncannot open filen); return; if(!fread(fdisk,mem_d_size,1,fp) /*把磁盤文件disk.dat 讀入虛擬磁盤空間(內存)*/ printf(error:ncannot r
12、ead filen); exit(0); fat = (struct fatitem *)(fdisk+disksize); /*找到fat表地址*/ root = (struct direct *)(fdisk+disksize+fatsize);/*找到根目錄地址*/ fclose(fp); /*-初始化用戶打開表-*/ for(i=0;i8) /*文件名大于 8位*/ return(-1); for(j=2;,name) break; if(jmsd+2) /*文件已經存在*/ return(-4); for(i=2;idirectitemi.first
13、disk=-1) break; if(i=msd+2) /*無空目錄項*/ return(-2); if(u_opentable.cur_size=mofn) /*打開文件太多*/ return(-3); for(j=root_disk_no+1;j=disk_num) return(-5); fatj.em_disk = 1; /*將空閑塊置為已經分配*/ /*-填寫目錄項-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size = 0; cur
14、_dir-directitemi.next = j; cur_perty = 0; /*-*/ fd = open(name); return 0; int open(char *name) int i, j; for(i=2;,name) break; if(i=msd+2) return(-1); /*-是文件還是目錄-*/ if(cur_perty=1)return(-4); /*-文件是否打開-*/ for(j=0;jmofn;j+) if(!strcmp(u_opentabl
15、,name) break; if(j=mofn) /*文件打開太多*/ return(-3); /*-查找一個空閑用戶打開表項-*/ for(j=0;jdirectitemi.firstdisk; strcpy(u_,name); u_opentable.openitemj.size = cur_dir-directitemi.size; u_opentable.cur_size+; /*-返回用戶打開表表項的序號-*/ return(j); int close(char *name) int i; for(i=0
16、;i=mofn) return(-1); /*-清空該文件的用戶打開表項的內容-*/ strcpy(u_,); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-; return 0; int write(int fd, char *buf, int len) char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*-用 $ 字符作為空格 #
17、 字符作為換行符-*/ char space = 32; char endter= n; for(i=0;ilen;i+) if(bufi = $) bufi = space; else if(bufi = #) bufi = endter; /*-讀取用戶打開表對應表項第一個盤塊號-*/ item = u_opentable.openitemfd.firstdisk; /*-找到當前目錄所對應表項的序號-*/ for(i=2;idirectitemi.firstdisk=item) break; temp = i; /*-存放當前目錄項的下標-*/ /*-找到的item 是該文件的最后一塊磁
18、盤塊-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找該文件的下一盤塊-*/ /*-計算出該文件的最末地址-*/ first = fdisk+item*disksize+u_opentable.openitemfd.size%disksize; /*-如果最后磁盤塊剩余的大小大于要寫入的文件的大小-*/ if(disksize-u_opentable.openitemfd.size%disksizelen) strcpy(first,buf); u_opentable.openitemfd.size = u_opentable.openi
19、temfd.size+len; cur_dir-directitemtemp.size = cur_dir-directitemtemp.size+len; else for(i=0;i0) ilen2 = ilen2+1; /*-還需要多少塊磁盤塊-*/ for(j=0;jilen2;j+) for(i=root_disk_no+1;i=disk_num) /*-如果磁盤塊已經分配完了-*/ return(-1); first = fdisk+i*disksize; /*-找到的那塊空閑磁盤塊的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一塊-*/ for(k=0;k
20、len-(disksize-u_opentable.openitemfd.size%disksize)-j*disksize;k+) firstk = bufk; else/*-如果不是要最后分配的一塊-*/ for(k=0;kdirectitemtemp.size = cur_dir-directitemtemp.size+len; return 0; int read(int fd, char *buf) int len = u_opentable.openitemfd.size; char *first; int i, j, item; int ilen1, modlen; item =
21、 u_opentable.openitemfd.firstdisk; ilen1 = len/disksize; modlen = len%disksize; if(modlen!=0) ilen1 = ilen1+1; /*-計算文件所占磁盤的塊數-*/ first = fdisk+item*disksize; /*-計算文件的起始位置-*/ for(i=0;iilen1;i+) if(i=ilen1-1) /*-如果在最后一個磁盤塊-*/ for(j=0;jlen-i*disksize;j+) bufi*disksize+j = firstj; else /*-不在最后一塊磁盤塊-*/ f
22、or(j=0;jlen-i*disksize;j+) bufi*disksize+j = firstj; item = fatitem.item; /*-查找下一盤塊-*/ first = fdisk+item*disksize; return 0; int del(char *name) int i,cur_item,item,temp; for(i=2;,name) break; cur_item = i; /*-用來保存目錄項的序號,供釋放目錄中-*/ if(i=msd+2) /*-如果不在當前目錄中-*/ return(-1); if(cur_dir-
23、directitemcur_perty!=0) /*-如果刪除的(不)是目錄-*/ return(-3); for(i=0;idirectitemcur_item.firstdisk;/*-該文件的起始盤塊號-*/ while(item!=-1) /*-釋放空間,將fat表對應項進行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = 0; item = temp; /*-釋放目錄項-*/ cur_dir-directitemcur_item.sign = 0; cur_dir-directitemcur
24、_item.firstdisk = -1; strcpy(u_opentable.openitemcur_,); cur_dir-directitemcur_item.next = -1; cur_dir-directitemcur_perty = 0; cur_dir-directitemcur_item.size = 0; return 0; int mkdir(char *name) int i,j; struct direct *cur_mkdir; if(!strcmp(name,.) return(-4); if(!strcmp(name,.) r
25、eturn(-4); if(strlen(name)8) /*-如果目錄名長度大于 8位-*/ return(-1); for(i=2;idirectitemi.firstdisk=-1) break; if(i=msd+2) /*-目錄/文件 已滿-*/ return(-2); for(j=2;,name) break; if(jmsd+2) /*-如果有重名-*/ return(-3); for(j=root_disk_no+1;j=disk_num) return(-5); fatj.em_disk=1; /*-將該空閑塊設置為已分配-*/ /*-填寫目
26、錄項-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk=j; cur_dir-directitemi.size=root_disk_size; cur_dir-directitemi.next=j; cur_perty=1; /*-所創目錄在虛擬磁盤上的地址(內存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir-directitemi.firstdisk*disksize); /*-初始化目錄-*/ /*-指向當
27、前目錄的目錄項-*/ cur_mkdir-directitem0.sign=0; cur_mkdir-directitem0.firstdisk=cur_dir-directitemi.firstdisk; strcpy(cur_,.); cur_mkdir-directitem0.next=cur_mkdir-directitem0.firstdisk; cur_perty=1; cur_mkdir-directitem0.size=root_disk_size; /*-指向上一級目錄的目錄項-*/ cur
28、_mkdir-directitem1.sign=cur_dir-directitem0.sign;cur_mkdir-directitem1.firstdisk=cur_dir-directitem0.firstdisk; strcpy(cur_,.); cur_mkdir-directitem1.next=cur_mkdir-directitem1.firstdisk; cur_perty=1; cur_mkdir-directitem1.size=root_disk_size; for(i=2;idire
29、ctitemi.sign=0; cur_mkdir-directitemi.firstdisk=-1; strcpy(cur_,); cur_mkdir-directitemi.next=-1; cur_perty=0; cur_mkdir-directitemi.size=0; return 0; int rmdir(char *name) int i,j,item; struct direct *temp_dir; /*-檢查當前目錄項中有無該目錄-*/ for(i=2;
30、,name) break; if(i=msd+2) /*-沒有這個文件或目錄-*/ return(-1);if(cur_perty!=1)/*-刪除的不是目錄-*/ return(-3); /*-判斷要刪除的目錄有無子目錄-*/ temp_dir=(struct direct *)(fdisk+cur_dir-directitemi.next*disksize); for(j=2;jdirectitemj.next!=-1) break; if(jdirectitemi.firstdisk; fatitem.em_disk=0; /*-修改目錄項-*/ c
31、ur_dir-directitemi.sign=0; cur_dir-directitemi.firstdisk=-1; strcpy(cur_,); cur_dir-directitemi.next=-1; cur_perty=0; cur_dir-directitemi.size=0; return 0; void dir() int i; for(i=2;idirectitemi.firstdisk!=-1) /*-如果存在子目錄-*/ printf(%st,cur_);
32、 if(cur_perty=0) /*-文件-*/ printf(%dttn,cur_dir-directitemi.size); else printf(ttn); int cd(char *name) int i,j,item; char *str; char *temp,*point,*point1; struct direct *temp_dir; temp_dir=cur_dir; str=name; if(!strcmp(,name) cur_dir = root; strcpy(bufferdir,root:); return 0; temp
33、 = (char *)malloc(dir_maxsize*sizeof(char);/*-最長路徑名字分配空間-*/ for(i=0;i(int)strlen(str);i+) tempi=stri; tempi=0; for(j=0;,temp) break; free(temp);/*釋放申請的臨時空間*/ /if(temp_perty!=1) /*-打開的不是目錄-*/ /return(-2); if(j=msd+2) /*-不在當前目錄-*/ return(-1); item=temp_dir-directite
34、mj.firstdisk; /*-當前目錄在磁盤中位置-*/ temp_dir=(struct direct *)(fdisk+item*disksize); if(!strcmp(.,name) if(cur_dir-directitemj-1.sign!=1) /*-如果上級目錄不是根目錄-*/ point=strchr(bufferdir,); /查找字符串bufferdir中首次出現字符 的位置while(point!=null) point1=point+1; /*-減去所占的空間,記錄下次查找的起始地址-*/ point=strchr(point1,); *(point1-1)=0
35、; /*-將上一級目錄刪除-*/ else /if(name0 !=) bufferdir = strcat(bufferdir,); /*-修改當前目錄-*/ bufferdir = strcat(bufferdir,name); cur_dir=temp_dir; /*-將當前目錄確定下來-*/ return 0; void show() printf(%s,bufferdir); void print() printf(*n);printf(*文件系統設計*n); printf(*t命令格式說明*n); printf(*tcd 目錄名更改當前目錄*n); printf(*tmkdir 目
36、錄名創建子目錄*n); printf(*trmdir 目錄名刪除子目錄*n); printf(*tdir顯示當前目錄的子目錄*n); printf(*tcreate 文件名創建文件*n); printf(*tdel 文件名刪除文件*n); printf(*topen 文件名打開文件*n); printf(*tclose 文件名關閉文件*n); printf(*tread讀文件*n); printf(*twrite寫文件*n); printf(*texit退出系統*n); printf(*n); void main() file *fp; char ch; char a100; char code1110; char name10; int i,flag,r_size; char *contect; contect = (char *)malloc(max_write*sizeof(char); if(fp=fopen(disk.dat,rb)=null) printf(you have not format,do you want format?(y/n); scanf(%c,&ch); if(ch=y) initfile(); printf(successfully format! n); else return; enter();print(); sh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肝膽胰外科護理查房:MDT模式提升患者就醫體驗
- 初中音樂人音版七年級下冊☆紅河谷教案
- 工人工資培訓
- 七年級地理上冊 3.3 降水和降水的分布教學設計3 (新版)新人教版
- 九年級英語上冊 Unit 4 I used to be afraid of the dark Section A(3a-3c)教學設計(新版)人教新目標版
- 人教版初中歷史與社會七年級上冊 3.2.2 山地之國 教學設計
- 六年級體育上冊 講究儀表美教學設計
- 三年級語文下冊第二單元集體備課教案
- 《百分數的應用(四)》(教學設計)-2024-2025學年北師大版小學數學六年級上冊
- 安徽省銅陵市第十五中學等2023-2024學年八年級下學期期中數學聯考試題
- 公積金個人貸款合同模板
- 智能紡織技術的家居家紡應用
- DL∕T 5161.14-2018 電氣裝置安裝工程質量檢驗及評定規程 第14部分:起重機電氣裝置施工質量檢驗
- 有機半導體完整版本
- 監護人考試試題
- DL-T5153-2014火力發電廠廠用電設計技術規程
- 山東司法警官職業學院招聘筆試真題2021
- 2024年甘肅省蘭州市中考物理模擬試卷
- 2024年4月自考00155中級財務會計試題及答案
- JT-GQB-016-2000關于采用交通行業標準《公路橋涵標準圖》有關問題的通知
- 家庭農場經營與管理-家庭農場產品營銷
評論
0/150
提交評論