操作系統(tǒng)磁盤文件管理源碼

上傳人:燈火****19 文檔編號:31936694 上傳時間:2021-10-13 格式:DOCX 頁數(shù):50 大?。?41.03KB
收藏 版權(quán)申訴 舉報 下載
操作系統(tǒng)磁盤文件管理源碼_第1頁
第1頁 / 共50頁
操作系統(tǒng)磁盤文件管理源碼_第2頁
第2頁 / 共50頁
操作系統(tǒng)磁盤文件管理源碼_第3頁
第3頁 / 共50頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《操作系統(tǒng)磁盤文件管理源碼》由會員分享,可在線閱讀,更多相關《操作系統(tǒng)磁盤文件管理源碼(50頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、頁眉#include#include#include#define MEM_D_SIZE 1024*1024/ 總磁盤空間為 1M#define DISKSIZE 1024磁盤塊的大小1K磁盤塊數(shù)目1K#define DISK_NUM 1024#define FATSIZE DISK_NUM*sizeof(struct fatitem) /FAT 表大小#define ROOT_DISK_NO FATSIZE/DISKSIZE+1/ 根目錄起始盤塊 號#define ROOT_DISK_SIZE sizeof(struct direct) / 根目錄大小 / 路徑最大長度為 #define D

2、IR_MAXSIZE 1024 1KB最大子目錄數(shù) 5 #define MSD 5/最大文件深度為 5 #define MOFN 5/ 最大寫入文字長度 128KB #define MAX_WRITE 1024*128struct fatitem /* size 8*/int item; /*存放文件下一個磁盤的指針*/char em_disk;/* 磁盤塊是否空閑標志位0空閑*/;頁腳頁眉struct direct/*-文件控制快信息-*/struct FCBchar name9; /*文件/目錄名 8位*/char property; /*屬性1位目錄 0位普通文件*/int size;

3、/*文件/目錄字節(jié)數(shù)、盤塊數(shù))*/int firstdisk; /*文件/目錄 起始盤塊號*/int next; /*子目錄起始盤塊號*/int sign; /*1是根目錄 0不是根目錄*/directitemMSD+2;struct opentablestruct openttableitemchar name9; /* 文件名 */*/ 起始盤塊號 int firstdisk; /*頁腳頁眉int size;/*文件的大小*/openitemMOFN;int cur_size; /*當前打文件的數(shù)目*/;struct fatitem *fat; /*FAT 表*/struct direct

4、 *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 *name);int open(char *name);int close(char *name);int write(i

5、nt 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(char);/* 申請 1M 空間 */ format();void format()int i;FILE *fp;表地址,引導區(qū)向后偏計

6、算 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;fatROOT_DISK_NO.em_disk=1;for(i=ROOT_DISK_NO+1;idirectitem0.sign = 1;root-di

7、rectitem0.firstdisk = ROOT_DISK_NO;strcpy(root-directitem0.name,.);root-directitem0.next = root-directitem0.firstdisk;root-directitem0.property = 1;root-directitem0.size = ROOT_DISK_SIZE;/*指向上一級目錄的目錄項*/root-directitem1.sign = 1;root-directitem1.firstdisk = ROOT_DISK_NO;strcpy(root-directitem1.name,.

8、);root-directitem1.next = root-directitem0.firstdisk;root-directitem1.property = 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;idirectitemi.sign = 0;root-directitemi.firstdisk = -1;頁腳頁眉strcpy(root-directitemi.name,);root-di

9、rectitemi.next = -1;root-directitemi.property = 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)/*/printf(Error:n File write error! n);fclose(fp);void enter()頁腳頁眉FILE *fp;int i;fdisk = (char *)m

10、alloc(MEM_D_SIZE*sizeof(char);/* 申請 1M 空間*/if(fp=fopen(disk.dat, b)=NULL)printf(Error:nCannot open filen);return;讀入虛擬磁盤 disk.dat /* 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 di

11、rect *)(fdisk+DISKSIZE+FATSIZE);/*/ fclose(fp);初始化用戶打開表/*/for(i=0;i8)/*文件名大于 8 位*/return(-1);for(j=2;jdirectitemj.name,name)頁腳頁眉break;if(jMSD+2) /* 文件已經(jīng)存在*/return(-4);for(i=2;idirectitemi.firstdisk=-1)break;if(i=MSD+2) /* 無空目錄項*/return(-2);if(u_opentable.cur_size=MOFN) /* 打開文件太多 */return(-3);for(j=R

12、OOT_DISK_NO+1;j=DISK_NUM)頁腳頁眉return(-5);fatj.em_disk = 1;/*將空閑塊置為已經(jīng)分配*/*填寫目錄項*/strcpy(cur_dir-directitemi.name,name);cur_dir-directitemi.firstdisk = j;cur_dir-directitemi.size = 0;cur_dir-directitemi.next = j;cur_dir-directitemi.property = 0;*/*fd = open(name);return 0;int open(char *name)int i, j;f

13、or(i=2;idirectitemi.name,name)break;頁腳頁眉if(i=MSD+2)return(-1);/*是文件還是目錄 */if(cur_dir-directitemi.property=1)return(-4);/*文件是否打開*/for(j=0;jMOFN;j+)if(!strcmp(u_opentable.openitemj.name,name) break;if(j=MOFN)/*文件打開太多 */return(-3);/*查找一個空閑用戶打開表項*/for(j=0;jdirectitemi.firstdisk;strcpy(u_opentable.openit

14、emj.name,name);u_opentable.openitemj.size = cur_dir-directitemi.size;u_opentable.cur_size+;/*返回用戶打開表表項的序號 */return(j);int close(char *name)int i;for(i=0;i=MOFN)return(-1);/* 清空該文件的用戶打開表項的內(nèi)容 */strcpy(u_opentable.openitemi.name,);u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.size = 0;u_op

15、entable.cur_size-;return 0;int write(int fd, char *buf, int len)char *first;int item, i, j, k;int ilenl, ilen2, modlen, temp;/* 用$字符作為空格 #字符作為換行符 */char Space = 32;char Endter= n;for(i=0;ilen;i+)頁腳頁眉if(bufi = $)bufi = Space;else if(bufi = #)bufi = Endter;*/ /* 讀取用戶打開表對應表項第一個盤塊號item = u_opentable.ope

16、nitemfd.firstdisk;*/ /* 找到當前目錄所對應表項的序號for(i=2;idirectitemi.firstdisk=item)break;存放當前目錄項的下標-*/ temp = i; /*- /* 找到的是該文件的最后一塊磁盤塊*/ itemwhile(fatitem.item!=-1)查找該文件的下一盤塊 item =fatitem.item; /*-*/頁腳頁眉/*-計算出該文件的最末地址 */first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE;/*-如果最后磁盤塊剩余的大小大于要寫入的文

17、件的大小 */if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZElen)strcpy(first,buf);u_opentable.openitemfd.sizeu_opentable.openitemfd.size+len;cur_dir-directitemtemp.sizecur_dir-directitemtemp.size+len;elsefor(i=0;i0)ilen2 = ilen2+1;/*-還需要多少塊磁盤塊-*/for(j=0;jilen2;j+)*/ for(i=ROOT_DISK_NO+1;i=DISK_NUM) /*- -

18、*/ 如果磁盤塊已經(jīng)分配完了return(-1);first = fdisk+i*DISKSIZE; /*-找到的那塊空閑磁盤塊的起始地址-*/if(j=ilen2-1) /*-如果是最后要分配的一塊-*/for(k=0;klen-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DI SKSIZE;k+)firstk = bufk;頁腳頁眉else/*-如果不是要最后分配的一塊-*/for(k=0;kdirectitemtemp.sizecur_dir-directitemtemp.size+len;return 0;int read(int

19、 fd, char *buf)頁腳頁眉int len = u_opentable.openitemfd.size;char *first;int i, j, item;int ilenl, modlen;item = u_opentable.openitemfd.firstdisk;ilenl = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1;/*-計算文件所占磁盤的塊數(shù)-*/-*/ first = fdisk+item*DISKSIZE; /*-計算文件的起始位置for(i=0;iilen1;i+)if(i=i

20、len1-1)/*-如果在最后一個磁盤塊-*/for(j=0;jlen-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;頁腳頁眉else /*-不在最后一塊磁盤塊-*/for(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;idirectitemi.name,name)brea

21、k;cur_item = i; /*-用來保存目錄項的序號-*/ ,供釋放目錄中頁腳頁眉if(i=MSD+2)/*-如果不在當前目錄中-*/return(-1);是目(不)if(cur_dir-directitemcurjtem.property!=0) /*-如果刪除的錄-*/return(-3);-*/則不能刪除,退出for(i=0;idirectitemcurjtem.firstdisk;/*-FATwhile(item!=-1)/*- 釋放空間,將表對應項進行修改-*/temp = fatitem.item;fatitem.item = -1;fatitem.em_disk = 0;i

22、tem = temp;釋放目錄項/*/頁腳頁眉cur_dir-directitemcurjtem.sign = 0;cur_dir-directitemcurjtem.firstdisk = -1;strcpy(u_opentable.openitemcurjtem.name,);cur_dir-directitemcur_item.next = -1;cur_dir-directitemcur_item.property = 0;cur_dir-directitemcurjtem.size = 0;return 0;int mkdir(char *name)int i,j;struct di

23、rect *cur_mkdir;if(!strcmp(name,.)return(-4);if(!strcmp(name,.)return(-4);if(strlen(name)8)/*-如果目錄名長度大于8位-*/return(-1);頁腳頁眉for(i=2;idirectitemi.firstdisk=-1)break;-*/ 已滿 if(i=MSD+2) /*-目錄/ 文件return(-2);for(j=2;jdirectitemj.name,name)break;if(j=DISK_NUM)return(-5);頁腳頁眉fatj.em_disk=1; /*-將該空閑塊設置為已分配-*

24、/*填寫目錄項*/strcpy(cur_dir-directitemi.name,name);cur_dir-directitemi.firstdisk=j;cur_dir-directitemi.size=ROOT_DISK_SIZE;cur_dir-directitemi.next=j;cur_dir-directitemi.property=1;/*-所創(chuàng)目錄在虛擬磁盤上的地址(內(nèi)存物理地址)-*/cur_mkdir=(struct direct*)(fdisk+cur_dir-directitemi.firstdisk*DISKSIZE);/*-初始化目錄-*/*-指向當前目錄的目錄項

25、-*/cur_mkdir-directitem0.sign=0;cur_mkdir-directitem0.firstdisk=cur_dir-directitemi.firstdisk;strcpy(cur_mkdir-directitem0.name,.);cur_mkdir-directitem0.next=cur_mkdir-directitem0.firstdisk;cur_mkdir-directitem0.property=1;cur_mkdir-directitem0.size=ROOT_DISK_SIZE;頁腳頁眉/*-指向上一級目錄的目錄項-*/cur_mkdir-dire

26、ctitem1.sign=cur_dir-directitem0.sign;cur_mkdir-directitem1.firstdisk=cur_dir-directitem0.firstdisk;strcpy(cur_mkdir-directitem1.name,.);cur_mkdir-directitem1.next=cur_mkdir-directitem1.firstdisk;cur_mkdir-directitem1.property=1;cur_mkdir-directitem1.size=ROOT_DISK_SIZE;for(i=2;idirectitemi.sign=0;c

27、ur_mkdir-directitemi.firstdisk=-1;strcpy(cur_mkdir-directitemi.name,);cur_mkdir-directitemi.next=-1;cur_mkdir-directitemi.property=0;cur_mkdir-directitemi.size=0;return 0;int rmdir(char *name)頁腳頁眉int i,j,item;struct direct *temp_dir;/*-檢查當前目錄項中有無該目錄 -*/for(i=2;idirectitemi.name,name)break;if(i=MSD+2

28、) /*-沒有這個文件或目錄 -*/ return(-1);if(cur_dir-directitemi.property!=T)/*- 刪除的不是目錄 -*/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;/*-修改目錄項-*/cur_dir-directitemi.si

29、gn=0;cur_dir-directitemi.firstdisk=-1;strcpy(cur_dir-directitemi.name,);cur_dir-directitemi.next=-1;cur_dir-directitemi.property=0;cur_dir-directitemi.size=0;return 0;void dir()int i;for(i=2;idirectitemi.firstdisk!=-1) /*-如果存在子目錄-*/頁腳頁眉printf(%st,cur_dir-directitemi.name);文件-*/if(cur_dir-directitemi

30、.property=0) /*-printf(%dttn,cur_dir-directitemi.size);elseprintf( tn);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 = (char *)malloc(DIR_MAXSIZE*sizeof(ch

31、ar);/*-最長路徑名字分配空問-*/for(i=0;idirectitemj.name,temp) break;*/ free(temp);/* 釋放申請的臨時空間/if(temp_dir-directitemj.property!=1) /*-打開的不是目錄-*/return(-2);-*/ 不在當前目錄 if(j=MSD+2) /*- return(-1);item=temp_dir-directitemj.firstdisk;/*- 當前目錄在磁盤中位置-*/temp_dir=(struct direct *)(fdisk+item*DISKSIZE);if(!strcmp(.,na

32、me)if(cur_dir-directitemj-1.sign!=1) /*- 如果上級目錄不是根目錄 -*/point=strchr(bufferdir,); / 查找字符串 bufferdir 中首次出現(xiàn)字符 的位置while(point!=NULL)point1=point+1; /*- 減去 所占的空間 , 記錄下次查找的起始地址-*/point=strchr(point1,);將上一級目錄刪除*(point1-1)=0; /*-*/頁腳頁眉else/if(name0 !=)bufferdir = strcat(bufferdir,); /*-修改當前目錄-*/bufferdir =

33、 strcat(bufferdir,name);-*/ /*-cur_dir=temp_dir;將當前目錄確定下來return 0; void show()printf(%s,bufferdir);void print()printf(*n);文件系統(tǒng)設計printf(*n);*n);命令格式printf(*t 說明printf(*tcd 目錄名 *n); 更改當前目錄頁腳頁眉printf(*tmkdir 目錄名創(chuàng)建子目錄*n);刪除子目錄printf(*trmdir 目錄名 *n);顯示當前目錄的子目錄*n); printf(*tdir創(chuàng)建文件 *n); printf(*tcreate 文件

34、名printf(*tdel 文件名 刪除文件 *n);*n);打開文件printf(*topen 文件名關閉文件*n); 文件名printf(*tcloseprintf(*tread 讀文件 *n);*n); printf(*twrite寫文件*n); printf(*texit退出系統(tǒng)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(cha

35、r);if(fp=fopen(disk.dat,b)=NULL)printf(You have not format,Do you want format?(y/n);scanf(%c,&ch);if(ch=y)initfile();printf(Successfully format! n);elsereturn;enter();print();頁腳頁眉show();strcpy(code0,exit);strcpy(code1,create);strcpy(code2,open);strcpy(code3,close);strcpy(code4,write);strcpy(code5,ea

36、d);strcpy(code6,del);strcpy(code7,mkdir);strcpy(code8, mdir);strcpy(code9,dir);strcpy(code10,cd);while(1)scanf(%s,a);for(i=0;i11;i+)if(!strcmp(codei,a)break;頁腳頁眉switch(i)case 0: / 退出文件系統(tǒng) free(contect);halt();return;case 1: / 創(chuàng)建文件scanf(%s,name);flag = create(name);if(flag=-1)printf(Error: n The lengt

37、h is too long !n);else if(flag=-2)printf(Error: n The direct item is already full !n);else if(flag=-3)printf(Error: n The number of openfile is too much !n);頁腳頁眉else if(flag=-4)printf(Error: n The name is already in the direct !n);else if(flag=-5)printf(Error: n The disk space is full!n);elseprintf(

38、Successfully create a file! n);show();break;case 2:打開文件scanf(%s,name);fd = open(name);if(fd = -1)printf(Error: n The open file not exit! n);頁腳頁眉else if(fd = -2)printf(Error: n The file have already opened! n);else if(fd = -3)printf(Error: n The number of open file is too much! n);else if(fd = -4)pri

39、ntf(Error: n It is a direct,can not open for read or write!n);elseprintf(Successfully opened! n);show();break;case 3:/關閉文件頁腳頁眉scanf(%s,name);flag = close(name);if(flag = -1)printf(Error:n The file is not opened ! n);elseprintf(Successfully closed! n);show();break;case 4:寫文件if(fd =-1)printf(Error:n T

40、he file is not opened ! n);elseprintf(Please input the file contect:);scanf(%s,contect);頁腳頁眉flag=write(fd,contect,strlen(contect);if(flag = 0)printf(Successfully write! n);elseprintf(Error:n The disk size is not enough! n);show();break;case 5:讀文件if(fd =-1)printf(Error:n The file is not opened ! n);e

41、lseflag = read(fd,contect);if(flag = 0)頁腳頁眉for(i=0;iu_opentable.openitemfd.size;i+)printf(%c,contecti);printf( n);show();break;case 6:/ 刪除文件scanf(%s,name);flag = del(name);if(flag = -1)printf(Error:n The file not exit! n);else if(flag = -2)printf(Error:n The file is opened,please first close it ! n)

42、;頁腳頁眉else if(flag = -3)printf(Error:n The delete is not file ! n);elseprintf(Successfully delete! n);show();break;case 7:/創(chuàng)建子目錄scanf(%s,name);flag = mkdir(name);if(flag = -1)printf(Error:n The length of name is to long! n);else if(flag = -#)printf(Error:n The direct item is already full ! n);頁腳頁眉els

43、e if(flag = -3)printf(Error:n The name is already in the direct ! n);else if(flag = -4)the the name of or . can not as n printf(Error: direct!n);else if(flag = -5)printf(Error: n The disk space is full!n);else if(flag = 0)printf(Successfully make dircet! n);show();break;case 8:11刪除子目錄scanf(%s,name);

44、頁腳頁眉flag = rmdir(name);if(flag = -1)printf(Error:n The direct is not exist! n);else if(flag = -2)printf(Error:nThe direct has son direct ,please first remove the son dircct!n);else if(flag = -3)printf(Error:n The remove is not direct ! n);printf(Successfully remove dircet! n);show();break;顯示當前子目錄case 9: 頁腳頁眉dir();show();break;case 10:/更改當前目錄scanf(%s,name);flag = cd(name);if(flag = -1)printf(Error:n The path no correct!n);else if(flag = -2)printf(Error:nThe opened is not direct!n);show();break;default:printf(Error!n The command is wrong! n);show();頁腳頁眉頁腳

展開閱讀全文
溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!