二級文件管理課程設(shè)計(jì)

上傳人:燈火****19 文檔編號:20559445 上傳時間:2021-03-29 格式:DOC 頁數(shù):17 大小:70KB
收藏 版權(quán)申訴 舉報 下載
二級文件管理課程設(shè)計(jì)_第1頁
第1頁 / 共17頁
二級文件管理課程設(shè)計(jì)_第2頁
第2頁 / 共17頁
二級文件管理課程設(shè)計(jì)_第3頁
第3頁 / 共17頁

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

15 積分

下載資源

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

資源描述:

《二級文件管理課程設(shè)計(jì)》由會員分享,可在線閱讀,更多相關(guān)《二級文件管理課程設(shè)計(jì)(17頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、 操作系統(tǒng)二級文件管理課程設(shè)計(jì) 課程設(shè)計(jì)名稱: 二級文件管理系統(tǒng) 專 業(yè)班 級 : 學(xué) 生姓 名 : 學(xué) 號 指 導(dǎo) 老 師 : 一、 設(shè)計(jì)目的 通過一個簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)。 二、設(shè)計(jì)內(nèi)容 為linux系統(tǒng)設(shè)計(jì)一個簡單的二級文件系統(tǒng)。要求做到以下幾點(diǎn): (1)可以實(shí)現(xiàn)下列幾條命令(至少4條); l

2、ogin 用戶登陸 dir 列文件目錄 create 創(chuàng)建文件 delete 刪除文件 open 打開文件 close 關(guān)閉文件 read 讀文件 write 寫文件 rename 重命名 (2)列目錄時要列出文件名、物理地址、保護(hù)碼和文件長度; (3)源文件可以進(jìn)行讀寫保護(hù)。 三、程序設(shè)計(jì) 1、在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實(shí)現(xiàn)一個多用戶多目錄的文件系統(tǒng)。 2、文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。 3、磁盤空閑空間的管理可選擇位示

3、圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位示圖合并到FAT中。 4、文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項(xiàng)包含文件名、物理地址、長度等信息,還可以通過目錄項(xiàng)實(shí)現(xiàn)對文件的讀和寫的保護(hù)。 5、設(shè)計(jì)一個較實(shí)用的用戶界面,方便用戶使用。要求提供以下相關(guān)文件操作:用戶登錄、創(chuàng)建目錄、刪除目錄、創(chuàng)建文件、刪除文件、讀文件、寫文件、 重命名、退出。 四、源代碼 1、FileSystem.h #define DIR_LENGTH 1024 //路徑最長可達(dá)100字節(jié) #define MAX

4、_WRITE 1024*128 //寫入文字可達(dá)128k字節(jié) #define MEM_D_SIZE 1024*1024 //1M磁盤空間 #define DISKSIZE 1024 //磁盤塊的大小 1K #define MSD 5 //最大子目錄數(shù) 5 #define DISK_NUM MEM_D_SIZE/DISKSIZE

5、//磁盤塊數(shù)目 1024=1M/1K #define FATSIZE DISK_NUM*sizeof(struct FatItem) //FAT表大小1024*8=8K #define MOFN 5 //最大文件打開數(shù) 5 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號 9 #define ROOT_DISK_SIZE sizeof(struct Direct) //根目錄大小 196 #define LOGI

6、N 15 #define NAME_LONG 1 #define NOT_EXSIT -1 #define NOT_OPEN -1 #define DIR_FULL -2 #define OPEN_FULL -3 #define ALREADY -4 #define NOT_R_W -4 #define DISK_FULL -5 #define NOT_EXIT -1 struct FatItem // size 8 { int item;

7、 //存放文件下一個磁盤的指針 char em_disk; //磁盤塊是否空閑標(biāo)志位, 0 空閑 }; struct Direct { struct FCB { char name[8]; //文件/目錄名 8位 char property; //屬性 1位目錄 0位普通文件 int size;

8、//文件/目錄字節(jié)數(shù)、盤塊數(shù)) int firstDisk; //文件/目錄 起始盤塊號 int next; //子目錄起始盤塊號 int sign; //1是根目錄 0不是根目錄 }directItem[MSD+2]; //最大子目錄 5 }; struct OpenTable {

9、 struct OpenTableItem { char name[9]; //文件名 int firstdisk; //起始盤塊號 int size; //文件的大小 char open_flag; //文件打開標(biāo)志:1:打開。0:未打開 }openitem[MOFN];

10、 //最大文件打開數(shù) 5 int cur_size; //當(dāng)前打文件的數(shù)目 }; struct FatItem *fat; //FAT表 struct Direct *root; //根目錄 struct Direct *cur_dir; //當(dāng)前目錄 struct OpenTable user_op

11、enTable; //文件打開表 int fd=-1; //文件打開表的序號 char *bufferdir; //記錄當(dāng)前路徑的名稱 char *fdisk; //虛擬磁盤起始地址 int cur_user; int find_N = 0; void init(); void format(); voi

12、d enter(); void assign(); int create(char *name); int open(char *name); int close(char *name); int rename(); int write(int fd,char *buf,int len,char *name); int read(int fd,char *buf,char *name); int del(char *name); void dir(); int login(); void helpMenu(); void currentPath(); 2、FileSy

13、stem.cpp #include #include #include"conio.h" #include "FileSystem.h" #include int statue=0; char user[20]="li"; char password[20]="123"; int main() { FILE *fp; char ch; char cmd[13]; char name[10]; int i,flag; char *contect; helpMenu(); whil

14、e((flag=login())!=LOGIN) { printf("密碼不正確!\n"); printf("請輸入正確的用戶名和密碼!\n"); } contect = (char *)malloc(MAX_WRITE*sizeof(char)); if((fp=fopen("disk.bat","rb"))==NULL) //創(chuàng)建一個文件 { printf(" Will you initialize the disk? (y or n

15、)"); scanf("%s",&ch); if(ch==y) { init(); printf(" Initialize Succeed! \n");} else {return 0;} } enter(); //分析命令 while(1) { printf("%s/>",bufferdir); scanf("%s",cmd); if(strcmp(cmd,"help") == 0 || strcmp(cmd,"?") == 0) { helpMenu();} else if

16、(strcmp(cmd,"model") == 0) { printf("需要修改密碼么(y/n)"); scanf("%s",&ch); if (ch==y) { printf("請輸入密碼\b"); scanf("%s",&password); printf("修改成功");} else {printf("退出修改密碼\n"); } } else if(strcmp(cmd,"login") == 0) { while (login()!=LOGIN) { printf(

17、"請輸入正確的用戶名或密碼\n");} } else if(strcmp(cmd,"quit") == 0) { free(contect); exit(1); return 0; } else if(strcmp(cmd,"create") == 0) { scanf("%s",name); flag = create(name); //關(guān)于創(chuàng)建文件共實(shí)現(xiàn)四個判斷 if(flag==NAME_LONG) {//文件名太長 printf("Error: \n 文件的名稱

18、太長 !\n");} else if(flag==DIR_FULL) {//目錄下文件數(shù)超 printf("Error: \n 該目錄下的文件和目錄數(shù)已滿 !\n");} else if(flag==ALREADY) {//重名 printf("Error: \n 該目錄下已存在該文件 !\n");} else if(flag==DISK_FULL) {//磁盤空間滿 printf("Error: \n 磁盤空間已滿!\n");} else { printf(" 成功創(chuàng)建文件! \n"); }

19、 } else if(strcmp(cmd,"open") ==0) { statue=1; scanf("%s",name); fd = open(name); if(fd == NOT_EXSIT) { printf("Error: \n 所要打開的文件不存在! \n");} else {printf("打開成功! \n");} } else if(strcmp(cmd,"write") == 0) { statue=2; scanf("%s",name); i

20、f(fd == NOT_OPEN) { printf("Error:\n 該文件沒有打開,請打開后再寫入 \n"); } else { printf("請輸入文件的內(nèi)容: "); scanf("%s",contect); //connect為一個長度為128字節(jié)的變量值 flag=write(fd,contect,strlen(contect),name); if(flag == 0) //每個盤塊可寫入最多128字節(jié) { pri

21、ntf("已成功寫入! \n"); } else { printf("Error:\n 硬盤空間不足,無法寫入! \n"); } } } else if(strcmp(cmd,"read") == 0) { statue=3; scanf("%s",name); fd = open(name); if(fd == NOT_EXSIT) { printf("Error:\n 不存在該文件,不能讀! \n"); } else if (fd == NO

22、T_OPEN) { printf(" 該文件已經(jīng)打開! \n"); } else { flag = read(fd,contect,name); if(flag == 0) { for(i=0;i

23、 // if(gets(a)==NULL); } } } else if(strcmp(cmd,"delete") == 0) { scanf("%s",name); flag = del(name); if(flag == NOT_EXIT) { printf("Error:\n 該文件沒有退出,不能刪除! \n"); } else if(flag == -NOT_OPEN) { printf("Error:\n 該文件是打開的,請先關(guān)閉它,然后再刪除! \n");

24、 } else { printf("已成功刪除文件! \n"); } } else if(strcmp(cmd,"dir") ==0) { dir(); } else if(strcmp(cmd,"format") == 0) { format(); puts("format success!"); } else if(strcmp(cmd,"close") == 0) { statue=0; i

25、nt i; for(i=0;i=MOFN) printf("Error:\n 該文件沒有打開,無需關(guān)閉!\n"); else { //清空該文件的用戶打開表項(xiàng) strcpy(user_openTable.openitem[i].name,""); user_

26、openTable.openitem[i].firstdisk = -1; user_openTable.openitem[i].size = 0; user_openTable.openitem[i].open_flag = 0; user_openTable.cur_size--; printf("%s","close success!\n"); continue; } } else if (strcmp(cmd,"rename") == 0) { if (statue>=1) {

27、 printf("打開文件不能重命名"); } else{ printf("%d",statue); flag=rename(); if (flag==NOT_EXIT) { printf("文件不存在\n"); } } } else{ printf("\n 指令錯誤! \n"); } } } int login() { char inuser[20]; char inpassword[20]; char ch; int

28、j=0; printf("請輸入用戶名\n"); scanf("%s",inuser); while((strcmp(inuser,user)!=0)) { printf("該用戶不存在!\n"); printf("***************\n"); printf("請輸入正確的用戶名:\n"); scanf("%s",inuser); } printf("請輸入密碼\n"); while((ch=getch())!=13) //將輸入的密碼轉(zhuǎn)換成字符**** { putchar(*); inpa

29、ssword[j]=ch; j++; } inpassword[j]=\0; //字符數(shù)組的最后一位為\0,故要加該語句 //printf("您輸入的密碼是:%s",inpassword); printf("\n"); getchar(); if ((strcmp(inuser,user)==0)&&(strcmp(inpassword,password)==0)) { bufferdir="wang"; return LOGIN; } else { return 0; }

30、} void init() { fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //分配空間 format(); } void format() { int i; FILE *fp; fat = (struct FatItem *)(fdisk+DISKSIZE); //FAT 1M

31、 /*-----初始化FAT表 fat[1]---fat[7]------------*/ for(i=1;i

32、 for(i=ROOT_DISK_NO;i

33、即表示還沒有使用 fat[i].em_disk = 0; } root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); //根目錄的地址 1k+8k root->directItem[0].sign = 1; //根目錄 root->directItem[0].firstDisk = ROOT_DISK_NO ; // = 9; //第9個盤塊開始 strcpy(root->directItem[0].name,".");

34、 //定義其文件名為 . root->directItem[0].next = root->directItem[0].firstDisk; //子目錄的起始盤塊是根目錄所在第一個盤塊,即未出 //第一塊 root->directItem[0].property = 1; //1根目錄 root->directItem[0].size = ROOT_DISK_SIZE; //即一個根目錄項(xiàng)的空間

35、大小 196字節(jié) /*指向上一級目錄的目錄項(xiàng)-----回指指針*/ root->directItem[1].sign = 1; root->directItem[1].firstDisk = ROOT_DISK_NO; strcpy(root->directItem[1].name,".."); root->directItem[1].next = root->directItem[0].firstDisk; root->directItem[1].property = 1; root->directItem[1].size = ROOT_DISK_SIZE;

36、 for(i=2;idirectItem[i].sign = 0; root->directItem[i].firstDisk = -1; strcpy(root->directItem[i].name,""); root->directItem[i].next = -1; root->directI

37、tem[i].property = 0; root->directItem[i].size = 0; } if((fp = fopen("disk.bat","wb"))==NULL) { printf("Error:\n Cant Open The File \n"); return; } //虛擬到物理 if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) { printf("Error

38、:\n 文件寫入錯誤! \n"); } fclose(fp); } void enter() { FILE *fp; int i; //重新回到初始空間---虛擬中操作 fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //申請 1M空間 //判斷disk文件是否存在 if((fp=fopen("disk.bat","rb"))==NULL) { printf("Error:\n 打開文件出錯!\n"); return

39、; } if(!fread(fdisk,MEM_D_SIZE,1,fp)){ //把磁盤文件disk.dat 讀入虛擬磁盤空間(內(nèi)存) //回到新申請的fdisk中 printf("Error:\n 不能讀文件!\n"); exit(0); } fat = (struct FatItem *)(fdisk+DISKSIZE); roo

40、t = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); fclose(fp); //最多能打開5個文件 for(i=0;i

41、size = 0; } user_openTable.cur_size = 0; cur_dir = root; bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char)); strcpy(bufferdir,"Root:"); } int create(char *name) { int i,j; //文件名超過8字符 if(st

42、rlen(name)>8) //文件名大于 8位 return(NAME_LONG); //重名check for(j=2;jdirectItem[j].name,name) && cur_dir->directItem[j].property==0) break;

43、 } //如果沒循環(huán)完,則是因?yàn)槲募汛嬖? if(jdirectItem[i].firstDisk==-1) //找到?jīng)]有用到的 break; } if(i

44、>=MSD+2) //無空目錄項(xiàng) return(-2); for(j=ROOT_DISK_NO+1;j

45、 //確實(shí)如此 if(j>=DISK_NUM) return(DISK_FULL); fat[j].em_disk = 1; //將空閑塊置為已經(jīng)分配 //填寫目錄項(xiàng) strcpy(cur_dir->directItem[i].name,name); cur_dir->directItem[i].firstDisk = j; cur_dir->directItem[i].size = 0;

46、 cur_dir->directItem[i].next = j; cur_dir->directItem[i].property = 0; return 0; } int open(char *name) { int i, j; for(i=2;idirectItem[i].name,name)) break; }

47、if(i>=MSD+2) return(NOT_EXSIT); //查找一個空閑用戶打開表項(xiàng) for(j=0;j

48、->directItem[i].firstDisk; //cur_dir 最多5個 strcpy(user_openTable.openitem[j].name,name); user_openTable.openitem[j].size = cur_dir->directItem[i].size; user_openTable.openitem[j].open_flag = 1; user_openTable.cur_size++; //返回用戶打開表表項(xiàng)的序號 return(j); } int close(char *name) {

49、 int i; for(i=0;i=MOFN) return(6); //清空該文件的用戶打開表項(xiàng) strcpy(user_openTable.openitem[i].name,""); user_openTable.openitem[i].firstdisk = -1; user

50、_openTable.openitem[i].size = 0; user_openTable.openitem[i].open_flag = 0; user_openTable.cur_size--; return 0; } int write(int fd, char *buf, int len,char *name) { char *first; int remain; int item, i, j, k; int ilen1, ilen2, modlen, temp; //讀取用戶打開表對應(yīng)表項(xiàng)第一個盤塊號 item

51、 = user_openTable.openitem[fd].firstdisk; //找到當(dāng)前目錄所對應(yīng)表項(xiàng)的序號 for(i=2;idirectItem[i].firstDisk==item) break; } temp = i; //存放當(dāng)前目錄項(xiàng)的下標(biāo) while(fat[item].item!=-1) { item = fat[item].item; /*-查找該文件的下一盤塊--*/ } //計(jì)算文件地址 first = fdisk+item*DIS

52、KSIZE+user_openTable.openitem[fd].size%DISKSIZE; remain = DISKSIZE-user_openTable.openitem[fd].size%DISKSIZE; //如果最后磁盤塊剩余的大小大于要寫入的文件的大小 if(remain > len) { strcpy(first,buf); user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len; cur_dir->directItem[temp].size =

53、 cur_dir->directItem[temp].size+len; } else { for(i=0; i0) ilen2 = i

54、len2+1; /*--還需要多少塊磁盤塊-*/ for(j=0;j=DISK_NUM) //如果磁盤塊已經(jīng)分配完了 return(DISK_FULL); first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁盤塊的起始地址-*/ if(j==ilen2-1) /*--如果是

55、最后要分配的一塊-*/ { for(k=0;k

56、的磁盤的空閑標(biāo)志位為已分配-*/ fat[i].item = -1; //它的指針為 -1 (即沒有下一塊)-*/ } //修改長度 user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len; cur_dir->directItem[temp].size = cur_dir->directItem[temp].size+len; printf("%d\n",cur_dir->directItem[temp].size ); } retur

57、n 0; } int read(int fd, char *buf,char *name) { int len = user_openTable.openitem[fd].size; char *first; int i, j, item; int ilen1, modlen; item = user_openTable.openitem[fd].firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*--計(jì)算文件所占磁盤

58、的塊數(shù)-*/ for(i=0;i

59、 item = fat[item].item; /*-查找下一盤塊-*/ first = fdisk+item*DISKSIZE; } } return 0; } int rename() { int i; char strrename[8]; char strnewname[8]; printf("請輸入要重命名的文件"); scanf("%s",&strrename); // printf("%s",strrename); for(i=2;i

60、 //文件是否存在,以文件名為標(biāo)準(zhǔn) { if(!strcmp(cur_dir->directItem[i].name,strrename)) { break; } } if(i>=MSD+2) return(NOT_EXSIT); printf("請輸入新的命名(最大文件名長度為8)"); scanf("%s",&strnewname); // cur_dir->directItem[i].name=strnewname;

61、strcpy(cur_dir->directItem[i].name,strnewname); return 0; } int del(char *name) { int i,cur_item,item,temp; for(i=2;idirectItem[i].name,name) && cur_dir->directItem[i].property == 0) cur_item = i; // pr

62、intf("--%d--",i); break; } if(i>=MSD+2) //--如果不在當(dāng)前目錄中 return(NOT_EXIT); for(i=0;idirectItem[cur_item].firstDisk;/*--該文件的起始盤塊號-*/

63、while(item!=-1) /*--釋放空間,將FAT表對應(yīng)項(xiàng)進(jìn)行修改-*/ { temp = fat[item].item; fat[item].item = -1; fat[item].em_disk =0; item = temp; } //釋放目錄項(xiàng) cur_dir->directItem[cur_item].sign = 0; cur_dir->directItem[cur_item].firstDisk = -1; strcpy(cur_dir->directItem[cur_item].name,""); cur_dir->

64、directItem[cur_item].next = -1; cur_dir->directItem[cur_item].property = 0; cur_dir->directItem[cur_item].size = 0; return 0; } void dir() { int i,count=0; printf("\t文件名\t | \t文件大小\t\n"); for(i=2;idirectItem[i].firstDisk!=-1) /*-如果存在子目錄-*/ {

65、 count++; if(cur_dir->directItem[i].property==0) /*-文件-*/ { printf("\t%s\t | \t %d\t \n",cur_dir->directItem[i].name,cur_dir->directItem[i].size); } else { printf("\t目錄名:"); printf("%s\t",cur_dir->directItem[i].name); } } } if(count==0){ printf("不存在

66、子目錄\n"); } } void currentPath() {printf("%s/>",bufferdir);} void helpMenu() { printf("**********二級文件管理系統(tǒng)**********\n"); printf(" quit quit the file system \n"); printf(" create create a new file\n"); printf(" delete delete a file\n"); printf(" open open a file\n"); printf(" close close an openned file\n"); printf(" write write to a file\n"); printf(" read

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

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(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ù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲