虛擬文件系統(tǒng)的實(shí)現(xiàn)_第1頁(yè)
虛擬文件系統(tǒng)的實(shí)現(xiàn)_第2頁(yè)
虛擬文件系統(tǒng)的實(shí)現(xiàn)_第3頁(yè)
虛擬文件系統(tǒng)的實(shí)現(xiàn)_第4頁(yè)
虛擬文件系統(tǒng)的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、渤海大學(xué)操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告書(shū)題 目:虛擬文件系統(tǒng)的實(shí)現(xiàn)題目編號(hào):院 系:軟件服務(wù)與外包學(xué)院班 級(jí):11級(jí)2班小組成員:陳鏡歡學(xué)號(hào):111810040王晨學(xué)號(hào):1118100352013-06-30目 錄一、課程設(shè)計(jì)任務(wù)劃分1二、基本原理12.1主要操作函數(shù)12.2數(shù)據(jù)結(jié)構(gòu)12.3算法流程圖3三、基本思路43.1 設(shè)計(jì)簡(jiǎn)介43.2 設(shè)計(jì)方案論述43.3 文件基本操作4四、調(diào)試及實(shí)驗(yàn)結(jié)果5運(yùn)行結(jié)果分析7五、個(gè)人體會(huì)9 一、課程設(shè)計(jì)任務(wù)劃分陳鏡歡:主要編寫(xiě)代碼熟悉課題的任務(wù)和要求,查閱相關(guān)文獻(xiàn)和資料,并做好編碼準(zhǔn)備,調(diào)試,驗(yàn)收王晨:程序編碼、調(diào)試和測(cè)試,書(shū)寫(xiě)報(bào)告二、基本原理2.1主要操作函數(shù)i

2、nt create(char *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(); 2.2數(shù)據(jù)結(jié)構(gòu)struct fatitem /* size 8*/ int ite

3、m; /*存放文件下一個(gè)磁盤(pán)的指針*/ char em_disk; /*磁盤(pán)塊是否空閑標(biāo)志位0 空閑*/ ; struct direct /*-文件控制快信息-*/ struct FCB char name9; /*文件/目錄名8位*/ char property; /*屬性1位目錄0位普通文件*/ int size; /*文件/目錄字節(jié)數(shù)、盤(pán)塊數(shù))*/ int firstdisk; /*文件/目錄起始盤(pán)塊號(hào)*/ int next; /*子目錄起始盤(pán)塊號(hào)*/ int sign; /*1是根目錄0不是根目錄*/ directitemMSD+2; ; struct opentable struct

4、 openttableitem char name9; /*文件名*/ int firstdisk; /*起始盤(pán)塊號(hào)*/ int size; /*文件的大小*/ openitemMOFN; int cur_size; /*當(dāng)前打文件的數(shù)目*/ ; 2.3算法流程圖開(kāi)始初始化磁盤(pán)登錄YN創(chuàng)建文件打開(kāi)文件關(guān)閉文件讀文件寫(xiě)文件列文件目錄刪除文件注銷(xiāo)用戶(hù)退出系統(tǒng)提示錯(cuò)誤指令成功執(zhí)行?N三、基本思路3.1 設(shè)計(jì)簡(jiǎn)介本系統(tǒng)是模擬實(shí)現(xiàn)多用戶(hù)多目錄的文件系統(tǒng),在系統(tǒng)出現(xiàn)登錄后 ,輸入用戶(hù)與口令,在用戶(hù)登錄系統(tǒng)后,可建立文件卷,將用戶(hù)輸入的文件保存在指定的文件中。系統(tǒng)的命令與其命令的具體實(shí)現(xiàn),此模擬系統(tǒng)共提供了

5、上述命令,并根據(jù)命令的含義與要求,用C+編程來(lái)完成所有具體操作。該系統(tǒng)可以模擬完成用戶(hù)的登陸和驗(yàn)證,列出文件和目錄,新建目錄,改變目錄,創(chuàng)立和編寫(xiě)文件,刪除文件和退出系統(tǒng)等功能3.2 設(shè)計(jì)方案論述 本文件系統(tǒng)采用兩級(jí)目錄,其中第一級(jí)對(duì)應(yīng)于用戶(hù)賬號(hào),第二級(jí)對(duì)應(yīng)于用戶(hù)帳號(hào)下的文件。另外,為了簡(jiǎn)便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。 首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動(dòng)文件等。主目錄和子目錄都以文件的形式存放于磁盤(pán),這樣便于查找和修改。 用戶(hù)創(chuàng)建的文件,可以編號(hào)存儲(chǔ)于磁盤(pán)上。如:file0,file1,file2并以編號(hào)作為物理地址,在目錄中進(jìn)行登記。

6、3.3 文件基本操作 創(chuàng)建文件:創(chuàng)建一個(gè)新文件時(shí),系統(tǒng)首先要為新文件申請(qǐng)必要的外存空間,并在FAT中為文件分配一個(gè)目錄項(xiàng)。目錄項(xiàng)中應(yīng)記錄新建文件的文件名、文件總?cè)萘?、?dāng)前已經(jīng)使用的容量、文件屬性、文件在磁盤(pán)中的起始位置。 刪除文件:當(dāng)已不在需要某文件時(shí),可將它從文件系統(tǒng)中刪除。在刪除時(shí),首先在FAT的文件鏈表中找到與該文件對(duì)應(yīng)的文件結(jié)點(diǎn),然后確認(rèn)文件是否處于關(guān)閉狀態(tài),若以上條件都滿(mǎn)足,則系統(tǒng)就可以把結(jié)點(diǎn)從文件鏈表中刪除,然后回收改結(jié)點(diǎn)對(duì)應(yīng)的磁盤(pán)空間。 打開(kāi)文件:只有處于打開(kāi)狀態(tài)的文件才能被讀取、寫(xiě)入、重復(fù)關(guān)閉且不能被刪除。 關(guān)閉文件:只有處于關(guān)閉狀態(tài)的文件才能被刪除,且不能被重復(fù)關(guān)閉。 列文件

7、目錄:用戶(hù)只能獲取自己建立的文件或其他用戶(hù)共享的文件的列表,并可以查看所用戶(hù)建立的文件列表。 寫(xiě)文件:用戶(hù)可以把相關(guān)數(shù)據(jù)寫(xiě)入到用戶(hù)自定義的文件中(磁盤(pán)上);待寫(xiě)文件必須處于打開(kāi)狀態(tài),且不能是其他用戶(hù)共享的文件。讀文件:用戶(hù)可以把文件中存儲(chǔ)的數(shù)據(jù)讀取出來(lái);待讀文件必須處于打開(kāi)狀態(tài);用戶(hù)既可以讀取自己建立的文件,也可以讀取其他用戶(hù)共享的文件。建子目錄:輸入目錄名,若存在于該文件名相同的目錄,這創(chuàng)建失??;若無(wú),則查找空閑的磁盤(pán),將該磁盤(pán)置為分配狀態(tài),填寫(xiě)目錄項(xiàng),分配地址后,子目錄創(chuàng)建成功。刪除目錄:輸入名字,查找是否存在該文件或目錄,若為文件,則不能刪除;若存在,找到起始盤(pán)塊號(hào),并將其釋放,修改目錄

8、項(xiàng),刪除成功。四、調(diào)試及實(shí)驗(yàn)結(jié)果(1)login 用戶(hù)登錄(2)mkdir創(chuàng)建子目錄(3)cd進(jìn)出目錄(4)create創(chuàng)建文件(5)close關(guān)閉文件(6)open打開(kāi)文件(7)write寫(xiě)文件(8) read讀文件(9) dir列目錄(10)delete刪除文件(11)rmdir刪除子目錄運(yùn)行結(jié)果分析從上述運(yùn)行過(guò)程可以看出,用戶(hù)登錄系統(tǒng)后,界面將顯示文件或目錄的基本操作,然后根據(jù)相應(yīng)操作,完成系統(tǒng)的基本要求。本次程序的運(yùn)行結(jié)果與預(yù)期結(jié)果最終達(dá)到了一致。自運(yùn)行階段,雖然每次都能得到運(yùn)行結(jié)果,但是操作界面有時(shí)不是很完美,于是通過(guò)修改程序代碼,不斷執(zhí)行程序,進(jìn)行完善,直到得出滿(mǎn)意的操作界面為止。

9、在該過(guò)程中,驗(yàn)證了本次課程設(shè)計(jì)所要求的基本功能,雖然有些操作不是很完善,但大體上都能實(shí)現(xiàn)。其中最令我不滿(mǎn)意的是dir功能。該功能只是列出目錄名,不能顯示目錄其他信息,是本次課程設(shè)計(jì)最大敗筆。五、個(gè)人體會(huì)課程設(shè)計(jì)是對(duì)我們平時(shí)學(xué)習(xí)的一種考察,我們要正確地對(duì)待。不斷地鍛煉自己動(dòng)手動(dòng)腦的能力、把知識(shí)賦予實(shí)踐就是我們學(xué)習(xí)的目標(biāo)!既然學(xué)校給我們這么好的機(jī)會(huì),讓我們自己在實(shí)驗(yàn)室作操作,我們應(yīng)該好好抓住機(jī)會(huì),把我們平時(shí)學(xué)習(xí)的東西用自己的作品展現(xiàn)出來(lái)。這次,給了我們充分鍛煉的機(jī)會(huì)。我們會(huì)用自己學(xué)到的東西的設(shè)計(jì)出一副好的作品。而對(duì)于我們來(lái)說(shuō),這種最靈活的知識(shí)卻是最難掌握的。也因?yàn)閷?duì)其基本知識(shí)掌握的不好,在這一次的

10、設(shè)計(jì)過(guò)程中遇到很多的困難,特別是物理盤(pán)塊和邏輯文件之間的對(duì)應(yīng)。在經(jīng)過(guò)與同學(xué)進(jìn)行溝通和交流并反復(fù)的測(cè)試之后,才明白了設(shè)計(jì)的函數(shù),而且完善了部分函數(shù)的主要功能。通過(guò)兩星期的操作系統(tǒng)課程設(shè)計(jì)實(shí)習(xí),讓我們對(duì)Linux文件系統(tǒng)有了深層次的了解和掌握,也通過(guò)了自己的能力體會(huì)到了編程的樂(lè)趣。最重要的是學(xué)會(huì)了關(guān)于設(shè)計(jì)分析和以前C語(yǔ)言學(xué)習(xí)過(guò)程中沒(méi)有及時(shí)鞏固的知識(shí),對(duì)C程序設(shè)計(jì)又有了更進(jìn)一步的認(rèn)識(shí),對(duì)一些細(xì)節(jié)的結(jié)構(gòu)體語(yǔ)句有了更深刻的理解。所以這是一次很難得的實(shí)踐機(jī)會(huì),讓我們真正用心編程,學(xué)到了課本以外更深刻更重要的實(shí)踐經(jīng)驗(yàn)。非常感謝老師提供這次機(jī)會(huì),在這個(gè)課程設(shè)計(jì)過(guò)程中我受益匪淺,希望以后在這樣的鍛煉中不斷成長(zhǎng),

11、提高自己各方面的能力,我們相信通過(guò)我們以后很加刻苦的學(xué)習(xí),我們會(huì)更加熱愛(ài)我們的專(zhuān)業(yè)課程。8渤海大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 實(shí)驗(yàn)設(shè)計(jì)報(bào)告書(shū)附錄主要代碼源程序:#include<stdio.h> #include<string.h> #include<stdlib.h> #define MEM_D_SIZE 1024*1024 /總磁盤(pán)空間為M#define DISKSIZE 1024/磁盤(pán)塊的大小K#define DISK_NUM 1024/磁盤(pán)塊數(shù)目K#define FATSIZE DISK_NUM*sizeof(struct fatitem)/FAT表大小#

12、define ROOT_DISK_NO FATSIZE/DISKSIZE+1/根目錄起始盤(pán)塊號(hào)#define ROOT_DISK_SIZE sizeof(struct direct)/根目錄大小#define DIR_MAXSIZE 1024/路徑最大長(zhǎng)度為KB#define MSD 5/最大子目錄數(shù)#define MOFN 5/最大文件深度為#define MAX_WRITE 1024*128/最大寫(xiě)入文字長(zhǎng)度KB struct fatitem /* size 8*/ int item; /*存放文件下一個(gè)磁盤(pán)的指針*/ char em_disk; /*磁盤(pán)塊是否空閑標(biāo)志位0 空閑*/ ;

13、struct direct /*-文件控制快信息-*/ struct FCB char name9; /*文件/目錄名8位*/ char property; /*屬性1位目錄0位普通文件*/ int size; /*文件/目錄字節(jié)數(shù)、盤(pán)塊數(shù))*/ int firstdisk; /*文件/目錄起始盤(pán)塊號(hào)*/ int next; /*子目錄起始盤(pán)塊號(hào)*/ int sign; /*1是根目錄0不是根目錄*/ directitemMSD+2; ; struct opentable struct openttableitem char name9; /*文件名*/ int firstdisk; /*起始

14、盤(pán)塊號(hào)*/ int size; /*文件的大小*/ openitemMOFN; int cur_size; /*當(dāng)前打文件的數(shù)目*/ ; struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目錄*/ struct direct *cur_dir; /*當(dāng)前目錄*/ struct opentable u_opentable; /*文件打開(kāi)表*/ int fd=-1; /*文件打開(kāi)表的序號(hào)*/ char *bufferdir; /*記錄當(dāng)前路徑的名稱(chēng)*/ char *fdisk; /*虛擬磁盤(pán)起始地址*/ void initfile(); v

15、oid format(); void enter(); void halt(); int create(char *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();

16、 void initfile() fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /*申請(qǐng)1M空間*/ format(); void format() int i; FILE *fp; fat = (struct fatitem *)(fdisk+DISKSIZE); /*計(jì)算FAT表地址,引導(dǎo)區(qū)向后偏移1k)*/ /*-初始化FAT表-*/ fat0.item=-1; /*引導(dǎo)塊*/ fat0.em_disk='1' for(i=1;i<ROOT_DISK_NO-1;i+) /*存放FAT表的磁盤(pán)塊號(hào)*/ fati.ite

17、m=i+1; fati.em_disk='1' fatROOT_DISK_NO.item=-1; /*存放根目錄的磁盤(pán)塊號(hào)*/ 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->directi

18、tem0.sign = 1; root->directitem0.firstdisk = ROOT_DISK_NO; strcpy(root->,"."); root->directitem0.next = root->directitem0.firstdisk; root->perty = '1' root->directitem0.size = ROOT_DISK_SIZE; /*-指向上一級(jí)目錄的目錄項(xiàng)-*/ root->directitem1.si

19、gn = 1; root->directitem1.firstdisk = ROOT_DISK_NO; strcpy(root->,"."); root->directitem1.next = root->directitem0.firstdisk; root->perty = '1' root->directitem1.size = ROOT_DISK_SIZE; if(fp = fopen("disk.dat","wb"

20、;)=NULL) printf("Error:n Cannot open file n"); return; 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-

21、>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) /*把虛擬磁盤(pán)空間保存到磁盤(pán)文件中*/ printf("Error:n File write error! n"); fclose(fp); void enter() FILE *fp; int i; fdisk = (char

22、 *)malloc(MEM_D_SIZE*sizeof(char); /*申請(qǐng)1M空間*/ if(fp=fopen("disk.dat","rb")=NULL) printf("Error:nCannot open filen"); return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /*把磁盤(pán)文件disk.dat 讀入虛擬磁盤(pán)空間(內(nèi)存)*/ printf("Error:nCannot read filen"); exit(0); fat = (struct fatitem *)(f

23、disk+DISKSIZE); /*找到FAT表地址*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目錄地址*/ fclose(fp); /*-初始化用戶(hù)打開(kāi)表-*/ for(i=0;i<MOFN;i+) strcpy(u_,""); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size = 0; cur_dir = root;

24、/*當(dāng)前目錄為根目錄*/ bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char); strcpy(bufferdir,"Root:"); void halt() FILE *fp; int i; if(fp=fopen("disk.dat","wb")=NULL) printf("Error:nCannot open filen"); return; if(!fwrite(fdisk,MEM_D_SIZE,1,fp) /*把虛擬磁盤(pán)空間(內(nèi)存)內(nèi)容讀入磁盤(pán)文件disk

25、.dat */ 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); for(j=2;j<MSD+2;j+) /*檢查創(chuàng)建文件是否與已存在的文件重名*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*文件已

26、經(jīng)存在*/ return(-4); for(i=2;i<MSD+2;i+) /*找到第一個(gè)空閑子目錄*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*無(wú)空目錄項(xiàng)*/ return(-2); if(u_opentable.cur_size>=MOFN) /*打開(kāi)文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*找到空閑盤(pán)塊j 后退出*/ if(fatj.em_disk='0') break; if(j>=D

27、ISK_NUM) return(-5); fatj.em_disk = '1' /*將空閑塊置為已經(jīng)分配*/ /*-填寫(xiě)目錄項(xiàng)-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk = j; cur_dir->directitemi.size = 0; cur_dir->directitemi.next = j; cur_dir->perty = '0' /*-*/ fd = open(name); retur

28、n 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='1')return(-4); /*-文件是否打開(kāi)-*/ for(j=0;j<MOFN;j+) if(!strcmp(u_,na

29、me) break; if(j<MOFN) /*文件已經(jīng)打開(kāi)*/ return(-2); if(u_opentable.cur_size>=MOFN) /*文件打開(kāi)太多*/ return(-3); /*-查找一個(gè)空閑用戶(hù)打開(kāi)表項(xiàng)-*/ for(j=0;j<MOFN;j+) if(u_opentable.openitemj.firstdisk=-1) break; /*-填寫(xiě)表項(xiàng)的相關(guān)信息-*/ u_opentable.openitemj.firstdisk = cur_dir->directitemi.firstdisk; strcpy(u_opentable.open

30、,name); u_opentable.openitemj.size = cur_dir->directitemi.size; u_opentable.cur_size+; /*-返回用戶(hù)打開(kāi)表表項(xiàng)的序號(hào)-*/ return(j); int close(char *name) int i; for(i=0;i<MOFN;i+) if(!strcmp(u_,name) break; if(i>=MOFN) return(-1); /*-清空該文件的用戶(hù)打開(kāi)表項(xiàng)的內(nèi)容-*/ strcpy(u_opentable.

31、,""); 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; /*-用$ 字符作為空格# 字符作為換行符-*/ char Space = 32; char Endter= 'n'

32、; for(i=0;i<len;i+) if(bufi = '$') bufi = Space; else if(bufi = '#') bufi = Endter; /*-讀取用戶(hù)打開(kāi)表對(duì)應(yīng)表項(xiàng)第一個(gè)盤(pán)塊號(hào)-*/ item = u_opentable.openitemfd.firstdisk; /*-找到當(dāng)前目錄所對(duì)應(yīng)表項(xiàng)的序號(hào)-*/ for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk=item) break; temp = i; /*-存放當(dāng)前目錄項(xiàng)的下標(biāo)-*/ /*-找到的item

33、是該文件的最后一塊磁盤(pán)塊-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找該文件的下一盤(pán)塊-*/ /*-計(jì)算出該文件的最末地址-*/ first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE; /*-如果最后磁盤(pán)塊剩余的大小大于要寫(xiě)入的文件的大小-*/ if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE>len) strcpy(first,buf); u_opentable.openitemfd.size = u_o

34、pentable.openitemfd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; else for(i=0;i<(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE);i+) /*寫(xiě)一部分內(nèi)容到最后一塊磁盤(pán)塊的剩余空間(字節(jié))*/ firsti = buf i; /*-計(jì)算分配完最后一塊磁盤(pán)的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲(chǔ)-*/ ilen1 = len-(DISKSIZE-u_opentable.openitemfd.si

35、ze%DISKSIZE); ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = ilen2+1; /*-還需要多少塊磁盤(pán)塊-*/ for(j=0;j<ilen2;j+) for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+)/*尋找空閑磁盤(pán)塊*/ if(fati.em_disk='0') break; if(i>=DISK_NUM) /*-如果磁盤(pán)塊已經(jīng)分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*-找

36、到的那塊空閑磁盤(pán)塊的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一塊-*/ for(k=0;k<len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+) firstk = bufk; else/*-如果不是要最后分配的一塊-*/ for(k=0;k<DISKSIZE;k+) firstk =bufk; fatitem.item = i; /*-找到一塊后將它的序號(hào)存放在上一塊的指針中-*/ fati.em_disk = '1' /*-置找到的磁盤(pán)快的空閑標(biāo)志位為已分配

37、-*/ fati.item = -1; /*-它的指針為-1 (即沒(méi)有下一塊)-*/ /*-修改長(zhǎng)度-*/ u_opentable.openitemfd.size = u_opentable.openitemfd.size+len; cur_dir->directitemtemp.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 il

38、en1, modlen; item = u_opentable.openitemfd.firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*-計(jì)算文件所占磁盤(pán)的塊數(shù)-*/ first = fdisk+item*DISKSIZE; /*-計(jì)算文件的起始位置-*/ for(i=0;i<ilen1;i+) if(i=ilen1-1) /*-如果在最后一個(gè)磁盤(pán)塊-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = fir

39、stj; else /*-不在最后一塊磁盤(pán)塊-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盤(pán)塊-*/ first = fdisk+item*DISKSIZE; return 0; int del(char *name) int i,cur_item,item,temp; for(i=2;i<MSD+2;i+) /*-查找要?jiǎng)h除文件是否在當(dāng)前目錄中-*/ if(!strcmp(cur_dir->,name) break;

40、 cur_item = i; /*-用來(lái)保存目錄項(xiàng)的序號(hào),供釋放目錄中-*/ if(i>=MSD+2) /*-如果不在當(dāng)前目錄中-*/ return(-1); if(cur_dir->directitemcur_perty!='0') /*-如果刪除的(不)是目錄-*/ return(-3); for(i=0;i<MOFN;i+) /*-如果文件打開(kāi),則不能刪除,退出-*/ if(!strcmp(u_,name) return(-2); item = cur_dir->directitemc

41、ur_item.firstdisk;/*-該文件的起始盤(pán)塊號(hào)-*/ while(item!=-1) /*-釋放空間,將FAT表對(duì)應(yīng)項(xiàng)進(jìn)行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = '0' item = temp; /*-釋放目錄項(xiàng)-*/ cur_dir->directitemcur_item.sign = 0; cur_dir->directitemcur_item.firstdisk = -1; strcpy(u_opentable.openitemcur_,&q

42、uot;"); 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,".") return(-4

43、); if(strlen(name)>8) /*-如果目錄名長(zhǎng)度大于8位-*/ return(-1); for(i=2;i<MSD+2;i+) /*-如果有空閑目錄項(xiàng)退出-*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*-目錄/文件已滿(mǎn)-*/ return(-2); for(j=2;j<MSD+2;j+) /*-判斷是否有重名-*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*-如果有重名-*

44、/ return(-3); for(j=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*-找到空閑磁盤(pán)塊j 后退出-*/ if(fatj.em_disk='0') break; if(j>=DISK_NUM) return(-5); fatj.em_disk='1' /*-將該空閑塊設(shè)置為已分配-*/ /*-填寫(xiě)目錄項(xiàng)-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk=j; cur_dir->directitemi.si

45、ze=ROOT_DISK_SIZE; cur_dir->directitemi.next=j; cur_dir->perty='1' /*-所創(chuàng)目錄在虛擬磁盤(pán)上的地址(內(nèi)存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir->directitemi.firstdisk*DISKSIZE); /*-初始化目錄-*/ /*-指向當(dāng)前目錄的目錄項(xiàng)-*/ cur_mkdir->directitem0.sign=0; cur_mkdir->directitem0.firstdis

46、k=cur_dir->directitemi.firstdisk; strcpy(cur_mkdir->,"."); cur_mkdir->directitem0.next=cur_mkdir->directitem0.firstdisk; cur_mkdir->perty='1' cur_mkdir->directitem0.size=ROOT_DISK_SIZE; /*-指向上一級(jí)目錄的目錄項(xiàng)-*/ cur_mkdir->directitem1.sig

47、n=cur_dir->directitem0.sign;cur_mkdir->directitem1.firstdisk=cur_dir->directitem0.firstdisk; strcpy(cur_mkdir->,"."); cur_mkdir->directitem1.next=cur_mkdir->directitem1.firstdisk; cur_mkdir->perty='1' cur_mkdir->directitem1.siz

48、e=ROOT_DISK_SIZE; for(i=2;i<MSD+2;i+) /*-子目錄都初始化為空-*/ cur_mkdir->directitemi.sign=0; cur_mkdir->directitemi.firstdisk=-1; strcpy(cur_mkdir->,""); cur_mkdir->directitemi.next=-1; cur_mkdir->perty='0' cur_mkdir->directitemi.size=0;

49、return 0; int rmdir(char *name) int i,j,item; struct direct *temp_dir; /*-檢查當(dāng)前目錄項(xiàng)中有無(wú)該目錄-*/ for(i=2;i<MSD+2;i+) if(!strcmp(cur_dir->,name) break; if(i>=MSD+2) /*-沒(méi)有這個(gè)文件或目錄-*/ return(-1);if(cur_dir->perty!='1')/*-刪除的不是目錄-*/ return(-3); /*-判斷要?jiǎng)h除的目錄有無(wú)子目錄-*/ 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) /*-有子目錄或文件-*/ return(-2); /*-找到起始盤(pán)塊號(hào),并將其釋放-*/ item=cur_dir->directitemi.firstdisk

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論