虛擬文件系統(tǒng)_第1頁(yè)
虛擬文件系統(tǒng)_第2頁(yè)
虛擬文件系統(tǒng)_第3頁(yè)
虛擬文件系統(tǒng)_第4頁(yè)
虛擬文件系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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、虛擬文件系統(tǒng)學(xué)生課程設(shè)計(jì)報(bào)告 2014 2015 學(xué)年 第 二 學(xué)期學(xué) 院 XXXXXXXXX 專(zhuān) 業(yè) 軟件工程 學(xué) 號(hào) 姓 名 指導(dǎo)教師 起 止 周周數(shù)1實(shí)習(xí)地點(diǎn)課程設(shè)計(jì)目的:1、 理解文件系統(tǒng)功能2、 完成對(duì)文件、目錄及磁盤(pán)空間的管理并提供操作命令3、 實(shí)現(xiàn)文件共享與保護(hù)課程設(shè)計(jì)要求:1、利用索引結(jié)點(diǎn)實(shí)現(xiàn)目錄管理。2、建立一個(gè)樹(shù)形目錄系統(tǒng),目錄文件及索引結(jié)點(diǎn)均用結(jié)構(gòu)數(shù)組表示。3、文件盤(pán)塊采用FAT方式,空指針用-1表示,并設(shè)空閑盤(pán)塊指針。4、提供對(duì)文件、目錄及磁盤(pán)空間的操作命令。進(jìn)度安排及主要內(nèi)容:第一周:完成用戶(hù)登錄,目錄管理和文件管理第二周:成績(jī):指導(dǎo)教師(簽字)年 月 日一、概述1.

2、1 本文的目的本文內(nèi)容用于指導(dǎo)學(xué)生對(duì)課程設(shè)計(jì)報(bào)告的格式和內(nèi)容安排進(jìn)行控制。學(xué)生在使用時(shí),可直接用格式刷將本文對(duì)應(yīng)部分的格式內(nèi)容進(jìn)行提取并加載到目標(biāo)位置;對(duì)于封面、頁(yè)眉等部分,請(qǐng)直接修改相關(guān)文字。二、需求分析本次要實(shí)現(xiàn)虛擬文件系統(tǒng),主要功能有用戶(hù)登錄、子目錄的創(chuàng)建、刪除、子目錄中項(xiàng)的顯示;文件的創(chuàng)建、打開(kāi)、刪除、關(guān)閉、對(duì)文件進(jìn)行讀寫(xiě)等。實(shí)現(xiàn)對(duì)目錄和文件的基本操作和文件的共享與保護(hù)。三、技術(shù)方案本次課程設(shè)計(jì)用VS2013編寫(xiě)C+控制臺(tái)程序模擬文件系統(tǒng)。系統(tǒng)初始時(shí)需要登錄,登錄成功方能對(duì)文件進(jìn)行操作。本虛擬文件系統(tǒng)采用兩級(jí)目錄,第一級(jí)目錄對(duì)應(yīng)用戶(hù)賬號(hào),第二級(jí)目錄對(duì)應(yīng)用戶(hù)下的文件。文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)包

3、括主目錄(虛擬C盤(pán))、子目錄及所含文件等。三者都存放在磁盤(pán)中,方便進(jìn)行操作。文件可以在目錄中進(jìn)行記錄,表明文件所在目錄。四、總體設(shè)計(jì)4.1功能設(shè)計(jì)1、首次運(yùn)行系統(tǒng)需要先格式化磁盤(pán)空間,申請(qǐng)一個(gè)內(nèi)存為1M的磁盤(pán)空間。2、用戶(hù)登錄,用戶(hù)需輸入正確的用戶(hù)名和密碼方能進(jìn)入本系統(tǒng)進(jìn)行文件和目錄的操作。3、進(jìn)入系統(tǒng)后可根據(jù)提示對(duì)文件和目錄進(jìn)行操作。4.2虛擬文件系統(tǒng)算法流程圖 算法流程圖4-1五、詳細(xì)設(shè)計(jì)5.1系統(tǒng)功能說(shuō)明1、 創(chuàng)建子目錄:輸入createdir 目錄名,即進(jìn)行目錄創(chuàng)建操作,若當(dāng)前目錄已滿(mǎn)或文件名已經(jīng)存在則創(chuàng)建失敗,返回失敗信息。否則創(chuàng)建成功,并找到空閑磁盤(pán)塊,將該磁盤(pán)塊設(shè)為已分配,填寫(xiě)目

4、錄項(xiàng)。2、 刪除子目錄:removedir 目錄名,檢查當(dāng)前目錄項(xiàng)中有無(wú)該目錄,判斷要?jiǎng)h除的目錄有無(wú)子目錄,如果有子目錄將其釋放,進(jìn)行刪除操作。3、 更改當(dāng)前目錄:cd 目錄名,可以進(jìn)入到子目錄并回退上級(jí)目錄。4、 顯示目錄中項(xiàng):showdir可以顯示目錄和文件,文件顯示大小,目錄顯示目錄。5、 文件操作:創(chuàng)建文件、打開(kāi)文件(創(chuàng)建時(shí)自動(dòng)打開(kāi)該文件),刪除文件,關(guān)閉文件、讀文件、寫(xiě)文件、6、 退出5.2數(shù)據(jù)結(jié)構(gòu)struct direct/*文件控制快信息*/struct FCBchar name9; /文件/目錄名8位char property; /屬性1位目錄0位普通文件int size; /

5、文件/目錄字節(jié)數(shù)、盤(pán)塊數(shù))int firstdisk; /文件/目錄起始盤(pán)塊號(hào)int next; /子目錄起始盤(pán)塊號(hào)int sign; /1是根目錄0不是根目錄directitemMSD + 2;/*size 8*/struct fatitemint item; /存放文件下一個(gè)磁盤(pán)的指針char em_disk; /磁盤(pán)塊是否空閑標(biāo)志位0 空閑;struct opentablestruct openttableitemchar name9; /文件名int firstdisk; /起始盤(pán)塊號(hào)int size; /文件的大小openitemMOFN;int cur_size; /當(dāng)前打文件的數(shù)

6、目;struct fatitem *fat; /FAT表struct direct *root; /根目錄struct direct *cur_dir; /當(dāng)前目錄struct opentable u_opentable; /文件打開(kāi)表5.3方法函數(shù)void initfile();void format();void enter();void init();int create(char *name);int open(char *name);int close(char *name);int write(int fd, char *buf, int len);int read(int fd,

7、 char *buf);int del(char *name);int createdir(char *name);int removedir(char *name);void showdir();int cd(char *name);void print();void show();void login();5.4全局變量#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 fati

8、tem)/FAT表大小#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 6/最大子目錄數(shù)#define MOFN 4/最大文件深度為#define MAX_WRITE 1024*128/最大寫(xiě)入文字長(zhǎng)度KB char *username = (char *)malloc(sizeof(char) * 100);char *password = (char *)

9、malloc(sizeof(char) * 100);六、軟件測(cè)試6.1格式化磁盤(pán)空間測(cè)試6.2用戶(hù)登錄測(cè)試6.3創(chuàng)建子目錄測(cè)試6.4進(jìn)入子目錄測(cè)試6.5創(chuàng)建文件測(cè)試6.6寫(xiě)入文件測(cè)試6.7讀文件測(cè)試6.8返回上級(jí)目錄測(cè)試6.9顯示目錄中項(xiàng)測(cè)試6.10讀寫(xiě)權(quán)限測(cè)試七、總結(jié)本次課程設(shè)計(jì)我初步完成了虛擬文件系統(tǒng)的目錄管理和文件管理。讓我對(duì)于文件系統(tǒng)有了深層次的理解和掌握,通過(guò)自己編寫(xiě)程序逐步提高自己的編程能力,并從中體會(huì)到了很多樂(lè)趣和知識(shí)。同時(shí)讓我對(duì)C語(yǔ)言中的指針有了一個(gè)更深的了解。由于以前對(duì)于C+知識(shí)沒(méi)有掌握牢固,使我在編程中出現(xiàn)了很多錯(cuò)誤。費(fèi)了很多時(shí)間,但是我通過(guò)不斷學(xué)習(xí)也提高了很多,對(duì)一些細(xì)

10、節(jié)的結(jié)構(gòu)體等也有了一個(gè)更深的理解。這次課程設(shè)計(jì)讓我進(jìn)行了以前課堂很少有的實(shí)踐訓(xùn)練,雖然掌握的知識(shí)有限,但是這次經(jīng)歷讓我提高了編程能力和編程思想,使我受益匪淺。附錄1參考文獻(xiàn)1 譚浩強(qiáng),C+程序設(shè)計(jì)(第2版)清華大學(xué)出版社,2012.2 湯小丹、梁紅兵、哲鳳屏,計(jì)算機(jī)操作系統(tǒng)西安電子科技大學(xué)出版社,2014. 3 嚴(yán)蔚敏數(shù)據(jù)結(jié)構(gòu)清華大學(xué)出版社.,2007附錄2源碼/ kcsj001.cpp : Defines the entry point for the console application./#include "stdafx.h"#include<stdio.h&

11、gt; #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表大小#define ROOT_DISK_NO FATSIZE/DISKSIZE+1/根目錄起始盤(pán)塊號(hào)#define ROOT_DISK_SIZE sizeof(struct direct)/根目錄大小

12、#define DIR_MAXSIZE 1024/路徑最大長(zhǎng)度為KB#define MSD 6/最大子目錄數(shù)#define MOFN 4/最大文件深度為#define MAX_WRITE 1024*128/最大寫(xiě)入文字長(zhǎng)度KB char *username = (char *)malloc(sizeof(char) * 100);char *password = (char *)malloc(sizeof(char) * 100);struct direct/*文件控制快信息*/struct FCBchar name9; /文件/目錄名8位char property; /屬性1位目錄0位普通文

13、件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;/*size 8*/struct fatitemint item; /存放文件下一個(gè)磁盤(pán)的指針char em_disk; /磁盤(pán)塊是否空閑標(biāo)志位0 空閑;struct opentablestruct openttableitemchar name9; /文件名int firstdisk; /起始盤(pán)塊號(hào)int size; /文件的大小openitemMOFN;int cur_si

14、ze; /當(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();void format();void enter();void halt();int create(char *name);int open(char *name);

15、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 login();main()FILE *fp;char ch;char a100;char code1110;char name10;int i, flag, r_size;c

16、har *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char);if (fp = fopen("disk.dat", "rb") = NULL)printf("您還沒(méi)有格式化,是否格式化?(y/n)");scanf("%c", &ch);if (ch = 'y')initfile();printf("格式化成功! n");elsereturn 0;printf("您還未登錄,請(qǐng)先登錄! n");

17、GotoTest:login();if (strcmp(username, "readonly") != 0 | strcmp(password, "1234") != 0)&& (strcmp(username, "root") != 0 | strcmp(password, "root") != 0) && (strcmp(username, "nopower") != 0 | strcmp(password, "1234") != 0)p

18、rintf("登錄失敗,請(qǐng)重新登錄! n");goto GotoTest;printf("登錄成功! n");enter();print();show();strcpy(code0, "exit");strcpy(code1, "create");strcpy(code2, "open");strcpy(code3, "close");strcpy(code4, "write");strcpy(code5, "read");strcpy

19、(code6, "del");strcpy(code7, "createdir");strcpy(code8, "removedir");strcpy(code9, "showdir");strcpy(code10, "cd");while (1)scanf("%s", a);for (i = 0; i<11; i+)if (!strcmp(codei, a)break;switch (i)case 0: /退出文件系統(tǒng)free(contect);halt();retu

20、rn 0;case 1: /創(chuàng)建文件scanf("%s", name);flag = create(name);if (flag = -1)printf("Error: n 長(zhǎng)度太長(zhǎng) !n");else if (flag = -2)printf("Error: n 子目錄已滿(mǎn) !n");else if (flag = -3)printf("Error: n 打開(kāi)文件次數(shù)過(guò)多 !n");else if (flag = -4)printf("Error: n 名字已經(jīng)在子目錄中 !n");else

21、if (flag = -5)printf("Error: n 磁盤(pán)空間已滿(mǎn)!n");elseprintf("創(chuàng)建文件成功! n");show();break;case 2:/打開(kāi)文件scanf("%s", name);fd = open(name);if (fd = -1)printf("Error: n 打開(kāi)的文件不存在! n");else if (fd = -2)printf("Error: n 文件已經(jīng)打開(kāi)! n");else if (fd = -3)printf("Error:

22、 n 打開(kāi)文件次數(shù)過(guò)多! n");else if (fd = -4)printf("Error: n 這是一個(gè)子目錄,不能打開(kāi)進(jìn)行讀寫(xiě)! n");elseprintf("打開(kāi)成功! n");show();break;case 3:/關(guān)閉文件scanf("%s", name);flag = close(name);if (flag = -1)printf("Error:n 文件沒(méi)有打開(kāi) ! n");elseprintf("關(guān)閉成功! n");show();break;case 4:/寫(xiě)文

23、件if (fd = -1)printf("Error:n文件沒(méi)有打開(kāi) ! n");elseif (strcmp(username, "readonly") != 0 && strcmp(username, "nopower") != 0)printf("請(qǐng)輸入文件內(nèi)容:");scanf("%s", contect);flag = write(fd, contect, strlen(contect);if (flag = 0)printf("寫(xiě)入成功! n");

24、elseprintf("Error:n 磁盤(pán)大小沒(méi)滿(mǎn)! n");elseprintf("您沒(méi)有寫(xiě)入權(quán)限!n");show();break;case 5:/讀文件if (fd = -1)printf("Error:n 文件沒(méi)有打開(kāi) ! n");elseif (strcmp(username, "nopower") != 0)flag = read(fd, contect);if (flag = 0)for (i = 0; i<u_opentable.openitemfd.size; i+)printf(&quo

25、t;%c", contecti);printf("tn");elseprintf("您沒(méi)有讀取權(quán)限!n");show();break;case 6:/刪除文件scanf("%s", name);flag = del(name);if (flag = -1)printf("Error:n 文件不存在! n");else if (flag = -2)printf("Error:n 文件已經(jīng)打開(kāi),請(qǐng)先關(guān)閉它 ! n");else if (flag = -3)printf("Erro

26、r:n 刪除的不是文件 ! n");elseprintf("刪除成功! n");show();break;case 7:/創(chuàng)建子目錄scanf("%s", name);flag = mkdir(name);if (flag = -1)printf("Error:n 名稱(chēng)長(zhǎng)度太長(zhǎng)! n");else if (flag = -2)printf("Error:n 子目錄已滿(mǎn) ! n");else if (flag = -3)printf("Error:n 名稱(chēng)已在子目錄中 ! n");els

27、e if (flag = -4)printf("Error: n '.' 或 '.' 不能作為子目錄名稱(chēng)!n");else if (flag = -5)printf("Error: n 磁盤(pán)空間已滿(mǎn)!n");else if (flag = 0)printf("創(chuàng)建子目錄成功! n");show();break;case 8:/刪除子目錄scanf("%s", name);flag = rmdir(name);if (flag = -1)printf("Error:n 子目錄

28、不存在! n");else if (flag = -2)printf("Error:n子目錄中含有子目錄,請(qǐng)刪除子目錄中的子目錄!n");else if (flag = -3)printf("Error:n 刪除的不是子目錄 ! n");else if (flag = 0)printf("刪除子目錄成功! n");show();break;case 9:/顯示當(dāng)前子目錄dir();show();break;case 10:/更改當(dāng)前目錄scanf("%s", name);flag = cd(name);i

29、f (flag = -1)printf("Error:n 路徑不正確!n");else if (flag = -2)printf("Error:n打開(kāi)的不是子目錄!n");show();break;default:printf("n Error!n 命令錯(cuò)誤! n");show();void login()printf("請(qǐng)輸入用戶(hù)名:n");scanf("%s", username);printf("請(qǐng)輸入密碼:n");scanf("%s", passw

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

31、O.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_DISK_NO;strcpy(root->, &

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

33、->directitem1.next = root->directitem0.firstdisk;root->perty = '1'root->directitem1.size = ROOT_DISK_SIZE;if (fp = fopen("disk.dat", "wb") = NULL)printf("Error:n 不能打開(kāi)文件 n");return;for (i = 2; i<MSD + 2; i+) /子目錄初始化為空root->directi

34、temi.sign = 0;root->directitemi.firstdisk = -1;strcpy(root->, "");root->directitemi.next = -1;root->perty = '0'root->directitemi.size = 0;if (fp = fopen("disk.dat", "wb") = NULL)printf("Error:n 不能打開(kāi)文件 n");r

35、eturn;if (fwrite(fdisk, MEM_D_SIZE, 1, fp) != 1) /把虛擬磁盤(pán)空間保存到磁盤(pán)文件中printf("Error:n 文件寫(xiě)入出錯(cuò)! n");fclose(fp);void initfile()fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /申請(qǐng)1M空間format();printf("install.n");void enter()FILE *fp;int i;fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /申

36、請(qǐng)1M空間if (fp = fopen("disk.dat", "rb") = NULL)printf("Error:n不能打開(kāi)文件n");return;if (!fread(fdisk, MEM_D_SIZE, 1, fp) /把磁盤(pán)文件disk.dat 讀入虛擬磁盤(pán)空間(內(nèi)存)printf("Error:n不能讀取文件n");exit(0);fat = (struct fatitem *)(fdisk + DISKSIZE); /找到FAT表地址root = (struct direct *)(fdisk +

37、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; /當(dāng)前目錄為根目錄bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char);strc

38、py(bufferdir, "C:Usersbenchao");void halt()FILE *fp;int i;if (fp = fopen("disk.dat", "wb") = NULL)printf("Error:n不能打開(kāi)文件n");return;if (!fwrite(fdisk, MEM_D_SIZE, 1, fp) /把虛擬磁盤(pán)空間(內(nèi)存)內(nèi)容讀入磁盤(pán)文件disk.datprintf("Error:n文件寫(xiě)入出錯(cuò)!n");fclose(fp);free(fdisk);free(

39、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) /文件已經(jīng)存在return(-4);for (i = 2; i<MSD + 2; i+) /找到第一個(gè)空閑子目錄if (cur_dir->directitemi.fir

40、stdisk = -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 >= DISK_NUM)return(-5);fatj.em_disk = '1' /將空閑塊置為已經(jīng)分配/*填寫(xiě)目錄項(xiàng)*/strcpy(cur_dir-

41、>, name);cur_dir->directitemi.firstdisk = j;cur_dir->directitemi.size = 0;cur_dir->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->directi

42、, 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_, name)break;if (j<MOFN) /文件已經(jīng)打開(kāi)return(-2);if (u_opentable.cur_size >= MOFN) /*文件打開(kāi)太多*/return(-3);/查

43、找一個(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_, name);u_opentable.openitemj.size = cur_dir->directitemi.size;u_opentable.cur_size+;/返回用戶(hù)打開(kāi)表表項(xiàng)的序號(hào)retu

44、rn(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_, "");u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.size = 0;u_opentable.cur_size-;return

45、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'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.o

46、penitemfd.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 是該文件的最后一塊磁盤(pán)塊while (fatitem.item != -1)item = fatitem.item; /查找該文件的下一盤(pán)塊/計(jì)算出該文件的最末地址first = fdisk + item*DISKSIZE + u_opentable.openitemfd.size%DISKSIZE;/如果最

47、后磁盤(pán)塊剩余的大小大于要寫(xiě)入的文件的大小if (DISKSIZE - u_opentable.openitemfd.size%DISKSIZE>len)strcpy(first, buf);u_opentable.openitemfd.size = u_opentable.openitemfd.size + len;cur_dir->directitemtemp.size = cur_dir->directitemtemp.size + len;elsefor (i = 0; i<(DISKSIZE - u_opentable.openitemfd.size%DISKS

48、IZE); i+)/寫(xiě)一部分內(nèi)容到最后一塊磁盤(pán)塊的剩余空間(字節(jié))firsti = bufi;/計(jì)算分配完最后一塊磁盤(pán)的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲(chǔ)ilen1 = len - (DISKSIZE - u_opentable.openitemfd.size%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

49、_NUM; i+)/尋找空閑磁盤(pán)塊if (fati.em_disk = '0')break;if (i >= DISK_NUM) /如果磁盤(pán)塊已經(jīng)分配完了return(-1);first = fdisk + i*DISKSIZE; /找到的那塊空閑磁盤(pán)塊的起始地址if (j = ilen2 - 1) /如果是最后要分配的一塊for (k = 0; k<len - (DISKSIZE - u_opentable.openitemfd.size%DISKSIZE) - j*DISKSIZE; k+)firstk = bufk;else/如果不是要最后分配的一塊for (

50、k = 0; k<DISKSIZE; k+)firstk = bufk;fatitem.item = i; /找到一塊后將它的序號(hào)存放在上一塊的指針中fati.em_disk = '1' /置找到的磁盤(pán)快的空閑標(biāo)志位為已分配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 ilen1, modlen;item = u_opentable.openitemfd.firstdisk;ilen1 = len / DISKSIZE;modlen = len%DISKSIZE;if (modlen != 0)ilen1

溫馨提示

  • 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)論